Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
haizhilin2013 opened this issue Jul 16, 2019 · 14 comments
Open

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

haizhilin2013 opened this issue Jul 16, 2019 · 14 comments
Labels
js JavaScript

Comments

@haizhilin2013
Copy link
Collaborator

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

@haizhilin2013 haizhilin2013 added the js JavaScript label Jul 16, 2019
@ghost
Copy link

ghost commented Jul 16, 2019

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

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

@NicholasBaiYa
Copy link

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

@nowherebutup
Copy link

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

@haizhilin2013 haizhilin2013 changed the title [js] 第92天 解释下为什么{} + [] === 0为true? [js] 第92天 解释下为什么{} + [] === 0为true? Jul 17, 2019
@tonyChenHey
Copy link

tonyChenHey commented Jul 17, 2019

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

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

所以,这应该涉及到了隐式转换
那么是如何转换的呢?
这个过程涉及到将对象转换为原始值(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

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

@MoveZZG
Copy link

MoveZZG commented Jul 17, 2019

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

@DarthVaderrr
Copy link

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

@134355
Copy link

134355 commented Jul 17, 2019

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

@liangchaofei
Copy link

liangchaofei commented Jul 18, 2019

image
是false

@134355
Copy link

134355 commented Jul 19, 2019

image
是false

image

@zhangsan08
Copy link

image
• 假

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

@MRMrmRmrrighty
Copy link

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

@maxthonl
Copy link

image

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

@1684838553
Copy link

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

@xiaoqiangz
Copy link

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

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
js JavaScript
Projects
None yet
Development

No branches or pull requests