Tek*_*Tek 14 javascript arrays compare
我想知道为什么标题中给出的表达式
[] == ![]
被评估为true.
您无法将数组作为字符串进行比较.我明白了.如果
[] == []
将评估为false,因为引用不同.虽然我们有以下声明.
var arr = [];
arr == arr // this evaluates to true simply because references are the same.
Run Code Online (Sandbox Code Playgroud)
按顺序A == B返回trueA和B必须是false或true.A ==!B为了返回true A可以true和B可以false相反,但在这种情况下,A和B是相同的值,所以我不明白.
Aka*_*ija 17
基本上,如果两种类型不相同,Javascript会尝试将两边都转换为数字.如果它是一个Object,它会尝试转换为原始值
所以在这种情况下将逐步进行
=> []==![]
=> []==false // Type conversion by the statement itself
=> []==0 // To number of right operand
=> ""==0 // To Primitive call for Array which will in this case convert to empty string
=> 0==0 // To number call of "" which is 0
=> true
Run Code Online (Sandbox Code Playgroud)
可以在编译器描述中检查ecmascript解释http://www.ecma-international.org/ecma-262/5.1/#sec-11.9.3
Dan*_*ite 10
![]评估为,false因为引用是真实的。[]可以转换为错误的数字(在这种情况下为 0)。因此:条件相等地通过。如果你这样做了,===那就是假的。
每当使用==比较2个值时,javascript就会执行抽象平等比较算法。
此处,x为[],y为![]。也,
typeof([]) // "object"
typeof(![]) // "boolean"
Run Code Online (Sandbox Code Playgroud)
由于y是布尔值,而x是对象,因此条件7是第一个条件:
如果Type(y)为Boolean,则返回比较结果x == ToNumber(y)。
ToNumber(y)的值是多少?
Number(![]) // 0
Run Code Online (Sandbox Code Playgroud)
因为[]是真实值,所以取反将其设为假。Number(false)为0
现在我们进行比较:[] == 0。
由于typeof(0)是“数字”,因此条件8现在成立:
如果Type(x)是Object并且Type(y)是String或Number,则返回比较结果ToPrimitive(x)== y。
ToPrimitve(x)类似于x.toString()。
[].toString() // ”” - the empty string
Run Code Online (Sandbox Code Playgroud)
现在我们几乎要面对比较:“” == 0
现在,条件5成立:
如果Type(x)为String,Type(y)为Number,则返回比较结果ToNumber(x)== y。
ToNumber(“”) // 0
Run Code Online (Sandbox Code Playgroud)
最后,两个操作数具有相同的类型和条件1成立。我想你可以从这里带走)
阅读有关规格的抽象平等比较!
| 归档时间: |
|
| 查看次数: |
4153 次 |
| 最近记录: |