无new关键字调用Array()的机制及Array(x+1).join()实现原理
嘿,这个用数组join实现字符串重复的写法确实有点绕,我来给你把背后的逻辑拆解得明明白白~
1. 为什么Array(x+1).join(str)能实现字符串重复?
先从数组的join()方法说起:join(separator)的核心作用是把数组所有元素转成字符串,再用separator把它们串起来。最关键的点是:分隔符是插在两个元素之间的,所以分隔符出现的次数 = 数组长度 - 1。
拿你的例子来说:repeat("wow", 2)里调用了Array(3),它会创建一个长度为3的稀疏数组,控制台输出就是(3) [empty × 3]。这种稀疏数组里的empty元素,转成字符串时会变成空字符串""。当你调用join("wow")时,实际的拼接过程是:
"" + "wow" + "" + "wow" + ""
前后的空字符串对结果没有影响,最终就得到了"wowwow"——刚好是"wow"重复2次。
如果换成Array(x)(也就是Array(2)),数组长度是2,分隔符只会出现1次,拼接后就是"" + "wow" + "",结果自然只有1个"wow",达不到你要的重复2次的效果。
2. 不用new调用Array()是什么情况?
其实Array()作为构造函数,用不用new关键字,行为完全一致:
- 当传入单个数字参数时,比如
Array(3)或new Array(3),都会创建一个长度为该数字的稀疏数组; - 当传入多个参数时,比如
Array("a", "b")或new Array("a", "b"),都会创建包含这些参数的普通数组。
这是因为JS引擎对Array函数做了特殊处理:如果没有用new调用,它会自动在内部创建一个新的Array实例并返回,和new Array()的结果没有任何区别。
3. 补充:字符串的repeat()方法
你提到的字符串repeat()方法(比如"wow".repeat(2))是ES6新增的API,逻辑非常直观——直接指定重复次数就能得到结果。而Array(x+1).join(str)是ES6之前,没有原生repeat方法时的一种“奇技淫巧”,利用数组join的特性来模拟字符串重复。
内容的提问来源于stack exchange,提问作者bakrall

