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

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

阅读 3.3k
5 个回答
// +法运算执行过程是怎样的?
    补充说明什么是原始值: 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() // "" 是原值

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

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

({}+{}).toString().length => "[object Object][object Object]".length
({}+[]).toString().length => "[object Object]".length
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题