众所周知,我们在将函数参数转换为数组等场景中使用 Array.prototype.slice.call()。
现在,如果我尝试对其他对象执行相同操作,该对象具有以数字方式迭代的键值以及非数字键值,则将其省略。(非数字)。下面是代码。
var myobject ={ // array-like collection
length: 4,
'0': 'zero',
'1': 'one',
'2': 'two',
'3': 'three'
}
var myarray = Array.prototype.slice.call(myobject) // returns myobject as a true array: ["zero", "one", "two", "three"]
同样的流程,如果我使用的对象仅具有键值,如 0,1,2,3... 返回空数组。下面是代码。
var myobject2 ={ // array-like collection
'1': 'one',
'2': 'two',
'3': 'three'
}
var myarray2 = Array.prototype.slice.call(myobject2) //returns empty array
谁能解释一下为什么会这样????它只看数字键,创建空数组并将其转换为数字索引吗?????
最佳答案
Array.prototype.slice.call()
需要一个 .length
属性,然后是相应的从零开始的数字属性(尽管所有属性名称实际上都是字符串所以它是数字的字符串)。如果它没有找到那些存在的,它就不会正确地执行 .slice()
。
如果源不是一个实际的数组,那么它基本上只是进入一个从 0
到 .length - 1
的循环,寻找对象上匹配的属性名称并使用该属性名称复制它找到的任何值。属性名称必须与数字的字符串等价物完全匹配。
任何缺失的数字属性都被简单地复制为 undefined
,因为这就是它们的值。
关于javascript - Array.prototype.slice.call() 的内部工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36687773/