Javascript的数组反向

Iva*_*van 7 javascript arrays

Javascript的array.reverse()工作原理是什么?它是否通过并交换数组的每个元素?如果是这样,是否需要O(n)来交换大小为n的数组?

我想我问的原因是因为我想知道是否array.reverse()与以下相同:

for(var i = 0; i < a.length / 2; i++) {
  var holder = a[i];
  a[i] = a[a.length - 1 - i];
  a[a.length - 1 - i] = holder;
}
Run Code Online (Sandbox Code Playgroud)

注意:对不起,如果我发布的Javascript代码不正确,现在已经很晚了.

编辑:固定a.lengtha.length / 2.

Jam*_*ice 6

有关其工作原理的完整详细信息,请阅读规范的相关部分.这是算法:

  1. 设O是调用ToObject传递此值作为参数的结果.

    1. 设lenVal是用参数"length"调用O的[[Get]]内部方法的结果.
    2. 设len为ToUint32(lenVal).
    3. 让中间是下限(len/2).
    4. Letlower为0.
    5. 重复,而低≠中

      1. 让上限为len-lower -1.
      2. 设upperP为ToString(上).
      3. 让lowerP为ToString(更低).
      4. 设lowerValue是使用参数lowerP调用O的[[Get]]内部方法的结果.
      5. 设upperValue是使用参数upperP调用O的[[Get]]内部方法的结果.
      6. 让lowerExists是使用参数lowerP调用O的[[HasProperty]]内部方法的结果.
      7. 让upperExists是使用参数upperP调用O的[[HasProperty]]内部方法的结果.
      8. 如果lowerExists为true且upperExists为true,则

      9. 使用参数lowerP,upperValue和true调用O的[[Put]]内部方法.

      10. 使用参数upperP,lowerValue和true调用O的[[Put]]内部方法.
      11. 否则如果lowerExists为false且upperExists为true,那么
      12. 使用参数lowerP,upperValue和true调用O的[[Put]]内部方法.
      13. 调用O的[[Delete]]内部方法,参数upperP和true.
      14. 否则,如果lowerExists为true且upperExists为false,则
      15. 调用O的[[Delete]]内部方法,参数lowerP和true.
      16. 使用参数upperP,lowerValue和true调用O的[[Put]]内部方法.
      17. 另外,lowerExists和upperExists都是假的
      18. 无需任何操作.
      19. 增加1点.
    6. 返回O.