learn icon indicating copy to clipboard operation
learn copied to clipboard

JavaScript深入之类数组对象与arguments

Open yangtao2o opened this issue 4 years ago • 0 comments

类数组对象与 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 的应用其实很多,如果要总结这些场景的话,暂时能想到的包括:

  • 参数不定长
  • 函数柯里化
  • 递归调用
  • 函数重载

原文链接:JavaScript 深入之类数组对象与 arguments

yangtao2o avatar Mar 30 '20 10:03 yangtao2o