一、 伪数组/类数组对象
1. 伪数组介绍
伪数组是对象、不是数组。它可以 「通过索引属性(非负数)访问元素」 并且 「具有 length 属性」 的 对象。
伪数组对象和数组性质相似,在访问、赋值、获取长度上的操作与数组一致,但类数组对象不能直接使用数组的方法!
伪数组的意义在于,让普通的对象也能正常使用数组方法。
var obj = {
0: 'a',
1: 'b',
length: 2 // length属性不是动态值,不能随成员数量变化
};
// 对应的数组为 ['a', 'b']
obj[0] // 访问,a
obj[0] = 'new_a' // 赋值
obj.length // 获取长度,2
2. 四种将伪数组转换成数组的方法
(1)推荐用 Array.prototype.slice.call(obj) 转换,该方法不会改变原来的伪数组对象!
let arrayLike = {
0: 'a',
1: 'b',
length: 2
};
let arr = Array.prototype.slice.call(arrayLike);
console.log(arr); // ['a', 'b']
(2)[].slice.call(),效率不如上面的。
(3)ES6 的Array.from()
(4)ES6 的展开运算符
let arr = [...arguments]
3. 常见的伪数组
- arguments 对象
- 字符串
- DOM 的 children 属性,获取子节点集合。
二、arguments 对象
1. arguments 对象介绍
函数内部用于存储实参的一个对象,是有顺序的。
当调用函数时没有提供与形参对应的实参时,该参数会默认设置为undefined。
// 没有传入实参 && 函数内局部变量与形参同名(无实参所以undefined)
function test(x, y) {
var x = 1;
console.log(arguments[0]); // undefined
}
test();
// 传入实参 && 函数内局部变量与形参同名(相当于二次赋值,修改了实参)
function test(x, y) {
var x = 1;
console.log(arguments[0]); // 1
}
test(2);
// 传入实参 && 直接修改实参
function test(x, y) {
x = 1;
console.log(arguments[0]); // 1
}
test(2);
2. 字节经典面试题
var length = 1;
function fn () {
console.log(this.length);
}
var obj = {
length:2,
method:function (fn) {
console.log(this.length); // 2
fn(); // 1
arguments[0](); //1,原因见下
}
};
obj.method(fn);
arguments 为,
arguments = {
0: fn,
length: 1
}
// 实际就是
arguments = {
0: function fn () {
console.log(this.length);
},
length: 1 // this.length 实际就是arguments对象的length属性!
}