一直没搞懂js的数据类型隐式转换,像下面在控制台输出的例子,不知道是根据什么规则进行转换的:
求解答
1.复杂对象隐式转换应该是调用toString方法了,空数组toString就是空字符串,空对象toString就是"[object, Object]"。
2.那个花括号写在最前面会单独是当一个块级作用域(es6)来解析了(控制台直接输入{}.toString()是会报错的,就是当作块级作用域了,没有那个方法),由此就相当于 + []了,+号就把它转成number了
3.加括号的话很好理解呀,提高优先级,看成一个整体,就不会把花括号单独解析了
个人见解,不对之处请大神包容指正,谢谢!!
10 回答11.4k 阅读
4 回答3.3k 阅读✓ 已解决
2 回答2.9k 阅读✓ 已解决
3 回答2.5k 阅读✓ 已解决
3 回答2.3k 阅读✓ 已解决
2 回答2k 阅读✓ 已解决
4 回答2k 阅读✓ 已解决
首先对题主放截图不放代码的行为表示强烈谴责!!!
然后摆结果,有歧义的备注//歧义了:
上面的结果解释起来就一句话,高程:
如果要分析的话,加上下面的就可以了:
现在再来说,和题主的截图有两个 0 不一致的地方;
首先题主截图没问题,我测试了,我上面的结果也没问题,也测试了;但是在平常应用中,应该遇不到那种情况,比方说
{}+[]
if()
,也不会得到 0;;然后我们来说原因,经过上面的例子,你怕也知道了为什么会不一致了;
赋值=、if()、return 后面跟的都是表达式,上述歧义的括号版本,返回的就是预期内的数据,因为括号里放的也是表达式;
那么当浏览器在遇到
{
时,是把它当表达式还是语句来解析呢?测试下就知道了:很明显是当成语句来解析的,如果当成一个空对象的表达式来解析,那么空对象是有 toString 方法的,再不济,也应该是返回 undefined(非严格模式,浏览器端);在这种表达式和语句有歧义的地方,一般加个 () 就可以将语句转为表达式,所以,下图是不报错的,并且返回正确:
那么继续,既然是
{
当成语句来解析,那么{}+[]
实际相当于语句{}
后面跟了一条无关紧要的表达式而已+[]
,也就是这样:所以题主在控制台执行
{}+[]
,实际上是返回了最后一条语句的结果+[]
,为什么这个结果是 0 呢?这是
一元加操作符
,高程上这么说:所以:
{}+[]
=>{};+[];
最终返回Number([])
;同理:
{} + false
=>{};+false;
,最终返回Number(false)
;完。
JavaScript高级程序设计-第3版-中