在像对象这样的数组上使用slice()方法
Using slice() method on Array like Object
我对输出感到困惑。
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
的定义方式。粗略地说:
- 创建一个新的空数组
- 读取您为其提供的内容的
length
属性 - 从起始索引(默认
0
)循环到结束索引(默认length - 1
);调用循环变量k
- 在请求对象输入属性
k
时,将对象中找到的任何属性放入索引k - start
处的数组中。
- 在请求对象输入属性
- 将返回数组的
length
设置为k - start
。 - 返回数组
或者(再次非常松散):
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;
}
所有血腥的细节。
由于您的arrLike
对象具有length
属性,并且具有名称为 0
、1
、2
和 3
的属性,因此您可以得到所显示的结果。
查看slice()
的规范。slice()
函数会将您未指定的 end
参数默认为 this.length
,并且...
- 如果 end 未定义,则让 relativeEnd 为 len;否则让 relativeEnd 为 到整数(结束)。
因此,您只是将arrLike
对象的前 4 个非元素属性推送到新数组中。
尝试使用...
var arrLike = {0:'Martin', 1:78, 2:67, 3:['L', 'M', 'P'], length: 6, 4: 'test'};
相关文章:
- electronic BrowserWindow的最小高度和宽度在hide()show()方法之后不起作用
- 有没有任何方法可以将控制器从文件加载到ui路由器$stateProvider中
- 数组在递归方法中设置为null
- 打破承诺链的好方法是什么
- 在使用Polymer'加载所有json文件后执行方法;s的核心ajax
- 使用“;这个“;JavaScript原型方法中的关键字
- 序列化数据属性中对象的最可靠方法
- 使用Objective-C的JavaScript注入方法
- 有没有一种方法可以添加相同的项目val=“0”;4〃;到JavaScript中数组的每个对象
- 为什么Javascript库对数组方法(push,slice等)有本地引用
- jQuery slice() 方法 在 html 中选择元素(第一个/最后一个)
- 如何设置 slice();p ush();splice() 方法的限制
- 在像对象这样的数组上使用slice()方法
- 处理 Array.prototype.slice.call(参数)的更简洁方法
- 如果array .prototype.slice()方法返回浅拷贝,为什么改变切片数组的值不会改变原始数组
- 调用方法和Array.prototype.slice.call的用法
- 对数组使用.slice方法
- 如何使用slice方法从数组中获取一个随机元素并将其存储
- 是否有一种方法来.slice()从JQuery .load()返回的响应
- Javascript .slice方法(更深入的理解)