JS中的比较数组编号

时间:2017-04-10 06:56:12

标签: javascript arrays

我和JS一起工作,我不了解数组的某些行为。我搜索了但我无法找到正确的答案,如果这是欺骗或与其他问题有关,请对不起。

我使用lodash获得以下代码。

    return _.difference(self.list1, self.list2) <= 0;

这是返回一个数组,我直接将它与数字进行比较,只是因为我忘记了.length属性。我看到这是&#34;工作&#34;除非它不正确。所以我开始用JS控制台做一些测试,我不明白这里发生了什么。

[Object, Object, Object] <= 0 //returns false

[] <= 0 //returns true

[[]] <= 0 //returns true

[[[]]] <= 0 //returns true

[[2]] <= 0 // returns false

[[],[]] <= 0 //returns false

JS在这做什么?非常感谢你。

1 个答案:

答案 0 :(得分:7)

<=运算符将强制其操作数以尝试使它们具有可比性。完整的详细信息在规范Abstract Relational Comparison operation中,但基本上是:

将对象引用与基元进行比较时,会尝试将引用的对象转换为基元。在这种情况下,由于基元是一个数字,如果对象支持(数组不支持),它将尝试从对象获取一个原始数字,然后返回获取一个字符串。此时它有一个字符串和一个数字,所以它强制字符串编号并用数字比较它们。

当您将数组转换为字符串时,它会执行相同的操作join:将所有条目的字符串版本连接在一起,用逗号分隔。当然,如果你只有一个条目,你最终只会得到那个条目(作为一个字符串)。

这是一个更简单的例子:

var a = [2];
console.log(a < 10); // true

有以下步骤:

  1. 由于a包含对象引用,请将该对象转换为基元,如果可能,请将数字更改为字符串:

    • 数组不提供转换为数字的方式,因此我们最终做(有效)a.toString()
    • a.toString()调用a.join(),将条目连接在一起作为字符串,逗号介于两者之间
    • 所以我们最终得到"2"


    现在我们有"2" < 10

  2. 由于其中一个是数字,操作员会强制另一个编号,给我们2 < 10

  3. 2 < 10的结果为true
  4. 此策略有时甚至经常表示<=运算符最终会将NaN与某些内容进行比较。例如,如果a是非数组对象:

    var a = {};
    console.log(a.toString()) // "[object Object]"
    console.log(a < 10);      // false

    步骤如下:

    1. 由于a包含对象引用,请将该对象转换为基元,如果可能,请将数字更改为字符串:

      • 普通对象不支持转换为数字,因此我们最终(有效地)a.toString()

      • 正如您在上面的代码段中所看到的,这给了我们"[object Object]"


      现在我们有"[object Object]" < 10

    2. 由于其中一个是数字,操作员强制另一个编号。 "[object Object]"被强制为NaN

    3. NaN < 10的结果为false,因为涉及NaN(包括===)的所有比较会导致{{1} }}。 (是的,真的; falseNaN === NaN。)

    4. (感谢Rajesh建议false示例并提供上述的初始版本。)