我将(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坐标?感谢任何线索或建议。
答案 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