Javascript's Array Reverse

后端 未结 2 1855
醉话见心
醉话见心 2020-12-18 02:14

How exactly does Javascript\'s array.reverse() work? Does it go through and swap every element of the array? If so, does it take O(n) to swap an array of size

相关标签:
2条回答
  • 2020-12-18 02:51

    For the full details of how it works, read the relevant section of the spec. Here's the algorithm:

    1. Let O be the result of calling ToObject passing the this value as the argument.

      1. Let lenVal be the result of calling the [[Get]] internal method of O with argument "length".
      2. Let len be ToUint32(lenVal).
      3. Let middle be floor(len/2).
      4. Letlower be 0.
      5. Repeat, while lower ≠ middle

        1. Let upper be len−lower −1.
        2. Let upperP be ToString(upper).
        3. Let lowerP be ToString(lower).
        4. Let lowerValue be the result of calling the [[Get]] internal method of O with argument lowerP.
        5. Let upperValue be the result of calling the [[Get]] internal method of O with argument upperP .
        6. Let lowerExists be the result of calling the [[HasProperty]] internal method of O with argument lowerP.
        7. Let upperExists be the result of calling the [[HasProperty]] internal method of O with argument upperP.
        8. If lowerExists is true and upperExists is true, then

        9. Call the [[Put]] internal method of O with arguments lowerP, upperValue, and true .

        10. Call the [[Put]] internal method of O with arguments upperP, lowerValue, and true .
        11. Else if lowerExists is false and upperExists is true, then
        12. Call the [[Put]] internal method of O with arguments lowerP, upperValue, and true .
        13. Call the [[Delete]] internal method of O, with arguments upperP and true.
        14. Else if lowerExists is true and upperExists is false, then
        15. Call the [[Delete]] internal method of O, with arguments lowerP and true .
        16. Call the [[Put]] internal method of O with arguments upperP, lowerValue, and true .
        17. Else, both lowerExists and upperExists are false
        18. No action is required.
        19. Increase lower by 1.
      6. Return O .
    0 讨论(0)
  • 2020-12-18 03:01

    The actual algorithm is almost similar to what you specified. Just change your for loop to iterate only upto a.length/2 and it would be similar to what Array.reverse would do. I am skipping the inner details here for the sake of simplicity. So it would be

    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;
    }
    
    0 讨论(0)
提交回复
热议问题