三重等号在 javascript 中为数组返回 false。为什么?

IT技术 javascript
2021-03-01 01:37:27

我知道这===通常称为身份运算符。被比较的值必须是相同的类型并且值被认为是相等的。那么为什么下面的行返回false?

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

4个回答

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

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引用。

是的,但我们都知道福特不能是雪佛兰:)
2021-04-15 01:37:27

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

因此,当您比较这两个数组时,您是在内存中创建两个不同的数组。就等于说...

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

x === y; //false  

您不能像这样直接比较数组或对象。

因为如果它不是原始类型(字符串、数字、布尔值),如果它是数组或对象,那么比较运算符将检查它是否是完全相同的实例。所以

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;

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

在这种情况下,如果类型不匹配,它甚至不会尝试比较值。我不知道,我想我现在把他们弄糊涂了,我一直试图重新考虑......
2021-04-18 01:37:27
你是对的,它对非原始无关紧要,但你可能总是想使用===被比较的项目的类型不能保证/已知为数组的可能性。不是太重要,只是要记住的东西
2021-04-29 01:37:27

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

最简单的选项,几乎适用于所有情况,null!==undefined但它们都被转换为 null 并被视为相等:

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