我和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在这做什么?非常感谢你。
答案 0 :(得分:7)
<=
运算符将强制其操作数以尝试使它们具有可比性。完整的详细信息在规范Abstract Relational Comparison operation中,但基本上是:
将对象引用与基元进行比较时,会尝试将引用的对象转换为基元。在这种情况下,由于基元是一个数字,如果对象支持(数组不支持),它将尝试从对象获取一个原始数字,然后返回获取一个字符串。此时它有一个字符串和一个数字,所以它强制字符串编号并用数字比较它们。
当您将数组转换为字符串时,它会执行相同的操作join
:将所有条目的字符串版本连接在一起,用逗号分隔。当然,如果你只有一个条目,你最终只会得到那个条目(作为一个字符串)。
这是一个更简单的例子:
var a = [2];
console.log(a < 10); // true
有以下步骤:
由于a
包含对象引用,请将该对象转换为基元,如果可能,请将数字更改为字符串:
a.toString()
a.toString()
调用a.join()
,将条目连接在一起作为字符串,逗号介于两者之间"2"
。
现在我们有"2" < 10
由于其中一个是数字,操作员会强制另一个编号,给我们2 < 10
2 < 10
的结果为true
此策略有时甚至经常表示<=
运算符最终会将NaN
与某些内容进行比较。例如,如果a
是非数组对象:
var a = {};
console.log(a.toString()) // "[object Object]"
console.log(a < 10); // false
步骤如下:
由于a
包含对象引用,请将该对象转换为基元,如果可能,请将数字更改为字符串:
普通对象不支持转换为数字,因此我们最终(有效地)a.toString()
。
正如您在上面的代码段中所看到的,这给了我们"[object Object]"
现在我们有"[object Object]" < 10
由于其中一个是数字,操作员强制另一个编号。 "[object Object]"
被强制为NaN
。
NaN < 10
的结果为false
,因为涉及NaN
(包括===
)的所有比较会导致{{1} }}。 (是的,真的; false
是NaN === NaN
。)
(感谢Rajesh建议false
示例并提供上述的初始版本。)