haizlin/fe-interview

[js] 第92天 解释下为什么{} + [] === 0为true?

haizhilin2013 opened this issue · 14 comments

第92天 解释下为什么{} + [] === 0为true?

那个 {} 是空语句块而非空对象

{} + [] === 0
+[] === 0
0 === 0
true

先运算,后比较
{} + [] == 0; 0 === 0

因为 +[] 为0,
而{}是空的,
所以 0 === 0;

加法运算符会触发三种类型转换:

  • 转换为原始值
  • 转换为数字
  • 转换为字符串

所以,这应该涉及到了隐式转换
那么是如何转换的呢?
这个过程涉及到将对象转换为原始值(undefined,null,boolean,number,string)
参考
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Symbol/toPrimitive
尝试干扰转换原始值的过程验证
console.log({[Symbol.toPrimitive](hint) {return "object";}} + []) //object

一开始以为{}不是代码块,但是这么多人说是代码块,为什么,求解

{} 认定是语法块
这个放在前面,只有混淆作用,并不参与运算。
+[] 类型转换 0
0===0;
不再赘述

{ }被解释为代码块,不参与计算 所以 +[ ] === 0;
但是如果写成 [ ] + { } 则结果为 "[object Object]"
详细介绍:
https://www.cnblogs.com/MasterYao/p/7783004.html

{} + {} => '[object Object][object Object]'
{} + [] => 0
如果{}被当做代码块解析了,那么结果应该如下
+{} => '[object Object]'
+[] => 0
语句一与结果不符
语句二倒是能解析的通
现在我就看你们怎么解释

image
是false

image
是false

image

image
• 假

因为console.log的()把{}解析成一个对象了

let a = {} + []
a === 0
false

image

这个不用我多说,大家应该都清楚啥意思了吧

{} + [] === 0
{} 在这表示代码块
+[] ==> +"" ==> 0

那个 {} 是空语句块而非空对象

{} + [] === 0
+[] === 0
0 === 0
true