特性

/**
 * callee: 宿主函数 test
 * Symbol.iterator 可迭代对象标志
 * 
 * 类数组 Array like
 * 	有 length 从 0 开始的属性下标
 *  没有数组的内置方法(build-in methods/object)
 *
 */
function test() {
	console.log(arguments);
  console.log(arguments.toString()); // [object Arguments]
  console.log(Array.isArray(arguments)); // false
  console.log(arguments.callee);
}

test();

Untitled

可迭代对象

普通对象没有迭代器无法迭代

var obj = {
	a: 1,
  b: 2,
  c: 3
}

function * generator(args) {
	for (const item of args) {
  	yield item;
  }
}

var it = generator(obj);

it.next();

Untitled

⭐️ arguments 可以迭代

function * generator(args) {
	for (const item of args) {
  	yield item;
  }
}

function test() {
	var it = generator(arguments);
  
  console.log(it.next());
  console.log(it.next());
  console.log(it.next());
  console.log(it.next());
}

test(1, 2, 3);

Untitled

非箭头函数的其他函数的内置的局部变量

var test = () => {
	console.log(arguments);
}
test();

Untitled

改用剩余参数:

var test = (...args) => {
	console.log(args);
  console.log(Array.isArray(args));
}
test(1, 2, 3);

Untitled

var test = (...args) => {
  // console.log(arguments.callee); // 直接拿 test 能拿到,不需要 .callee
  console.log(test);
}
test(1, 2, 3);

Untitled

arguments 转真数组

function test() {
  // var params = Array.prototype.slice.call(arguments); // ↓简便写法
	var params = [].slice.call(arguments); // 把 arguments 当 [] 去调用 slice
  console.log(params);
}

test(1, 2, 3);

Untitled

function test() {
	var params = arguments.length === 1 
  				? [arguments[0]] 
  				: Array.apply(null, arguments); // Array是构造函数,传递null当this,参数是arguments
  console.log(params);
}

test(1, 2, 3);

Untitled

arguments 作用

拿到实参 - 实参个数 > 形参个数

function test(a, b, c) {
	console.log(arguments[3]);
}
test(1, 2, 3, 4);

Untitled

不定参数

function add() {
	return [...arguments].reduce((pre, cur) => pre + cur, 0);
}

const res = add(1, 2, 3);
console.log(res);

Untitled

⭐️ 形实参的对应关系 - 共享关系

形参赋值的有内部作用域

形实参默认情况下会有共享关系

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

test(1);

Untitled

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

test(1);

Untitled

⭐️ 形参 - 只要有一个形参有默认值,arguments 就不跟踪形参

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

Untitled

function test(a = 100) {
	a = 10000;
  console.log(a, arguments[0]);
}
test(1);

Untitled

function test(a, b, c = 10) {
	arguments[0] = 100;
	arguments[1] = 200;
	arguments[2] = 300;
  
  console.log(a, arguments[0]);
  console.log(b, arguments[1]);
  console.log(c, arguments[2]);
}
test(1, 2, 3);

Untitled

⭐️ 形参 - 剩余参数,arguments 不跟踪

function test(...args) {
	arguments[0] = 100;
	arguments[1] = 200;
	arguments[2] = 300;
  
  console.log(args[0], arguments[0]);
  console.log(args[1], arguments[1]);
  console.log(args[2], arguments[2]);
}
test(1, 2, 3);

Untitled

⭐️ 形参 - 参数解构,arguments 不跟踪

function test({ a, b, c }) {
	arguments[0] = 100;
	arguments[1] = 200;
	arguments[2] = 300;
  
  console.log(a, arguments[0]);
  console.log(b, arguments[1]);
  console.log(c, arguments[2]);
}
test({
	a: 1,
  b: 2,
  c: 3
});

Untitled

⭐️ 严格模式下 - arguments 不跟踪

function test(a, b, c) {
	'use strict';
  
  a = 10;
  b = 20;
  c = 30;
  
  console.log(a, b, c);
  console.log([...arguments]);
}
test(1, 2, 3);

Untitled

function test(a, b, c) {
	'use strict';
  
  arguments[0] = 10;
  arguments[1] = 20;
  arguments[2] = 30;
  
  console.log(a, b, c);
  console.log([...arguments]);
}
test(1, 2, 3);

Untitled

拓展

内置方法/对象 or 内部方法