【问题标题】:Why does this happen?为什么会这样?
【发布时间】:2018-10-15 03:33:57
【问题描述】:

运行此代码会产生与 cmets 一样的结果,但为什么会这样?

let a = [1,2,3];
let b = [1,2,3];
let c = '1,2,3';
a == c; // true
b == c; // true
a == b; // false

我注意到如果您使用以下最终结果更改之前的代码:

let a = [1, 2, 3];
let b = [1, 2, 3];
let c = '1, 2, 3';
a == c; // false
b == c; // false
a == b; // false

谢谢!

【问题讨论】:

  • 因为a==c 和b==c 将数组转换为字符串,所以第三个比较两个数组的引用(不相等)。见here
  • 使用 === 进行严格比较
  • 强制相同类型。当将原始元素(如字符串、数字或布尔值)与复杂元素(如对象、函数或数组)进行比较时,后者将被转换为最近的原始元素(字符串)。在比较复杂元素时,您实际上是在检查两侧是否是对相同元素的引用(而不是对象看起来是否相同)。
  • 您是在问为什么是[1,2,3] == '1,2,3',还是为什么是[1,2,3] != [1,2,3]?这是两个不同的问题。
  • @Bergi 两个单独的问题,这两个问题的答案都是“不要使用损坏的语言功能”;)

标签: javascript


【解决方案1】:

请参阅this article,它描述了 JavaScript 中不同类型的相等检查。

a == c; // true
b == c; // true

上述两个都返回 true,因为 == 导致数组使用其 toString 方法转换为其等效字符串(因为它正在使用 == 运算符与字符串进行比较),该方法返回 "1,2,3"。显然"1,2,3" 等于"1,2,3"。

a == b; // false

上面返回 false,因为 a 和 b 是两个不同的数组,JavaScript 通过引用来比较它们,而不是遍历每个元素并单独比较它们或将它们转换为等效的字符串。

【讨论】:

  • 为什么第二个例子的行为不同?谢谢!
  • ye 仍然是第一个示例 [1,2,3].toString()==[1,2,3].toString() = true 并且 a == b 给出错误的原因
  • @vivid 因为两个操作数为同一类型时不进行转换,所以不涉及.toString(),只是对象引用比较。
  • @vivid,不是对象和数组的情况。
  • @vivid -- toString() 将数组转换为字符串,== 发生在[1,2,3].toString()==[1,2,3].toString() 中的两个字符串上,通过值进行比较,因此返回true。
【解决方案2】:

@blurstream 问题是从数组到字符串的隐式转换将测试从不带空格的"[1,2,3]" == "[1,2,3]" 更改为带空格的"[1,2,3]" == "[1, 2, 3]"。这就是它改变的原因。

数组[1, 2, 3] 被JavaScript 理解为不带空格的[1,2,3]。这会改变测试!

更具体地说,它从返回true 的"[1,2,3]" == "[1,2,3]" 变为返回false 的"[1,2,3]" == "[1, 2, 3]"。

P.S:由于我在这里缺乏声誉,我没有发表评论而是发布了答案,请原谅我。

【讨论】:

    猜你喜欢
    • 2011-06-03
    • 2018-06-08
    • 2014-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多