类数组对象和arguments #94
Anuluca Date : 2021-01-14 Tags : 2
类数组对象
拥有一个length属性和其他若干键值对的对象。
1 2 3 4 5 6 7 8
| var exeggutor = ['tamako1', 'tamako2', 'tamako3'];
var exeggutor_alolan = { 0: 'tamako1', 1: 'tamako2', 2: 'tamako3', length: 3 }
|
类数组对象和数组的相似之处
读写:
1 2 3 4 5
| console.log(exeggutor[0]); console.log(exeggutor_alolan[0]);
exeggutor[0] = 'ditto'; exeggutor_alolan[0] = 'ditto';
|
长度:
1 2
| console.log(exeggutor.length); console.log(exeggutor_alolan.length);
|
遍历:
1 2 3 4 5 6
| for(var i = 0, len = exeggutor.length; i < len; i++) { …… } for(var i = 0, len = exeggutor_alolan.length; i < len; i++) { …… }
|
可以看到,在读写、获取长度、遍历,数组的使用方法和类数组对象的使用方法完全一样。
但数组可以使用的其他方法,类数组对象不能使用
1 2
| exeggutor.push('4'); exeggutor_alolan.push('4');
|
类数组调用数组方法
如果类数组一定要用数组方法,可以使用Function.call()间接调用
1 2 3 4 5 6 7 8 9 10 11
| var exeggutor_alolan = {0: 'tamako1', 1: 'tamako2', 2: 'tamako3', length: 3 }
Array.prototype.join.call(exeggutor_alolan, '&');
Array.prototype.slice.call(exeggutor_alolan, 0);
Array.prototype.map.call(exeggutor_alolan, function(item){ return item.toUpperCase(); });
|
类数组转数组
在上面的例子中已经提到了一种类数组转数组的方法,这里再补充三个:
1 2 3 4 5 6 7 8 9
| var exeggutor_alolan = {0: 'tamako1', 1: 'tamako2', 2: 'tamako3', length: 3 }
Array.from(exeggutor_alolan);
Array.prototype.slice.call(exeggutor_alolan);
Array.prototype.splice.call(exeggutor_alolan, 0);
Array.prototype.concat.apply([], exeggutor_alolan)
|
Arguments对象
Arguments对象定义在函数体中,包括函数的参数和其他属性,在函数体本身,arguments指代Arguments对象。
1 2 3 4
| function trigger(name, age, sex) { console.log(arguments); } trigger('name', 'age', 'sex')
|
控制台输出:
可以看到除了类数组的索引属性和length属性之外,还有一个callee属性
length属性
length属性表示实参的长度:
1 2 3 4 5 6 7 8 9 10
| function foo(b, c, d){ console.log("实参的长度为:" + arguments.length) }
console.log("形参的长度为:" + foo.length)
foo(1)
|
callee属性
Arguments对象的callee属性,通过它可以调用函数自身
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| function foo(name, age, sex, hobbit) { console.log(name, arguments[0]);
name = 'new name'; console.log(name, arguments[0]);
arguments[1] = 'new age'; console.log(age, arguments[1]);
console.log(sex); sex = 'new sex'; console.log(sex, arguments[2]);
arguments[3] = 'new hobbit'; console.log(hobbit, arguments[3]);
}
foo('name', 'age')
|
传递arguments
在严格模式下,实参和 arguments 不会共享。
1 2 3 4 5 6 7 8 9
| function foo() { bar.apply(this, arguments); } function bar(a, b, c) { console.log(a, b, c); }
foo(1, 2, 3)
|
将arguments转为数组
使用 …运算符,将arguments转为数组
1 2 3 4 5
| function func(...arguments) { console.log(arguments); }
func(1, 2, 3);
|