javascript - ([] + {}).length ?
迷茫
迷茫 2017-04-10 15:57:07
[JavaScript讨论组]

([]).length // 0

({}).length // undefined

([] + {}).length //15

为什么 ([] + {}).length 是15?

迷茫
迷茫

业精于勤,荒于嬉;行成于思,毁于随。

全部回复(5)
天蓬老师

([]).length --> 空数组的length是0

({}).length --> {}是一个空对象,这个对象是没有length 方法的所以是undefined

([] + {}).length --> 实际这两个是不能用操作符"+"的,这个表达式实际是分别调用了[]和{}的toString()方法。[]返回空字符串"",而{}返回"[object Object]",这两个字符串拼在一起刚好是15个字符的一个字符串。

可以这样验证:
([]).toString() // ""
({}).toString() // "[object Object]"
([]+{}) // "[object Object]"

伊谢尔伦

[] + {} 运算,首先是调用对象的 valueOf 方法,如果返回一个基本类型,则以该基本类型参与运算;否则调用 toString 方法,返回基本类型则参与运算。

数组和对象的 valueOf(默认)返回自身,因此不是基本类型,接着调用 toString,空数组返回空字符串,普通对象始终返回字符串 [object Object]。故视为两个字符串的拼接,结果为字符串 [object Object],其长度为 15。

一个例外是 Date 的实例,其实例首先调用 toString ,接着才调用 valueOf

题主可试着为这些对象添加自己的 valueOf 或者 toString 方法,比如让它们返回一个数字,结果就是两个数字相加,变成加法运算而不是字符串拼接了。

伊谢尔伦


[]+{}先尝试valueOf()方法,如果返回的不是基本类型 ,再调用toString()方法

[].valueOf()
//[]
({}).valueOf()
//Object {}
[].toString()
//""
({}).toString()
//"[object Object]"
([] + {})
//"[object Object]"
"[object Object]".length
//15
PHP中文网

@miracledan 给出了解决方案。但我想说的是:接触到前端,底层基础原理很重要。多花点时间去思考。
比如说([] + {}).length这个问题首先切入点是 ([]+{}) 是什么,控制台一打印出来就很容易理解了。

另外如果数组有内容的toString 是 [1,2] => "1,2"

最后,楼主最好是别纠结这些东西,也别写这种代码。因为1可阅读很重要,别人看不懂;2说不定不同浏览器处理还不同。

高洛峰

这种代码只能用来分析吧,平时谁会写这样的代码呢

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号