Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/389.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
对于javascript中的数组,三等号返回false。为什么?_Javascript - Fatal编程技术网

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

对于javascript中的数组,三等号返回false。为什么?,javascript,Javascript,我知道==通常被称为标识操作符。被比较的值必须是相同的类型,并且被认为是相等的值。那么为什么下面的行返回false呢 Array(“asdf”)===Array(“asdf”)它们不相等,因为在这些语句中的每个语句中都创建了一个新数组,每个都是一个全新的数组对象,具有完全相同的内容。如果创建两个新对象: var a = {}; var b = {}; a === b // false 创建新对象、数组、函数等时,会将一个全新的对象放入内存中。创建一个与另一个对象具有相同内部结构的新对象不会神

我知道
==
通常被称为标识操作符。被比较的值必须是相同的类型,并且被认为是相等的值。那么为什么下面的行返回false呢


Array(“asdf”)===Array(“asdf”)

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

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

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

var arr = ['asdf'];

arr === arr; // true
这显然是事实
=
是严格相等的,不是标识运算符。当对象通过严格相等运算符运行时,将检查它们是否指向同一引用。如前所述,每次使用
新数组
[]
时,都会创建一个全新的对象,每个对象都是一个新的、不同的引用。因此,除非两个数组指向完全相同的数组,否则两个数组或任何对象都不可能是真的。创建两个内容相同的对象并不意味着它们指向同一个对象,只是两个相同但不同的对象

考虑构建函数:

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

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

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;

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

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

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

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

x === y; //false  

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

array1==array2
似乎不起作用(对象标识相等)

最简单的选项,几乎适用于所有情况,除了
null==未定义
,但它们都可以转换为null并被视为相等:

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

作为旁注,通常的解决方法是
JSON.stringify(array1)==JSON.stringify(array2)@adeneo Nice,从没想过。作为对任何人的提醒——这不一定适用于对象文本……我理解这不是问题的重点,我只想说:)@adeneo实际上,它也不适用于包含对象的数组。当然是简单的数组!同样,这变得越来越复杂,但仍然需要思考about@Ian-它不适用于所有对象,但适用于“几乎”所有数组,只要两个数组中的顺序相同,因为这不仅仅是比较值,而且顺序也是正确的。当然还有空值!=未定义的问题,但遇到该问题的可能性很小。是的,我不会使用JSON.stringify进行比较,因为对象、函数等的数组,排序很重要。不好玩。你是对的,这对非原语不重要,但你可能总是想使用
==
,因为被比较的项目类型不保证/不知道是数组。不太重要,只是要记住,在这种情况下,如果类型不匹配,它甚至不需要尝试比较值。我不知道,我想我现在把他们弄糊涂了,我一直在想…是的,但我们都知道福特不可能是雪佛兰:)