【前端】arguments,
【前端】arguments,
一 类数组
包含一组数据以及拥有一个 length 属性,但是没有任何 Array 的方法。类数组对象的 length 值无法自动改变。
二 arguments
arguments 是一个类数组对象。代表传给一个function的参数列表。
function printArgs() {
console.log(arguments);
}
printArgs("A", "a", 0, { foo: "Hello, arguments" }); //["A", "a", 0, Object]
再看看 arguments 表示的内容,其表示了函数执行时传入函数的所有参数。
arguments.length 表示传入的个数
三 arguments操作
1.arguments转数组
- Array.prototype.slice.call(arguments);
- [].slice.call(arguments);
- Array.from()
2.修改 arguments 值
在严格模式下,函数中的参数与 arguments 对象没有联系,修改一个值不会改变另一个值。而在非严格模式下,两个会互相影响。
严格模式下:
function foo(a) {
"use strict";
console.log(a, arguments[0]); //1 1
a = 10;
console.log(a, arguments[0]); //10 1
arguments[0] = 20;
console.log(a, arguments[0]); //10 20
}
foo(1);
非严格模式下:
function foo(a) {
console.log(a, arguments[0]); //1 1
a = 10;
console.log(a, arguments[0]); //10 10
arguments[0] = 20;
console.log(a, arguments[0]); //20 20
}
foo(1);
3.将参数从一个函数传递到另一个函数
function foo() {
bar.apply(this, arguments);
}
function bar(a, b, c) {
// logic
}
4. 扩展操作符
扩展操作符可以将 arguments 展开成独立的参数。
function func() {
console.log(...arguments);
}
func(1, 2, 3); // 1 2 3
5. 默认参数
默认参数对 arguments 没有影响
function func(firstArg = 0, secondArg = 1) {
console.log(arguments[0], arguments[1]); // 99 undefined
console.log(firstArg, secondArg); // 99 1
}
func(99);
四 注意事项
1.JS没有重载
function add(num1, num2) {
console.log("Method one");
return num1 + num2;
}
function add(num1, num2, num3) {
console.log("Method two");
return num1 + num2 + num3;
}
add(1, 2); // Method two
add(1, 2, 3); // Method two
2.不能将函数的 arguments 泄露或者传递出去
将函数的 arguments 对象泄露出去了,最终的结果就是 V8 引擎将会跳过优化,导致相当大的性能损失。
下面的例子就是把arguments泄漏了:
// Leaking arguments example2:
function getArgs() {
const args = [].slice.call(arguments);
return args;
}
我们可以这么做:
function getArgs() {
const args = new Array(arguments.length);
for(let i = 0; i < args.length; ++i) {
args[i] = arguments[i];
}
return args;
}
评论暂时关闭