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

标签 javascript

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

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

最佳答案

参见 specification for Array.prototype.join (下)。它不要求它操作的 this 是一个数组,只需要它有一个 length 和名称如 01,依此类推。字符串可以,因此 join 可以处理字符串。

来自规范:

NOTE 2 The join function is intentionally generic; it does not require that its this value be an Array object. Therefore, it can be transferred to other kinds of objects for use as a method.

这是规范中的完整算法:

  1. OToObject (这个值)。
  2. ReturnIfAbrupt (O).
  3. lenToLength ( Get (O, "length")).
  4. ReturnIfAbrupt (len).
  5. 如果separator undefined,令separator为单元素字符串","。<
  6. sepToString (分隔符)。
  7. ReturnIfAbrupt (9月)。
  8. 如果 len 为零,则返回空字符串。
  9. element0Get (O“0”)。
  10. 如果element0undefinednull,令R为空字符串;否则,设 RToString (元素 0)。
  11. ReturnIfAbrupt (R).
  12. k1
  13. 重复,同时 k <len
    1. S 为通过连接 Rsep 产生的字符串值。
    2. 元素Get (OToString(k))。
    3. 如果elementundefinednull,让next为空字符串;否则,让 nextToString (元素)。
    4. ReturnIfAbrupt (下一个)。
    5. R 是通过连接 Snext 产生的字符串值。
    6. k 增加 1。
  14. 返回R

关于javascript - Array.prototype.join.call 在后台为字符串做什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33981796/

相关文章:

javascript - 简单的 JS 练习导致浏览器崩溃

javascript - 使用 paperjs 翻译 Canvas 中的坐标系

javascript - 使用 tv4 的模式响应始终有效

javascript - Knockout 链式计算可观察对象在更新时抛出异常

javascript - JavaScript 函数 commit() 和 send() 之间有什么区别?

javascript - jQuery Lightbox Me - 多个链接相同的弹出窗口

javascript - 绘制圆圈,然后使用 html canvas 和 javascript 移动它

javascript - ng-keypress 调用 angularjs 中的函数

javascript - 用 JavaScript 放慢时间

Javascript - 图表库