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;
}
注意:很抱歉,如果我发布的Javascript代码不正确,现在已经很晚了。
编辑:将a.length
修正为a.length / 2
。
答案 0 :(得分:6)
有关其工作原理的详细信息,请read the relevant section of the spec。这是算法:
- 醇>
设O是调用ToObject传递此值作为参数的结果。
- 让lenVal成为使用参数“length”调用O的[[Get]]内部方法的结果。
- 设len为ToUint32(lenVal)。
- 让中间成为楼层(len / 2)。
- Letlower为0。
重复,而低≠中间
- 让上限为len-lower -1。
- 让upperP为ToString(上)。
- 让lowerP为ToString(更低)。
- 让lowerValue成为使用参数lowerP调用O的[[Get]]内部方法的结果。
- 让upperValue成为使用参数upperP调用O的[[Get]]内部方法的结果。
- 让lowerExists成为使用参数lowerP调用O的[[HasProperty]]内部方法的结果。
- 让upperExists成为使用参数upperP调用O的[[HasProperty]]内部方法的结果。
如果lowerExists为true且upperExists为true,则
使用参数lowerP,upperValue和true调用O的[[Put]]内部方法。
- 使用参数upperP,lowerValue和true调用O的[[Put]]内部方法。
- 否则如果lowerExists为false且upperExists为true,则
- 使用参数lowerP,upperValue和true调用O的[[Put]]内部方法。
- 调用O的[[Delete]]内部方法,参数upperP和true。
- 否则,如果lowerExists为true且upperExists为false,则
- 调用O的[[Delete]]内部方法,参数lowerP和true。
- 使用参数upperP,lowerValue和true调用O的[[Put]]内部方法。
- 否则,lowerExists和upperExists都是假的
- 无需采取任何措施。
- 将低点提高1。
- 返回O。
答案 1 :(得分:2)
实际算法几乎与您指定的算法类似。只需将for
循环更改为仅迭代a.length/2
,它将与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;
}