数组的 tostring() 方法将元素转为字符串并用逗号拼接,隐式转换时优先调用它而非 object.prototype.tostring();+ 运算符触发该方法因 valueof() 返回对象,需降为原始值。

数组的 toString() 方法是理解 JavaScript 中隐式类型转换的关键入口——它不调用 Object.prototype.toString(),而是走数组专属逻辑:把每个元素转成字符串,再用逗号拼接。
数组 toString() 的真实行为
数组重写了继承自 Array.prototype.toString(),其执行步骤如下:
- 对数组每一项调用
String(item)(注意不是item.toString()) - 将所有结果用英文逗号
,连接成一个字符串 - 空数组返回空字符串
"";含空位(稀疏数组)时对应位置变成空字符串,如[1, , 3].toString()→"1,,3"
为什么 + 运算符会触发 toString()?
当数组参与字符串拼接(如 [] + {} 或 [1,2] + "a")时,JS 引擎需将其转为原始值。规则是:
- 先尝试
valueOf(),但数组的valueOf()返回自身(对象),不满足原始值要求 - 再调用
toString(),得到字符串后继续拼接 - 所以
[1,2,3] + "hello"实际是"1,2,3" + "hello"→"1,2,3hello"
和 Object.prototype.toString() 的本质区别
别混淆两者:
-
[].toString()→""(数组实例方法) -
Object.prototype.toString.call([])→"[object Array]"(用于类型检测) - 隐式转换中永远触发的是前者,不是后者
实际调试技巧
快速验证隐式转换链:
- 在控制台输入
+[1,2]:一元加号先调toString()得"1,2",再转数字 →NaN - 写
console.log([null, undefined, 0, false]):各元素经String()后分别是"null"、"undefined"、"0"、"false",最终输出"null,undefined,0,false" - 覆盖
toString可改变行为:let a = [1,2]; a.toString = () => "custom"; a + ""→"custom"
掌握这个链条,就能看透很多看似奇怪的字符串拼接结果。它不是黑盒,只是按明确优先级走了一条固定路径。











