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

instanceof contradicts the object type returned by typeof method

本文关键字:对象 类型 矛盾 返回 typeof 方法 Instanceof      更新时间:2023-09-26

这里我有一个包含6个元素的number数组。

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>

typeof表示我用来包含数组值的变量是一个数字,但是instance of表示它不是一个数字。那么哪个是正确的呢?

。: -)

JavaScript有原语对象版本的数字、字符串和布尔值。typeof表示,对于原始数,"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

…但是,这是非常非常罕见的事情

instanceof()更适合在需要检查该变量是否是someClass的实例时使用。

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

另外,请阅读instanceof的工作原理和typeof的工作原理。

UPD:我可爱的例子来区分它们:

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