javascript - Array.prototype.slice.call() 的内部工作

标签 javascript

众所周知,我们在将函数参数转换为数组等场景中使用 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/

相关文章:

php - jQuery ajax (JSON) 从 PHP 获取数组工作正常,但在网络服务器上不行

javascript - 如何在不影响 DOM 的情况下获取 HTML 的克隆、修改、获取 HTML 字符串?

在多个文件中包含多个类的 Javascript 快速方法

javascript - jQuery 反序列化表单

javascript - 为什么 line-through 仅适用于此 jQuery 待办事项列表中的所有其他元素?

javascript - 尝试将 JSON 格式日期集合转换并显示为正常格式

javascript - 使用 Javascript 为重复索引创建新循环

javascript - 使用 YQL 的跨域请求

javascript - Jquery 绑定(bind)事件不响应

javascript - 将哑引号转换为智能引号仅适用于文本而非 HTML 代码