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

标签 javascript

我对输出感到困惑。

var arrLike = {0:'Martin', 1:78, 2:67, 3:['L', 'M', 'P'], length: 4};

如果我在 arrLike 上使用 slice():

var newArr = Array.prototype.slice.call(arrLike, 0);

输出:

console.log(newArr);
["Martin", 78, 67, Array[3]]

这是怎么发生的?我无法完全理解输出结果。

最佳答案

前言:请注意,控制台输出中的 Array[3] 正是控制台向您显示的方式。你的 newArr 实际上是:

["Martin", 78, 67, ['L', 'M', 'P']]

它的发生是因为这就是 slice 的定义方式。粗略地说:

  1. 创建一个新的空数组
  2. 读取你给它的length属性
  3. 从起始索引(默认0)循环到结束索引(默认length - 1);调用循环变量k
    1. 在向对象请求属性 k 时,将在对象中找到的任何属性放入索引为 k - start 的数组中。
  4. 将返回数组的长度设置为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;
}

All the gory details .

由于您的 arrLike 对象具有 length 属性,并且具有名称为 0123,您将获得所显示的结果。

关于javascript - 在像 Object 这样的 Array 上使用 slice() 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34796963/

相关文章:

javascript - HTML固定大元素

javascript - 如何将加载页面的计时器延长至 3 秒?

javascript - jQuery - 添加列表项元素(如果少于三个)

javascript - Playground.js 未渲染

javascript - parseInt() 的最大基数?

Javascript 特殊字符匹配函数

javascript - 如何克隆 cakephp 元素的元素

javascript - Ionic + Angular2 google maps层事件监听器模型绑定(bind)

javascript - 当状态更新不影响 UI 时防止 "not wrapped in act(...)"Jest 警告

javascript - 添加事件监听器不适合我