([]+').length的问题。

发布于 2022-09-05 22:08:49 字数 164 浏览 19 评论 0

问题比较小白,({}+{}).length是30,这个好理解,{}做字符拼接的时候视作[object object],所以长度是15,两个是30,但是,({}+[]).length就是15,我单单用([]+'').length为什么就是0了呢,这里的[]为什么不视作[object
array]的形式呢?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

葬心 2022-09-12 22:08:49
// +法运算执行过程是怎样的?
    补充说明什么是原始值: Undefined、Null、Boolean、Number 和 String,这些都是原始值
    1, 运算中如果有操作数是对象(非原始值,如果说一切皆为对象此说法也不成立,方便理解而已),先要将此对象转原始值。
    2, 如何转原始值?
        --a 如果对象本身instanceof Date === true,那么对象先执行原型上的toString()方法获取原始值,如果toString()没有返回原始值,那么将执行原型上面的valueOf()方法,如果还没有返回原始值则抛出错误:Cannot convert object to primitive value
        --b 如果对象本身instanceof Date === false,  那么对象先执行原型上的valueOf()方法获取原始值,如果valueOf()没有返回原始值,那么将执行原型上面的toString()方法,如果还没有返回原始值则抛出错误:Cannot convert object to primitive value  
    3, 如果是两个原始值相加会这样? 如果其中一个是字符,那么两者做字符串拼接。否则两者都被转成数字做加法
示例如下 -- > Date
    var data = new Date()
    1 + data // 1Thu Sep 14 2017 16:56:37 GMT+0800 (CST)
    data.toString = function () {return {}}
    1 + data // 1505379465110
    data.valueOf = function () {return {}}
    1 + data // Cannot convert object to primitive value
回到题主的问题 --> 
    ({} + {})
    ({}).valueOf() // {} 不是原值继续执行toString()
    ({}).toString() // "[object Object]" 是原值
    ([]).valueOf() // [] 不是原值继续执行toString()
    ([]).toString() // "" 是原值
迷爱 2022-09-12 22:08:49

你好像没搞懂({}+[]).length为什么是15,[]转的字符串没有变化,Array.prototype.toString返回的不可能是[object Array]
console.log(({}+[]).toString())就知道了

那一片橙海, 2022-09-12 22:08:49

[].toString() 结果是 '' (空数组转字符串为空字符串)

新雨望断虹 2022-09-12 22:08:49
({}+{}).toString().length => "[object Object][object Object]".length
({}+[]).toString().length => "[object Object]".length
陌路黄昏 2022-09-12 22:08:49

了解了,谢谢各位大神不舍赐教,刚开始深入学习js。
数组为空时,视作''而不是[object Array],后面的问题也就解决了。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文