在 JavaScript 中,三个等号对于数组返回 false。为什么?

问题描述 投票:0回答:5

我知道

===
通常被称为恒等运算符。被比较的值必须具有相同的类型和值才能被视为相等。那么为什么下面的行返回 false?

Array("asdf") === Array("asdf")

javascript
5个回答
40
投票

它们不相等,因为在每个语句中都创建了一个新数组,每个都是一个具有相同内容的全新数组对象。如果您创建两个新对象:

var a = {};
var b = {};

a === b // false

当创建新的对象、数组、函数等时,一个全新的对象会被放入内存中。创建一个与另一个对象具有相同内部结构的新对象不会神奇地导致该对象指向已经存在的对象。这些对象可能看起来相同,但它们并不指向同一个实例。现在,如果你的陈述是这样的:

var arr = ['asdf'];

arr === arr; // true

这显然是真的。

===
是严格相等,而不是恒等运算符。当对象通过严格相等运算符运行时,将检查它们是否指向相同的引用。正如我之前所解释的,每次使用
new Array
[]
时,都会创建一个全新的对象,每个对象都是一个新的不同引用。因此,两个数组或任何对象都不可能输出
===
为真,除非它们指向完全相同的数组。仅仅因为创建的两个对象具有相同的内容并不意味着它们指向同一个对象,而只是两个相同但不同的对象。

考虑构造函数:

var Car = function (color) {
    this.color = color;
};

var ford = new Car('green');
var chevy = new Car('green');
var toyota = ford;

ford === chevy // false

仅仅因为您使用相同的构造函数并不意味着每次调用它时都会返回相同的对象。相反,每次都会返回一个新对象。仅仅因为两辆车都是绿色的并不意味着它们是同一辆车。

ford === toyota // true

现在这是正确的,因为两个变量都指向完全相同的

Car
引用。


5
投票

首先 === 是严格相等,而不是恒等运算符,而数组就像对象一样是引用对象,而不是数字和字符串中的值对象...

因此,当您比较这两个数组时,您正在内存中创建两个不同的数组。这就像说一样...

var x = { a: 1 }; 
var y = { a: 1 };

x === y; //false  

你不能直接比较数组或对象。


3
投票

因为如果它不是基本类型(String、Number、Boolean),如果它是数组或对象,那么比较运算符将检查它是否是完全相同的实例。所以

var a = ['as','ds'];
var b = a;
var c = ['as','ds'];
b == a; //will return true; (doesn't matter if it's == or === for non primitive types)
b == c; //will return false;

所以基本上你需要定义自己的方法来比较数组并查看所有元素是否相同。这种函数通常不存在,因为它可能非常昂贵,并且通常有另一种方法来编写此类功能。


0
投票

虽然

array1==array2
似乎不起作用(对象身份平等),

最简单的选项,几乎适用于所有情况,除了

null!==undefined
,但它们都被转换为 null 并被视为相等:

function arraysEqual(a1,a2) {
    return JSON.stringify(a1)==JSON.stringify(a2);
}

0
投票

JS 没有提供内置的数组结构相等比较方法。

在 JavaScript 中,

===
运算符在比较数组时检查引用标识,而不是其结构内容。这意味着即使两个数组包含相同的元素,它们也不相等,除非它们引用内存中完全相同的对象。 考虑
var x = [ 1, 2, 3 ];
var y = x;
,这里,赋值是通过引用复制进行的,因此
y
same 数组引用为
x
,而不是
x
的另一个副本。这就是为什么
y === x;
的计算结果为
true
,但
y === [ 1, 2, 3 ];
x === [ 1, 2, 3 ];
都得出
false
,因为
y
x
分别与新的不同数组
[1,2,3]
进行比较。在此比较中,数组结构和内容并不重要,只重要 参考身份。

© www.soinside.com 2019 - 2024. All rights reserved.