内容:
1.typeof
2.值类型和引用类型
3.强制类型转换
typeof
官方文档:typeof
1.作用:
操作符返回一个字符串,指示未经计算的操作数的类型。
2.语法:
typeof operand
参数:operand
是一个表达式,表示对象或原始值,其类型将被返回。
3.返回值:
类型 | 结果 |
---|---|
Undefined | "undefined" |
Null | "object" (见下文) |
Boolean | "boolean" |
Number | "number" |
String | "string" |
Symbol (ECMAScript 6 新增) | "symbol" |
宿主对象(由JS环境提供) | Implementation-dependent |
函数对象([[Call]] 在ECMA-262条款中实现了) | "function" |
任何其他对象 | "object" |
4.示例:
1 <!DOCTYPE html> 2 <html> 3 4 <head> 5 <meta charset="utf-8"> 6 <title>typeof返回值有哪些类型</title> 7 <script type="text/javascript"> 8 // Numbers 9 console.log(typeof 37); //number 10 console.log(typeof Math.LN2); //number 11 console.log(typeof NaN); // number 尽管NaN是"Not-A-Number"的缩写 12 // Strings 13 console.log(typeof "bla"); // string 14 console.log(typeof ""); // string 15 console.log(typeof(typeof 1)); // string typeof总是返回一个字符串 16 // Booleans 17 console.log(typeof true); //boolean 18 // // Symbols 19 console.log(typeof Symbol()); //symbol 20 console.log(typeof Symbol(‘foo‘)); //symbol 21 // Undefined 22 console.log(typeof undefined); //undefined 23 // Objects 24 console.log(typeof { a: 1 }); //object 25 console.log(typeof null); //object 从一开始出现JavaScript就是这样的 26 // 使用Array.isArray 或者 Object.prototype.toString.call 27 // 区分数组,普通对象 28 console.log(typeof [1, 2, 4]); //object 29 console.log(typeof new Date()); //object 30 // 下面的容易令人迷惑,不要使用! 31 console.log(typeof new Boolean(true)); //object 32 console.log(typeof new Number(1)); //object 33 console.log(typeof new String("abc")); //object 34 // 函数 35 console.log(typeof function() {}); //function 36 console.log(typeof class C {}); //function 37 console.log(typeof new Function()); //function 38 </script> 39 </head> 40 41 <body> 42 </body> 43 44 </html>
从上面的示例得出:
js中使用typeof能得到的类型有:undefined、string、number、boolean、object、function。
typeof只能区分值类型的详细类型,而对于引用类型就不行了。
看完typeof我们顺便来聊聊值类型和引用类型:
数据类型 | 值/引用类型 |
---|---|
undefined | 基本类型 |
null | 基本类型 |
number | 基本类型 |
boolean | 基本类型 |
string | 基本类型 |
function | 引用类型 |
object | 引用类型 |
1.示例:
var a=1,b=a; a=2; console.log(‘a:‘+a);//a:2 console.log(‘b:‘+b);//b:1 //上面,b获取值是a值的一份拷贝,虽然,两个变量的值是相等,但是两个变量保存两不同的基本数据类型值。b只是保存了a复制的一个副本。所以,当a的值改变时,b的值依然是1; var a={‘age‘:20},b=a; a.age=22; console.log(‘a:‘+JSON.stringify(a));//a:{"age":22} console.log(‘b:‘+JSON.stringify(b));//b:{"age":22} b.age=11; console.log(‘a:‘+JSON.stringify(a));//a:{"age":11} console.log(‘b:‘+JSON.stringify(b));//b:{"age":11} // 我们声明了一个引用数据类型变量a,并把它赋值给了另外一个引用数据类型变量b。当我们任意改变a、b其中一个的age属性值时,a、b的age属性都会发生变化。说明这两个引用数据类型变量指向同一个堆内存对象。a赋值给b,实际只是把这个堆内存对象在栈内存的引用地址复制了一份给了b,但它们本质上共同指向了同一个堆内存对象。
顺带说说强制类型转换
1.字符串拼接
var a=100+10; console.log(a); //110 var b=100+‘10‘; console.log(b);//10010
2.==运算符
console.log(100==‘100‘);//true console.log(0==‘‘);//true console.log(null==undefined);//true
3.if语句
var c=true; if(c){ console.log(‘is true‘);//执行 }else { console.log(‘is false‘); } var d=100; if(d){ console.log(‘is true‘);//执行 }else { console.log(‘is false‘); } var d=‘‘; if(d){ console.log(‘is true‘); }else { console.log(‘is false‘);//执行 }
4.逻辑运算
console.log(10&&0);//0 console.log(‘‘||‘ab‘);//‘ab‘ console.log(!window.abc);//true window.abc undefined 取反则为true //判断一个变量是 true还是false可以给其前面加 !! var a=100; console.log(!!a);//true
以下内容来此:ECMAScript 类型转换
5.Boolean() 函数
当要转换的值是至少有一个字符的字符串、非 0 数字或对象时,Boolean() 函数将返回 true。如果该值是空字符串、数字 0、undefined 或 null,它将返回 false。
var b1 = Boolean(""); //false - 空字符串 var b2 = Boolean("hello"); //true - 非空字符串 var b1 = Boolean(50); //true - 非零数字 var b1 = Boolean(null); //false - null var b1 = Boolean(0); //false - 零 var b1 = Boolean(new object()); //true - 对象
6.Number() 函数
Number() 函数的强制类型转换与 parseInt() 和 parseFloat() 方法的处理方式相似,只是它转换的是整个值,而不是部分值。
还记得吗,parseInt() 和 parseFloat() 方法只转换第一个无效字符之前的字符串,因此 "1.2.3" 将分别被转换为 "1" 和 "1.2"。
用 Number() 进行强制类型转换,"1.2.3" 将返回 NaN,因为整个字符串值不能转换成数字。如果字符串值能被完整地转换,Number() 将判断是调用 parseInt() 方法还是 parseFloat() 方法。
下表说明了对不同的值调用 Number() 方法会发生的情况:
用法 | 结果 |
---|---|
Number(false) | 0 |
Number(true) | 1 |
Number(undefined) | NaN |
Number(null) | 0 |
Number("1.2") | 1.2 |
Number("12") | 12 |
Number("1.2.3") | NaN |
Number(new object()) | NaN |
Number(50) | 50 |
7.String() 函数
最后一种强制类型转换方法 String() 是最简单的,因为它可把任何值转换成字符串。
要执行这种强制类型转换,只需要调用作为参数传递进来的值的 toString() 方法,即把 12 转换成 "12",把 true 转换成 "true",把 false 转换成 "false",以此类推。
强制转换成字符串和调用 toString() 方法的唯一不同之处在于,对 null 和 undefined 值强制类型转换可以生成字符串而不引发错误:
var s1 = String(null); //"null" var oNull = null; var s2 = oNull.toString(); //会引发错误