Array.prototype.join.call在后台为字符串做了什么?

dar*_*mkd 3 javascript

var a = "foo";
var c = Array.prototype.join.call( a, "-" ); // 'f-o-o'
Run Code Online (Sandbox Code Playgroud)

第二行代码如何工作?我没有看到任何字符串转换为数组然后再转换回来,这是在后台发生的吗?我遇到过这种代码,这很奇怪,一个接受字符串的数组方法.

T.J*_*der 5

请参阅(下面)的规范Array.prototype.join .它不要求在它的上是一个数组操作,仅仅是它有一个和属性如姓名,等.字符串,所以可以在字符串上工作.thislength01join

从规格:

注2:该join功能是故意通用的; 它不要求它的this值是一个Array对象.因此,它可以转移到其他种类的对象以用作方法.

这是规范中的完整算法:

  1. 设O为ToObject(此值).
  2. ReturnIfAbrupt(O).
  3. 让len成为ToLength(Get(O,"length")).
  4. ReturnIfAbrupt(len).
  5. 如果隔板是未定义,让隔板是单元素字符串",".
  6. 设sep为ToString(分隔符).
  7. ReturnIfAbrupt(sep).
  8. 如果len为零,则返回空String.
  9. 设element0为Get(O,"0").
  10. 如果部件0是未定义的或空,让- [R是空字符串; 否则,让R为ToString(element0).
  11. ReturnIfAbrupt(R).
  12. 让k成为1.
  13. 重复,而k < len
    1. 设S是连接R和sep产生的String值.
    2. 设元素为Get(O,ToString(k)).
    3. 如果元素是未定义或空,让下一个空字符串; 否则,让接下来是ToString(元素).
    4. ReturnIfAbrupt(下一个).
    5. 令R为串联S和下一个产生的字符串值.
    6. 将k增加1.
  14. 返回[R .