再JS世界里,一切皆对象。
为了区分对象的类型,JS中使用typeof
操作符来获取对象类型,且返回字符串:
typeof 123; // 'number'
typeof NaN; // 'number'
typeof 'str'; // 'string'
typeof true; // 'boolean'
typeof undefined; // 'undefined'
typeof Math.abs; // 'function'
typeof null; // 'object'
typeof []; // 'object'
typeof {}; // 'object'
注意:1. 对于Number
类型和NaN
用typeof
无法区分,可以使用isNan()
来区分NaN
;2. 对于null
、Array
和对象{}
无法区分。
包装对象
2.1 number
、boolean
和string
都有包装对象。包装对象用new创建:
//虽然包装对象看上去和原来的值一模一样,显示出来也是一模一样,但他们的类型已经变为object了!
var n = new Number(123); // 123,生成了新的包装类型
var b = new Boolean(true); // true,生成了新的包装类型
var s = new String('str'); // 'str',生成了新的包装类型
//包装对象和原始值用===比较会返回false
typeof new Number(123); // 'object'
new Number(123) === 123; // false
typeof new Boolean(true); // 'object'
new Boolean(true) === true; // false
typeof new String('str'); // 'object'
new String('str') === 'str'; // false
注意:尽量不要使用包装对象,尤其是针对string
类型
2.2 如果我们在使用Number
、Boolean
和String
时,没有写new会发生什么情况?
此时,Number()、Boolean和String()被当做普通函数,把任何类型的数据转换为number、boolean和string类型(注意不再是包装类型):
var n = Number('123'); // 123,相当于parseInt()或parseFloat()
typeof n; // 'number'
var b = Boolean('true'); // true
typeof b; // 'boolean'
var b2 = Boolean('false'); // true! 'false'字符串转换结果为true!因为它是非空字符串!
var b3 = Boolean(''); // false
var s = String(123.45); // '123.45'
typeof s; // 'string'
总结,需要遵守的规则:
- 不要使用
new Number()
、new Boolean()
、new String()
创建包装对象; - 用
parseInt()
或parseFloat()
来转换任意类型到number - 用
String()
来转换任意类型到string,或者直接调用某个对象的toString()
方法 - 通常不必把任意类型转换为
boolean
再判断,因为可以直接写if (myVar) {...}
typeof
操作符可以判断出number
、boolean
、string
、function
和undefined
- 判断
Array
要使用Array.isArray(arr)
; - 判断
null
请使用myVar === null
; - 判断某个全局变量是否存在用
typeof window.myVar === 'undefined'
; - 函数内部判断某个变量是否存在用
typeof myVar === 'undefined'
。
任何对象都有toString()
方法吗?null
和undefined
就没有!确实如此,这两个特殊值要除外,虽然null
还伪装成了object
类型
number
对象直接调用toString()
函数报错:
123.toString(); // SyntaxError
//需要特殊处理:
123..toString(); // '123', 注意是两个点!
(123).toString(); // '123'
//jS碰见的第一个点会认为是小数点
3.14.toString();//"3.14"
3.14..toString();//SyntaxError