基础:伪数组、arguments对象

592 阅读2分钟

一、 伪数组/类数组对象

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属性!
}