假设我要进行以下比较:
Object([]) === []; //false, as expected.
如果现在我将一个空数组分配给变量,那么我们现在有:
const myArr = [];
Object(myArr) === myArr; //true
为什么会发生?
答案 0 :(得分:0)
因为[] === []
是false
。
===
比较参考。每次执行[]
时,都会在内存中创建一个新对象,并且它们自然具有不同的引用。因此===
会给您错误的提示。
Object(Array)
为您提供了相同的对象。因此,当您执行Object([])
时,您将获得相同的对象,但是它与上的对象没有相同的引用。右边。当您执行Object(myArr) === myArr
时,两个操作数具有相同的引用,因此其求值为true
。
答案 1 :(得分:0)
Javascript中的数组是Object的实例:
> [] instanceof Object
true
对象又是引用类型。因此,无论何时比较两个对象,它们都是通过引用而不是值进行比较。因此,使用任何数组(或另一个对象)作为第一个参数调用Object
都会将后者转换为对自身的引用,因此为true。
与普通对象或任何其他对象相同:
> const object = {};
undefined
> Object(object) === object;
true
> const array = [];
undefined
> Object(array) === array;
true
> const map = new Map()
undefined
> Object(map) === map;
true
> const set = new Set();
undefined
> Object(set) === set;
true
您还可以使用字符串和数字来完成此技巧:
> const string = new String('abc')
undefined
> string instanceof Object;
true
> Object(string) === string;
true
> const number = new Number(123);
undefined
> Object(number) === number;
true
这当然不适用于原始字符串和数字类型,因为它们不是Object的实例:
> const primitiveNumber = 123;
undefined
> primitiveNumber instanceof Object;
false
> primitiveNumber instanceof Number;
false
> Object(primitiveNumber) === primitiveNumber;
false
答案 2 :(得分:0)
这是因为在第一行中,您正在比较两个不同的事物,因为您创建了两个空数组。因此,由于它们不同,因此返回false
:
Object([]) === [];
但是,在您的其他代码行中;
const myArr = [];
Object(myArr) === myArr;
您正在将某事物与自身进行比较,该事物的总值为true
(NaN
除外)。
答案 3 :(得分:0)
===
检查两个对象是否引用相同的事物。即是指相同的存储位置。当您执行Object([]) === [];
时,JS运行时将为左侧的[]
创建2个不同的存储位置,为右侧的[]
创建2个不同的存储位置。因此它们是不平等的。
在第二种情况下,R.H.S和L.H.S myArr
指的是相同的存储位置。并且,当您使用myArr Object(myArr)
调用对象构造函数时,它什么也不做,构造函数为空。对象引用仍然不变,因此相等。