【问题标题】:In Javascript, why does [1,2] == [1,2] resolve to false? [duplicate]在 Javascript 中,为什么 [1,2] == [1,2] 解析为 false? [复制]
【发布时间】:2016-05-19 20:51:23
【问题描述】:

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

【问题讨论】:

  • 查看this question 了解替代方案
  • 比较两个对象判断是否是同一个对象,不比较内容。
  • 其实,如果按照您描述的方式设置坐标数组,它应该可以按预期工作(coordinates[0]coordinateA 处的元素 应该 指向相同的记忆)。我感觉问题出在其他地方,或者取决于浏览器(刚刚确认它在 chrome 中按预期工作)
  • 将 JS 中的引用视为指针。如果你有 2 个char* a, *b,你会将其内容与a == b 进行比较吗?

标签: javascript


【解决方案1】:

这是因为你有两个独立的数组references

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

【讨论】:

  • 这也适用于空数组。以防万一有人想知道。
【解决方案2】:

关于 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);

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

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

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

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

【讨论】:

  • “相对相等 - 仅按值比较,不关心类型。” 这不是真的。 ===== 都非常关心类型,实际上== 更关心。当类型匹配时,===== 是相同的,但是当它们不匹配时,== 会做进一步的类型分析,看是否可以将操作数转换为匹配类型,并递归进入算法直到找到匹配的类型并比较值。
  • “要判断数组是否相等,你必须将类型转换为字符串。” 你不必,事实上这是一种不可靠的比较方式:String([1,2]) == String(["1,2"]); // true
猜你喜欢
  • 2013-07-25
  • 1970-01-01
  • 1970-01-01
  • 2011-11-17
  • 2011-10-30
  • 2017-09-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多