我知道===
通常被称为身份运营商。被比较的值必须具有相同的类型和值才能被视为相等。那么为什么下面的行会返回false?
Array("asdf") === Array("asdf")
答案 0 :(得分:31)
它们不相等,因为在每个语句中都创建了一个新数组,每个数组都是一个具有相同内容的全新数组对象。如果您创建两个新对象:
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
引用。
答案 1 :(得分:5)
首先===是严格相等,而不是身份运算符,而数组和对象是引用对象,而不是像数字和字符串那样的值对象......
因此,当您比较这两个数组时,您将在内存中创建两个不同的数组。这跟说......是一样的。
var x = { a: 1 };
var y = { a: 1 };
x === y; //false
您不能直接比较那样的数组或对象。
答案 2 :(得分: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;
所以基本上你需要定义自己的方法来比较数组并查看所有元素是否相同。这种功能通常不存在,因为它可能非常昂贵,并且通常有另一种方式来编写这类东西。
答案 3 :(得分:0)
虽然array1==array2
似乎不起作用(对象标识相等),
最简单的选项,几乎适用于所有情况,但null!==undefined
除外,但它们都被转换为null并被视为相等:
function arraysEqual(a1,a2) {
return JSON.stringify(a1)==JSON.stringify(a2);
}