在像Object这样的Array上使用slice()方法

Bun*_*Bun 4 javascript

我对输出感到困惑.

var arrLike = {0:'Martin', 1:78, 2:67, 3:['L', 'M', 'P'], length: 4};
Run Code Online (Sandbox Code Playgroud)

如果我使用slice()arrLike:

var newArr = Array.prototype.slice.call(arrLike, 0);
Run Code Online (Sandbox Code Playgroud)

输出:

console.log(newArr);
["Martin", 78, 67, Array[3]]
Run Code Online (Sandbox Code Playgroud)

这是怎么发生的?我无法用输出结束我的头脑.

T.J*_*der 7

前言:请注意,Array[3]控制台输出中的控件是控制台向您显示的方式.你newArr真的是:

["Martin", 78, 67, ['L', 'M', 'P']]
Run Code Online (Sandbox Code Playgroud)

它发生的原因在于如何slice定义.松散地说:

  1. 创建一个新的空数组
  2. 阅读length你给它的属性
  3. 从起始索引(默认0)循环到结束索引(默认length - 1); 调用循环变量k
    1. k在索引处向属性请求属性时,放置在对象中找到的任何属性k - start.
  4. length将返回的数组设置为k - start.
  5. 返回数组

或者(再次非常松散):

function slice(start, end) {
    var n, k, result;
    start = arguments.length < 1 ? 0 : +start;
    end = arguments.length < 2 ? +this.length : +end;
    result = [];
    for (var k = start, n = 0; k < end; ++k, ++n) {
        if (n in this) {
            result[n] = this[k];
        }
    }
    result.length = n;
    return result;
}
Run Code Online (Sandbox Code Playgroud)

所有血腥的细节.

因为你的arrLike对象有一个length属性,并与该名称的属性0,1,2,和3,你得到你所显示的结果.