Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

JavaScript深入之类数组对象与arguments #39

Open
yangtao2o opened this issue Mar 30, 2020 · 0 comments
Open

JavaScript深入之类数组对象与arguments #39

yangtao2o opened this issue Mar 30, 2020 · 0 comments

Comments

@yangtao2o
Copy link
Owner

类数组对象与 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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant