对象构造函数参数:现有Array变量vs []文字

时间:2019-01-17 21:31:25

标签: javascript

假设我要进行以下比较:

Object([]) === []; //false, as expected.

如果现在我将一个空数组分配给变量,那么我们现在有:

const myArr = [];
Object(myArr) === myArr; //true

为什么会发生?

4 个答案:

答案 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;

您正在将某事物与自身进行比较,该事物的总值为trueNaN除外)。

答案 3 :(得分:0)

===检查两个对象是否引用相同的事物。即是指相同的存储位置。当您执行Object([]) === [];时,JS运行时将为左侧的[]创建2个不同的存储位置,为右侧的[]创建2个不同的存储位置。因此它们是不平等的。

在第二种情况下,R.H.S和L.H.S myArr指的是相同的存储位置。并且,当您使用myArr Object(myArr)调用对象构造函数时,它什么也不做,构造函数为空。对象引用仍然不变,因此相等。