instanceof与typeof方法返回的对象类型相矛盾

时间:2014-08-18 12:21:47

标签: javascript arrays

这里我有一个包含六个元素的数字数组。

var arr=[1.22,2.33,2.002,3.992,3.05,5.44];

然后我将每个元素存储在一个变量中并试图找出它是什么类型的对象。我尝试了typeof和instanceof .typeof说我用来包含数组值的变量是一个数字,但是说的是它不是一个数字。那么哪一个是正确的..

然后我更改了数组。使用了字符串值而不是数组中的数字..

var arr=["1.22","2.33","2.002","3.992","3.05","5.44"];

这里也是typeof声明值是数字类型而instanceof说相反。 所以我可以说使用 typeof 而不是 instanceof 是安全的。所以我的问题是何时使用typeof以及何时使用instanceof以及如何避免这种混淆??

代码:

<script>
    function init() {
        var arr = ["1.22", "2.33", "2.002", "3.992", "3.05", "5.44"];
        for (i = 0; i < arr.length; i++) {
            var bag = arr[i];
            alert(typeof bag == 'string');
            alert(bag instanceof String);
        }
    }
    window.onload = init;
</script>

2 个答案:

答案 0 :(得分:4)

  

typeof说我用来包含数组值的变量是一个数字,但是说它不是数字的实例。那么哪一个是正确的。

两者。 : - )

JavaScript包含数字,字符串和布尔值的原语对象版本。 typeof对{em>原始数字"number"说{不是对象,因此不是instanceof Number

var a = 5;
console.log(typeof a);            // "number"
console.log(a instanceof Number); // false

非常罕见 ,您可能希望显式创建并保留对数字,字符串的对象版本的引用,或布尔。

那么为什么我们拥有它们呢?所以我们似乎可以在原语上有方法。让我们再看一下上面的a变量,并在最后添加另一个语句:

var a = 5;
console.log(typeof a);            // "number"
console.log(a instanceof Number); // false
console.log(a.toFixed(3);         // "5.000"

咦? a指的是原始数字。基元没有方法。那么我怎么能调用toFixed方法?

答案是JavaScript引擎暂时将原语提升为等效对象类型,使用该对象类型的方法,并抛弃该对象。 (理论上;当然,在实践中,引擎会优化流程。)

可以实际创建Number个实例:

var a = new Number(5);
console.log(typeof a);            // "object"
console.log(a instanceof Number); // true

......但同样,这是一件非常非常罕见的事情。

答案 1 :(得分:1)

当您想要检查该变量是否为instanceof()的实例时,

someClass更好用。

当你想获得变量类型时,最好使用typeof(),而不是检查这个实例是从哪个类创建的。

另外,请阅读instanceof的工作原理here以及here的工作方式。

UPD :我可爱的例子:

var array = [];
typeof array == 'array'; // false
typeof array == 'object'; // true
array instanceof Object; // true
array instanceof Array; // true