18

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

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

4

4 回答 4

38

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

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

于 2012-12-07T04:56:28.127 回答
5

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

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

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

x === y; //false  

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

于 2012-12-07T05:01:55.897 回答
3

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

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;

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

于 2012-12-07T04:57:48.443 回答
0

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

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

function arraysEqual(a1,a2) {
    return JSON.stringify(a1)==JSON.stringify(a2);
}
于 2012-12-07T05:02:14.390 回答