在Javascript中,为什么[1,2] == [1,2]解析为false?

时间:2016-02-09 18:20:32

标签: javascript

我将(x,y)坐标存储为2元素数组。

var coordinateA = [0,3];
var coordinateB = [1,2];

我还有一个包含许多坐标的较长数组:

var coordinates = [coordinateA, coordinateB]

当以下陈述被证明是假的时候,想象一下我的意外:

jQuery.inArray(coordinateA, coordinates); // returns -1
coordinateA == coordinates[0];            // returns false
[0,3] == [0,3];                           // returns false(!)
coordinateA == coordinateA;               // returns true, thankfully

有人可以帮我理解为什么会这样吗?另外,有没有更好的方法来表示Javascript中的2D坐标?感谢任何线索或建议。

2 个答案:

答案 0 :(得分:4)

这是因为您有两个单独的数组引用

等于运算符正在检查引用是否相等,而不是数组的内容。

答案 1 :(得分:-1)

关于JavaScript的一个令人费解的事情是如何处理平等问题。我会尽力解释这一点。

平等规则很难掌握。一般来说,您可以通过相对相等(==)或严格相等(===)进行比较。

相对平等

仅按值进行比较,而不关心类型。

实施例

var x = '2';
var y = 2;
x == y;
=> false;

在相对相等性中,字符串"2"等于数字2.由于不比较类型,因此将返回true

严格平等

通过值和类型进行比较。

实施例

var x = '2';
var y = 2;
x === y;
=> false

在这种情况下,字符串"2"不等于数字2.因为字符串和数字是两种不同的类型。

虽然与数组和对象进行了不同的比较。

在您的情况下,数组被视为对象。

typeof([1,2])
=> "object"

在JavaScript中,所有对象都不同。它们通过对象ID进行比较。要确定数组是否相等,您必须对字符串执行type conversion

String([1,2]) == String([1,2])
=> true

但是,underscore库有is_equal方法可以确定两个数组是否相等

_.isEqual(array1, array2);

Underscore通过在两个对象之间执行deep comparison来确定它们是否应被视为相等。

重要的是要注意,顺序在这里很重要,就像在字符串比较中一样。

_isEqual([1,2], [1,2])
=> true

_isEqual([1,2], [2,1])
=> false