为什么instanceof会为某些文字返回false?

"foo" instanceof String //=> false
"foo" instanceof Object //=> false
true instanceof Boolean //=> false
true instanceof Object //=> false
false instanceof Boolean //=> false
false instanceof Object //=> false

// the tests against Object really don't make sense

数组文字和对象文字匹配...

[0,1] instanceof Array //=> true
{0:1} instanceof Object //=> true

为什么不全部? 或者,他们为什么不全都不?
那么,它们是什么呢?

在FF3,IE7,Opera和Chrome中也是如此。 所以,至少它是一致的。


错过了一些。

12.21 instanceof Number //=> false
/foo/ instanceof RegExp //=> true

基元是与从Javascript内部创建的对象不同的类型。 从Mozilla API文档:

var color1 = new String("green");
color1 instanceof String; // returns true
var color2 = "coral";
color2 instanceof String; // returns false (color2 is not a String object)

我找不到用代码构建原始类型的任何方式,也许这是不可能的。 这可能是为什么人们使用typeof "foo" === "string"而不是instanceof

一个简单的方法来记住这样的事情是问自己:“我想知道什么是理智和容易学习”? 无论答案如何,Javascript都会做另一件事。


我用:

function isString(s) {
    return typeof(s) === 'string' || s instanceof String;
}

因为在JavaScript中,字符串可以是文字或对象。


在JavaScript中,除了基本类型(布尔值,空值,数字,字符串和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是对不存在的对象的引用)。 函数的区别是因为它们是一种特殊类型的可调用对象。 但他们仍然是对象。

另一方面,文字为true0""undefined不是对象。 它们是JavaScript中的原始值。 但是,布尔值,数字和字符串也分别具有构造函数BooleanNumberString ,它们分别包装它们各自的基元以提供附加功能:

console.log(typeof new Boolean(true)); // object
console.log(typeof new Number(0));     // object
console.log(typeof new String(""));    // object

正如你可以看到当原始值的内包装BooleanNumberString构造它们分别成为目标。 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

正如你可以看到typeofinstanceof不足以测试一个值是一个布尔值,一个数字还是一个字符串 - 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基元的秘密生活

链接地址: http://www.djcxy.com/p/31709.html

上一篇: Why does instanceof return false for some literals?

下一篇: typeof is an operator and a function