执行结果是必威,   译文出处

结论

一言以蔽之,关于arguments对象急需谨记的一部分重伟绩务有:

  • arguments对象的长度等于传递给函数的参数的数额。
  • arguments对象是看似数组的指标,但不是JavaScript数组。
  • 你不可能对arguments对象使用别的JavaScript数组方法,比方push,pop,slice等等。
  • JavaScript arguments对象索引从零开首。所以率先个参数将被arguments[0]引用,第1个参数将被arguments[1]引用,等等。

总结地说,JavaScript arguments对象是八个像样数组的指标,它引用传递给函数的参数。在ECMAScript 6中,引进的rest参数现已被普及用来代替函数中的arguments对象用于变量数或参数。

在这一个“轻便JavaScript”连串的下一篇著作中,大家将介绍JavaScript函数中的类。

1 赞 收藏 评论

必威 1

function add(num1, num2) {

    var arg = Array.prototype.slice.call(arguments);

    console.log(arg.pop());

}

如您所见,arguments对象用于访谈未知或可变的函数参数。就算arguments使用length属性和方括号,它亦非三个着实的JavaScript数组。你不可能对arguments对象使用别的JavaScript数组方法,如pop,push,slice等。在行使arguments时存在的一对标题是:

2.1 arguments length

arguments 是个类数组对象,其包含一个 length 属性,可以用 arguments.length 来获得传播函数的参数个数。

JavaScript

function func() { console.log("The number of parameters is " + arguments.length); } func(); func(1, 2); func(1, 2, 3);

1
2
3
4
5
6
7
function func() {
    console.log("The number of parameters is " + arguments.length);
}
 
func();
func(1, 2);
func(1, 2, 3);

施行结果如下:

JavaScript

The number of parameters is 0 The number of parameters is 2 The number of parameters is 3

1
2
3
The number of parameters is 0
The number of parameters is 2
The number of parameters is 3

可以设置arguments对象

你能够在arguments对象数组中安装一定的项。首先,你能够使用索引0设置数组的第一个项,如下所示:

function add(num1, num2) { arguments[0] = 15; var res = num1 + num2; return res; } var r = add(7, 8); console.log(r);

1
2
3
4
5
6
7
function add(num1, num2) {
    arguments[0] = 15;
    var res = num1 + num2;
    return res;
}
var r = add(7, 8);
console.log(r);

在add函数中,num1和arguments[0]援用一样的值。所以,当您更新arguments[0]时,num1的值也会被更新。对于地点的代码,输出将是23。

 

 

3.3 暗中同意参数

栗子:

JavaScript

function func(firstArg = 0, secondArg = 1) { console.log(arguments[0], arguments[1]); console.log(firstArg, secondArg); } func(99);

1
2
3
4
5
6
function func(firstArg = 0, secondArg = 1) {
    console.log(arguments[0], arguments[1]);
    console.log(firstArg, secondArg);
}
 
func(99);

推行结果是:

JavaScript

99 undefined 99 1

1
2
99 undefined
99 1

足见,暗许参数对 arguments 没有影响,arguments 依旧单独意味着调用函数时所盛传的富有参数。

轻巧学习 JavaScript (4):函数中的 arguments 对象

2017/11/11 · JavaScript · arguments

原稿出处: Dhananjay Kumar   译文出处:码农网 – 小峰   

JavaScript函数具有像数组同样的目的,这么些指标称为arguments,与传递给函数的参数相对应。传递给JavaScript函数的具有参数都能够利用arguments对象来援引。

今后大家开端上学,留意看上面列出的代码:

function add(num1, num2) { var res = num1 + num2; return res; } var r = add(7, 8); console.log(r);

1
2
3
4
5
6
function add(num1, num2) {
    var res = num1 + num2;
    return res;
}
var r = add(7, 8);
console.log(r);

在下边包车型客车函数中,num1和num2是多个参数。你能够运用名称为num1和num2的arguments来引用这么些参数。除了arguments名称之外,你还能动用JavaScript数组,如目的arguments来援引它们。所以,上边的函数能够重写,如下所示:

function add(num1, num2) { var res = arguments[0] + arguments[1]; return res; } var r = add(7, 8); console.log(r);

1
2
3
4
5
6
function add(num1, num2) {
    var res = arguments[0] + arguments[1];
    return res;
}
var r = add(7, 8);
console.log(r);

在JavaScript函数中,arguments对象用于采访或引用传递给函数的具备参数。arguments对象是可用于函数的一些变量。arguments对象的尺寸约等于传递给函数的arguments数量。请看上边包车型大巴代码,作为出口将获得2,因为有四个arguments传递给函数:

function add(num1, num2) { var res = arguments.length; return res; } var r = add(7, 8); console.log(r);

1
2
3
4
5
6
function add(num1, num2) {
    var res = arguments.length;
    return res;
}
var r = add(7, 8);
console.log(r);

你能够在arguments对象数组中设置一定的项。首先,你能够使用索引0设置数组的首先个项,如下所示:

JavaScript函数能够运用狂妄数量的参数。与别的语言(如C#和Java)分歧,你能够在调用JavaScript函数时传递猖狂数量的参数。JavaScript函数允许未分明的数量的函数参数。在ECMAScript 6此前,JavaScript有二个变量来访谈那么些未知或可变数目标参数,那是三个近似数组的指标,并非三个数组。细想以下代码来精晓arguments变量:

JavaScript arguments 对象详解

2016/10/24 · JavaScript · arguments

原稿出处: CompileYouth   

arguments对象不是纯数组

JavaScript的arguments对象不是从头到尾的JavaScript数组。你无法对arguments对象试行诸如push,pop,slice等操作。正如您将要底下列出的代码中所见到的那样,推行push操作会抓住那个,因为arguments.push不是函数。

function add(num1, num2) { arguments.push(78); var res = num1 + num2; return res; }

1
2
3
4
5
function add(num1, num2) {
    arguments.push(78);
    var res = num1 + num2;
    return res;
}

function add(num1, num2) {

    var res = arguments.length;

    return res;

}

var r = add(7, 8);

console.log(r);

 

3. ES6 中的 arguments

将arguments对象变换为数组

正如小编辈在那篇作品中介绍的那样,JavaScript函数arguments对象不是纯数组。除了长度属性外,它从不其余另外属性。但是,你能够动用Array.prototype.slice.call将arguments对象转变为数组,如下所示:

function add(num1, num2) { var arg = Array.prototype.slice.call(arguments); console.log(arg.pop()); }

1
2
3
4
function add(num1, num2) {
    var arg = Array.prototype.slice.call(arguments);
    console.log(arg.pop());
}

在ECMAScript 6中,你可以将arguments对象调换为四个数组,如下所示:

function add(num1, num2) { var arg = Array.from(arguments); console.log(arg.pop()); }

1
2
3
4
function add(num1, num2) {
    var arg = Array.from(arguments);
    console.log(arg.pop());
}

 

function add(){

    var result class="Apple-converted-space"> = class="Apple-converted-space"> 0;

    for(let class="Apple-converted-space"> i=0;i<arguments.length;i++){

        result = class="Apple-converted-space"> result class="Apple-converted-space"> + class="Apple-converted-space"> arguments[i];

    }

    return result;

}

var r class="Apple-converted-space"> = class="Apple-converted-space"> add(6,9,3,2);

console.log(r);

var t class="Apple-converted-space"> = class="Apple-converted-space"> add(7,56,9);

console.log(t);

4. 数组与类数组对象

数组具备一个基本特征:索引。那是平时对象所未曾的。

JavaScript

const obj = { 0: "a", 1: "b" }; const arr = [ "a", "b" ];

1
2
const obj = { 0: "a", 1: "b" };
const arr = [ "a", "b" ];

大家选拔 obj[0]arr[0] 都能收获自个儿想要的数目,但收获数据的法子实在今是昨非的。obj[0] 是利用目的的键值对存取数据,而arr[0] 却是利用数组的目录。事实上,Object 与 Array 的头一无二差异就是 Object 的本性是 string,而 Array 的目录是 number。

上边看看类数组对象。

伪数组的脾气正是长得像数组,包罗一组数据以至具备三个 length 属性,然而从未其余 Array 的措施。再具体的说,length 属性是个非负整数,上限是 JavaScript 中能正确表明的最大数字;别的,类数组对象的 length 值不可能活动改动。

什么样和谐制造贰个类数组对象?

JavaScript

function Foo() {} Foo.prototype = Object.create(Array.prototype); const foo = new Foo(); foo.push('A'); console.log(foo, foo.length); console.log("foo is an array? " + Array.isArray(foo));

1
2
3
4
5
6
7
function Foo() {}
Foo.prototype = Object.create(Array.prototype);
 
const foo = new Foo();
foo.push('A');
console.log(foo, foo.length);
console.log("foo is an array? " + Array.isArray(foo));

施行结果是:

JavaScript

["A"] 1 foo is an array? false

1
2
["A"] 1
foo is an array? false

也正是说 Foo 的躬行实践具备 Array 的保有办法,但品种不是 Array。

如若无需 Array 的富有办法,只必要某些怎么做呢?

JavaScript

function Bar() {} Bar.prototype.push = Array.prototype.push; const bar = new Bar(); bar.push('A'); bar.push('B'); console.log(bar);

1
2
3
4
5
6
7
function Bar() {}
Bar.prototype.push = Array.prototype.push;
 
const bar = new Bar();
bar.push('A');
bar.push('B');
console.log(bar);

实施结果是:

JavaScript

Bar {0: "A", 1: "B", length: 2}

1
Bar {0: "A", 1: "B", length: 2}

参考:

  1. JavaScript中的数组与伪数组的分别
  2. MDN arguments
  3. Avoid modifying or passing arguments into other functions — it kills optimization
  4. Optimization killers
  5. Why isn’t a function’s arguments object an array in Javascript?
  6. arguments 对象
  7. Advanced Javascript: Objects, Arrays, and Array-Like objects
  8. JavaScript 特殊对象 Array-Like Objects 详解
  9. What is a good way create a Javascript array-like object?

    1 赞 3 收藏 评论

必威 2

 

function add(num1, class="Apple-converted-space"> ...theArgs,num2){

    console.log(num1);

    console.log(num2);

    console.log(theArgs.length);

}

3.4 arguments 转数组

Array.from() 是个拾贰分推荐的方法,其能够将全部类数组对象调换到数组。

function add(num1, num2) {

    var res = num1 + num2;

    return res;

}

var r = add(7, 8);

console.log(r);

 

2.4 将参数从一个函数字传送递到另三个函数

上面是将参数从一个函数传递到另八个函数的推荐介绍做法。

JavaScript

function foo() { bar.apply(this, arguments); } function bar(a, b, c) { // logic }

1
2
3
4
5
6
function foo() {
    bar.apply(this, arguments);
}
function bar(a, b, c) {
    // logic
}

function add(num1, num2) {

    var arg = Array.from(arguments);

    console.log(arg.pop());

}

ECMAScript 6引进了一个新功能,Rest参数,它表示一个不解数量的参数作为函数中的八个数组。它不光将极度的参数表示为数组,还化解了arguments对象的大队人马标题。使用rest参数重写上边的add函数。

2. arguments 操作

 

 

3.2 Rest 参数

要么上栗子:

JavaScript

function func(firstArg, ...restArgs) { console.log(Array.isArray(restArgs)); console.log(firstArg, restArgs); } func(1, 2, 3);

1
2
3
4
5
6
function func(firstArg, ...restArgs) {
    console.log(Array.isArray(restArgs));
    console.log(firstArg, restArgs);
}
 
func(1, 2, 3);

推行结果是:

JavaScript

true 1 [2, 3]

1
2
true
1 [2, 3]

从地点的结果能够见见,Rest 参数表示除了路人皆知钦定剩下的参数群集,类型是 Array。

arguments对象不是纯数组

 

2.3 修改 arguments 值

在严酷形式与非严俊格局下,修改函数参数值表现的结果不等同。看上边包车型客车五个例子:

JavaScript

function foo(a) { "use strict"; console.log(a, arguments[0]); a = 10; console.log(a, arguments[0]); arguments[0] = 20; console.log(a, arguments[0]); } foo(1);

1
2
3
4
5
6
7
8
9
function foo(a) {
    "use strict";
    console.log(a, arguments[0]);
    a = 10;
    console.log(a, arguments[0]);
    arguments[0] = 20;
    console.log(a, arguments[0]);
}
foo(1);

输出:

JavaScript

1 1 10 1 10 20

1
2
3
1 1
10 1
10 20

另一个非严谨形式的事例:

JavaScript

function foo(a) { console.log(a, arguments[0]); a = 10; console.log(a, arguments[0]); arguments[0] = 20; console.log(a, arguments[0]); } foo(1);

1
2
3
4
5
6
7
8
function foo(a) {
    console.log(a, arguments[0]);
    a = 10;
    console.log(a, arguments[0]);
    arguments[0] = 20;
    console.log(a, arguments[0]);
}
foo(1);

出口结果为:

JavaScript

1 1 10 10 20 20

1
2
3
1 1
10 10
20 20

从上边的八个例证中得以看出,在严刻形式下,函数中的参数与 arguments 对象未有联系,修改多个值不会转移另一个值。而在非严酷情势下,三个会相互影响。

function add(num1, num2) {

    var res = arguments[0] + arguments[1];

    return res;

}

var r = add(7, 8);

console.log(r);

 

1. 什么是 arguments

MDN 上解释:

arguments 是三个类数组对象。代表传给二个function的参数列表。

咱俩先用一个例子直观了然下 JavaScript 中的 arguments 长什么样子。

JavaScript

function printArgs() { console.log(arguments); } printArgs("A", "a", 0, { foo: "Hello, arguments" });

1
2
3
4
5
function printArgs() {
    console.log(arguments);
}
 
printArgs("A", "a", 0, { foo: "Hello, arguments" });

实行结果是:

JavaScript

["A", "a", 0, Object]

1
["A", "a", 0, Object]

乍一看,结果是个数组,但并非的确的数组,所以说 arguments 是二个类数组的对象(想询问真正数组与类数组对象的区分能够间接翻到最终)。

再看看 arguments 表示的内容,其表示了函数施行时传出函数的装有参数。在上头的例证中,代表了流传 printArgs 函数中的多个参数,能够分级用 arguments[0]arguments[1]… 来博取单个的参数。

function add(num1, num2) {

    arguments[0] = 15;

    var res = num1 + num2;

    return res;

}

var r = add(7, 8);

console.log(r);

你可以将rest参数定义为…theArgs或… args。借使最后命名的函数参数以…(八个点)作为前缀,那么它将改成函数的rest参数。JavaScript函数的rest参数是纯JavaScript数组。在上头的代码中,…theArgs是函数add的rest参数,因为它是并世无两的命名参数,且也以…(四个点)作为前缀。由于rest参数是JavaScript数组,所以您能够对rest参数theArgs执行诸如push,pop等操作,如下边的代码所示:

2.2 arguments 转数组

经常说来接纳上边包车型地铁点子来将 arguments 转变来数组:

JavaScript

Array.prototype.slice.call(arguments);

1
Array.prototype.slice.call(arguments);

再有二个更简约的写法:

JavaScript

[].slice.call(arguments);

1
[].slice.call(arguments);

在此处,只是轻松地调用了空数组的 slice 方法,而未有从 Array 的原型层面调用。

为啥下边三种方法能够调换呢?

首先,slice 方法取得的结果是贰个数组,参数就是arguments。事实上,满意一定原则的靶子都能被 slice 方法调换来数组。看个例证:

JavaScript

const obj = { 0: "A", 1: "B", length: 2 }; const result = [].slice.call(obj); console.log(Array.isArray(result), result);

1
2
3
const obj = { 0: "A", 1: "B", length: 2 };
const result = [].slice.call(obj);
console.log(Array.isArray(result), result);

实行结果是:

JavaScript

true ["A", "B"]

1
true ["A", "B"]

从上边例子能够看见,条件就是: 1) 属性为 0,1,2…;2) 具备 length 属性;

其余,有二个供给注意的地点正是,无法将函数的 arguments 走漏或然传递出去。什么意思呢?看上边包车型客车多少个败露 arguments 的例子:

JavaScript

// Leaking arguments example1: function getArgs() { return arguments; } // Leaking arguments example2: function getArgs() { const args = [].slice.call(arguments); return args; } // Leaking arguments example3: function getArgs() { const args = arguments; return function() { return args; }; }

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// Leaking arguments example1:
function getArgs() {
    return arguments;
}
 
// Leaking arguments example2:
function getArgs() {
    const args = [].slice.call(arguments);
    return args;
}
 
// Leaking arguments example3:
function getArgs() {
    const args = arguments;
    return function() {
        return args;
    };
}

上边的做法就平昔将函数的 arguments 对象泄透露来了,最终的结果就是 V8 引擎将会跳过优化,导致比极大的性格损失。

你能够这么做:

JavaScript

function getArgs() { const args = new Array(arguments.length); for(let i = 0; i < args.length; ++i) { args[i] = arguments[i]; } return args; }

1
2
3
4
5
6
7
function getArgs() {
    const args = new Array(arguments.length);
    for(let i = 0; i < args.length; ++i) {
        args[i] = arguments[i];
    }
    return args;
}

那就很好奇了,大家每一遍使用 arguments 时通常第一步都会将其转移为数组,同不常间 arguments 使用不当还易于导致品质损失,那么为何不将 arguments 直接设计成数组对象呢?

那亟需从那门语言的一上马谈到。arguments 在语言的前期就引进了,那时候的 Array 对象具有 4 个艺术: toString、 join、 reverse 和 sort。arguments 承袭于 Object 的非常的大原因是无需这多少个方法。而未来,Array 增添了累累强劲的方法,举例 forEach、map、filter 等等。那为啥今后不在新的版本里让 arguments 重新传承自 Array呢?其实 ES5 的草案中就富含这点,但为了向前宽容,最终依然被委员会否决了。

本文由必威发布于必威-前端,转载请注明出处:执行结果是必威,   译文出处

相关阅读