gpt4 book ai didi

javascript - 在对象文字上调用 js Array.prototype.copyWithin(target, start,end) 做什么?

转载 作者:行者123 更新时间:2023-12-02 06:50:11 28 4
gpt4 key购买 nike

这是来自 MDN documentation :

[].copyWithin.call({length: 5, 3: 1}, 0, 3);
// {0: 1, 3: 1, length: 5}

我的糊涂误解:属性 0:1 从何而来?具有 2 个属性的非数组对象会将第 4 个属性的值复制到第 0 个位置,所以 noop。输出是一个反转和一个新属性 {0:1}

最佳答案

首先,让我们记住标准数组只是对名称为 array indexes 的属性进行特殊处理的对象。 *,一个特殊的length属性(property),和Array.prototype作为他们的原型(prototype)。数组索引是属性名称(我们将它们写成数字,但从技术上讲,在规范级别,它们是字符串——当然,实现会优化它们)。

我们可以使用copyWithin在非数组对象上,因为它是“有意通用的”——它不会检查它是否在数组上被调用,只要它被调用的对象有一个 length。属性(property)。

您的原始对象,{length: 5, 3: 1} ,有两个属性:"length" (值 5)和 "3" (值 1)。然后 copyWithin(obj, 0, 3)进行调用,它表示“将从索引 3 开始到‘数组’末尾的条目复制到索引 0”。所以非常大致:

var target = 0;
var source = 3;
while (source < obj.length) {
if (source in obj) { // If the object has this property...
obj[target] = obj[source]; // ...copy it
}
++target;
++source;
}

所以它最终复制属性 "3" (值 1)到属性 "0" ,然后转到属性 "4" ,它不存在,因此被跳过,然后停止因为 source不是 < obj.length不再。

您可能会发现通读 MDN's polyfill for copyWithin 很有用和 the spec了解它的作用。


* 来自该链接:

An integer index is a String-valued property key that is a canonical numeric String (see 7.1.16) and whose numeric value is either +0 or a positive integer ≤ 253-1. An array index is an integer index whose numeric value i is in the range +0 ≤ i < 232-1.

关于javascript - 在对象文字上调用 js Array.prototype.copyWithin(target, start,end) 做什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47071431/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com