在javascript中,三等号对于数组返回false.为什么?

Om3*_*3ga 15 javascript

我知道这===通常被称为身份运营商.被比较的值必须具有相同的类型和值才能被视为相等.那么为什么下面的行返回false?

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

Eli*_*Eli 32

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

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

a === b // false
Run Code Online (Sandbox Code Playgroud)

当您创建新对象,数组,函数等时,会将一个全新的对象放入内存中.使用与另一个对象相同的内部构造创建一个新对象不会神奇地导致该对象指向已存在的对象.对象可能看起来相同,但它们不指向同一个实例.现在,如果您的陈述是这样的话:

var arr = ['asdf'];

arr === arr; // true
Run Code Online (Sandbox Code Playgroud)

这显然是真的.===是严格的平等,而不是身份运营商.当对象通过严格相等运算符运行时,将检查它们是否指向相同的引用.正如我之前解释的那样,每次使用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
Run Code Online (Sandbox Code Playgroud)

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

ford === toyota // true
Run Code Online (Sandbox Code Playgroud)

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

  • 是的,但我们都知道Fords不能是Chevys :) (2认同)

jcr*_*898 5

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

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

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

x === y; //false  
Run Code Online (Sandbox Code Playgroud)

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