为什么实例对于某些文本返回 false?

2022-08-29 23:57:45
"foo" instanceof String //=> false
"foo" instanceof Object //=> false

true instanceof Boolean //=> false
true instanceof Object //=> false
false instanceof Boolean //=> false
false instanceof Object //=> false

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

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

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

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

为什么不全部呢?或者,为什么不把它们都不行呢
那么,它们是什么实例呢?

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


答案 1

基元是一种与从 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都会做另一件事。


答案 2

我使用:

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

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