learn
learn copied to clipboard
JavaScript深入之类数组对象与arguments
类数组对象与 arguments
类数组对象从读写、获取长度、遍历三个方面看,和数组貌似是一样的,但是无法直接使用数组的方法,需要借助 call 或 apply:
var likeArr = {
0: "a",
1: "b",
2: "c",
length: 3
};
Array.prototype.slice.call(likeArr, 0); // ["a", "b", "c"]
Array.prototype.join.call(likeArr, "&"); // "a&b&c"
Array.prototype.map.call(likeArr, item => item.toUpperCase()); // ["A", "B", "C"]
类数组转数组
// slice
Array.prototype.slice.call(likeArr);
// ES6
Array.from(likeArr);
// apply
Array.prototype.concat.apply([], likeArr);
// splice,会改变 linkeArr
Array.prototype.splice.call(likeArr, 0);
Arguments
Arguments
对象只定义在函数体中,包括了函数的参数和其他属性。在函数体中,arguments 指代该函数的 Arguments 对象。
Arguments 对象的 length 属性,表示实参的长度。
Arguments 对象的 callee 属性,通过它可以调用函数自身。
将参数从一个函数传递到另一个函数:
// 使用 apply 将 foo 的参数传递给 bar
function foo() {
bar.apply(this, arguments);
}
function bar(a, b, c) {
console.log(a, b, c);
}
foo(1, 2, 3);
使用 ES6 的...
运算符,我们可以轻松转成数组。
function func(...arguments) {
console.log(arguments); // [1, 2, 3]
}
func(1, 2, 3);
arguments 的应用其实很多,如果要总结这些场景的话,暂时能想到的包括:
- 参数不定长
- 函数柯里化
- 递归调用
- 函数重载