JS中的比较数组编号

aco*_*ela 0 javascript arrays

我正在使用JS,我不理解数组的某些行为.我搜索了但找不到正确的答案,如果这是欺骗或与其他问题相关,那就很抱歉.

我使用lodash有以下代码.

    return _.difference(self.list1, self.list2) <= 0;
Run Code Online (Sandbox Code Playgroud)

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

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

[] <= 0 //returns true

[[]] <= 0 //returns true

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

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

[[],[]] <= 0 //returns false
Run Code Online (Sandbox Code Playgroud)

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

T.J*_*der 7

<=运营商将迫使其操作数,力图使他们相媲美.完整的细节在规范的抽象关系比较操作中,但基本上:

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

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

这是一个更简单的例子:

var a = [2];
console.log(a < 10); // true
Run Code Online (Sandbox Code Playgroud)

其中的步骤是:

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

    • 数组没有提供转换为数字的方法,所以我们最终做(有效) a.toString()
    • a.toString()调用a.join(),将条目连接在一起作为字符串,中间用逗号
    • 所以我们最终得到了"2".


    现在我们有 "2" < 10

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

  3. 结果2 < 10true

这种策略有时甚至经常意味着<=操作员最终会比较NaN某些事情.例如,如果a是非数组对象:

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

步骤将是:

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

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

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


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

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

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

(感谢拉杰什用于建议的{} < 10示例和提供上述的初始版本.)