这来自MDN文档:
[].copyWithin.call({length: 5, 3: 1}, 0, 3);
// {0: 1, 3: 1, length: 5}
我困惑的误解:财产0:1来自何处?具有2个属性的非数组对象的值将从第4位复制到第0位,因此没有操作。输出是冲销和新属性{0:1}
首先,请记住,标准数组只是具有特殊处理属性的对象,其名称为数组索引*,特殊length
属性,并Array.prototype
作为其原型。数组索引是属性名称(我们将它们写为数字,但从技术上讲,在规范级别上,它们是字符串 -尽管实现很自然地对其进行了优化)。
我们可以copyWithin
在非数组对象上使用它,因为它是“有意的泛型”的-只要被调用的对象具有length
属性,它就不会检查它是否在数组上被调用。
原始对象,{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的填充工具用于copyWithin
和规范,以获得一个好主意,它做什么。
*从该链接:
一个整数指数是一个字符串值属性密钥是一个规范的数字串(见7.1.16),并且其数字值是0或正整数2≤ 53 -1。一个数组索引是一个整数指数,其数值我的范围是从0≤我<2 32 -1。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句