在JavaScript中,除基元(布尔值,null,数字,字符串和值undefined
(以及ES6中的符号))外,所有内容都是一个对象(或至少可以视为对象):
console.log(typeof true); // boolean
console.log(typeof 0); // number
console.log(typeof ""); // string
console.log(typeof undefined); // undefined
console.log(typeof null); // object
console.log(typeof []); // object
console.log(typeof {}); // object
console.log(typeof function () {}); // function
如您所见,对象,数组和值null
都被视为对象(null
是对不存在的对象的引用)。函数之所以与众不同,是因为它们是可调用对象的一种特殊类型。但是它们仍然是对象。
在另一方面,文字true
,0
,""
而undefined
不是对象。它们是JavaScript中的原始值。但是,布尔值,数字和字符串也具有构造函数Boolean
,Number
并且String
分别包装它们各自的基元以提供附加功能:
console.log(typeof new Boolean(true)); // object
console.log(typeof new Number(0)); // object
console.log(typeof new String("")); // object
正如你可以看到当原始值内的包裹Boolean
,Number
和String
建设者,他们分别成为目标。该instanceof
操作仅适用于对象(这就是为什么它返回false
的原始值):
console.log(true instanceof Boolean); // false
console.log(0 instanceof Number); // false
console.log("" instanceof String); // false
console.log(new Boolean(true) instanceof Boolean); // true
console.log(new Number(0) instanceof Number); // true
console.log(new String("") instanceof String); // true
正如你可以同时看到typeof
并instanceof
不足以测试值是否是一个布尔值,数字或字符串- typeof
仅适用于原始布尔,数字和字符串; 并instanceof
没有为原始布尔,数字和字符串工作。
幸运的是,有一个解决此问题的简单方法。的默认实现toString
(即,在上本地定义Object.prototype.toString
)返回[[Class]]
原始值和对象的内部属性:
function classOf(value) {
return Object.prototype.toString.call(value);
}
console.log(classOf(true)); // [object Boolean]
console.log(classOf(0)); // [object Number]
console.log(classOf("")); // [object String]
console.log(classOf(new Boolean(true))); // [object Boolean]
console.log(classOf(new Number(0))); // [object Number]
console.log(classOf(new String(""))); // [object String]
[[Class]]
值的内部属性比值有用得多typeof
。我们可以使用以下方法Object.prototype.toString
来创建自己的(更有用的)typeof
运算符版本:
function typeOf(value) {
return Object.prototype.toString.call(value).slice(8, -1);
}
console.log(typeOf(true)); // Boolean
console.log(typeOf(0)); // Number
console.log(typeOf("")); // String
console.log(typeOf(new Boolean(true))); // Boolean
console.log(typeOf(new Number(0))); // Number
console.log(typeOf(new String(""))); // String
希望本文对您有所帮助。要了解有关基元和包装对象之间差异的更多信息,请阅读以下博客文章:JavaScript基元的秘密生活