我正在使用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在这做什么?非常感谢你.
该<=运营商将迫使其操作数,力图使他们相媲美.完整的细节在规范的抽象关系比较操作中,但基本上:
将对象引用与基元进行比较时,它会尝试将引用的对象转换为基元.在这种情况下,由于基元是一个数字,如果对象支持(数组不支持),它将尝试从对象获取一个原始数字,然后返回获取一个字符串.此时它有一个字符串和一个数字,因此它将字符串强制转换为数字并以数字方式对它们进行比较.
当您将数组转换为字符串时,它会执行相同的join操作:将所有条目的字符串版本连接在一起,用逗号分隔.当然,如果你只有一个条目,你最终只会得到那个条目(作为一个字符串).
这是一个更简单的例子:
var a = [2];
console.log(a < 10); // trueRun Code Online (Sandbox Code Playgroud)
其中的步骤是:
由于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); // falseRun Code Online (Sandbox Code Playgroud)
步骤将是:
由于a包含对象引用,因此将该对象转换为基元,如果可能,请将数字更改为字符串:
普通对象不支持转换为数字,因此我们最终(有效地)a.toString().
正如您在上面的代码段中所看到的,这给了我们 "[object Object]"
现在我们有 "[object Object]" < 10
由于其中一个是数字,操作员强迫另一个编号."[object Object]"强迫一个数字是NaN.
结果NaN < 10是false,因为涉及(包括)的所有比较都会导致.(是的,真的; 是.)NaN===falseNaN === NaNfalse
(感谢拉杰什用于建议的{} < 10示例和提供上述的初始版本.)
| 归档时间: |
|
| 查看次数: |
73 次 |
| 最近记录: |