JavaScript 类数组对象与 arguments

作者: 淘淘笙悦 | 来源:发表于2018-11-09 18:28 被阅读0次

在 JavaScript 中存在一种特殊的对象,我们称之为类数组对象,其性质与数组相似。我们经常会遇到各种类数组对象,最常见的便是 argumengs。

类数组对象

所谓类数组对象,就是指可以通过索引属性访问元素并且拥有 length 属性的对象。

一个简单的类数组对象是长这样的

var arrLike = {
  0: 'name',
  1: 'age',
  2: 'job',
  length: 3
}

而它所对应的数组应该是这样子的

var arr = ['name', 'age', 'job'];

我们说类数组对象与数组的性质相似,是因为类数组对象在访问赋值获取长度上的操作与数组是一致的。

数组与类数组对象的访问

console.log(arr[0]); // name
console.log(arrLike[0]); // name

数组与类数组对象的赋值

arr[0] = 'new name';
arrLike[0] = 'new name';

获取数组与类数组对象的长度

console.log(arr.length); // 3
console.log(arrLike.length); // 3

可以看出,在访问、赋值、获取长度时,对类数组对象的操作与对数组是一致的。那么,类数组对象与数组的区别是在哪里呢?

类数组对象与数组的区别是类数组对象不能直接使用数组的方法。

如下类数组对象使用数组方法时会报错

arrLike.push('hobby');  // Uncaught TypeError: arrLike.push is not a function

那么我们希望类数组对象能够和数组一样使用数组的方法,应该怎么做呢?我们一般是通过 Function.call 或者 Function.apply 方法来间接调用。

// 使用 call
Array.prototype.push.call(arrLike, 'hobby');
console.log(arrLike); // { '0': 'name', '1': 'age', '2': 'job', '3': 'hobby', length: 4 }
var arrLikeStr = Array.prototype.join.call(arrLike, '&')
console.log(arrLikeStr); // name&age&job&hobby
// 使用 apply
Array.prototype.push.apply(arrLike, ['hobby']);
console.log(arrLike); // { '0': 'name', '1': 'age', '2': 'job', '3': 'hobby', length: 4 }
var arrLikeStr = Array.prototype.join.apply(arrLike, ['&'])
console.log(arrLikeStr); // name&age&job&hobby

在实际的开发过程中,为了方便对数据的操作,我们还经常会通过 Array.prototype.slice 或 Array.prototype.splice 等方法把类数组对象转换成真正的数组。

// 使用 call
console.log(Array.prototype.slice.call(arrLike,0));
console.log(Array.prototype.splice.call(arrLike,0));  // 会改变原先的类数组对象
// 使用 apply
console.log(Array.prototype.slice.apply(arrLike,[0]));
console.log(Array.prototype.splice.apply(arrLike,[0]));  // 会改变原先的类数组对象

需要注意的是,Array.prototype.slice 方法不会改变原先类数组对象,而 Array.prototype.splice 会改变原先的类数组对象,这一点跟数组调用 slice 或 splice 方法时的行为是一致的。

arguments

在函数体中定义了 Arguments 对象,其包含函数的参数和其它属性,以 arguments 变量来指代。

举个例子

function fn(name, age, job) {
    console.log(arguments);
}

fn('ttsy', '25', 'front end')

在控制台上我们可以看到上述函数打印的结果如下

可以看到 arguments 中包含了函数传递的参数、length、和 callee 属性。

length 属性表示的是实参的长度,即调用函数的时候传入的参数个数。

function fn(name, age, job) {
    console.log(arguments.length);  // 2
}

fn('ttsy', '25')

callee 属性则指向的函数自身,我们可以通过它来调用自身函数。

arguments 是一个经典的类数组对象,我们可以通过上述的 Function.call 或者 Function.apply 方法来间接调用数组的方法,也可以直接通过 Array.prototype.slice 或 Array.prototype.splice 等方法把类数组对象转换成真正的数组。

相关文章

  • JavaScript 类数组对象与 arguments

    在 JavaScript 中存在一种特殊的对象,我们称之为类数组对象,其性质与数组相似。我们经常会遇到各种类数组对...

  • JavaScript深入之类数组对象与arguments

    已离开简书,原因参见 http://www.jianshu.com/p/0f12350a6b66。 虽人微言轻,但...

  • JS 类数组对象arguments和数组对象的区别

    一、类数组对象的定义: 1)拥有length属性,其它属性(索引)为非负整数(对象中的索引会被当做字符串来处理);...

  • JavaScript 类数组对象

    定义 JavaScript 类数组对象的定义: 可以通过索引访问元素,并且拥有 length 属性; 没有数组的其...

  • Javascript类数组对象

    类数组对象,意思就是说:表面上看起来是数组,但内在却不是数组。在Javascript语言中,我们会碰到许多这样的类...

  • JavaScript中的arguments对象

    JavaScript中的arguments对象 arguments 是一个类似数组的对象, 对应于传递给函数的参数...

  • 对Javascript 类数组对象的理解与应用 | Argume

    这篇文章将要告诉你: 什么是类数组对象 类数组对象是如何出现的 如何避免使用类数组对象的常见问题 将类数组对象转换...

  • 理解javascript类数组

    什么是类数组 javascript中一些看起来像却不是数组的对象,叫做类数组。也就是说,为一些常规对象增加一些属性...

  • 类数组对象解析

    一、定义 数组定义:简而言之就是一组有序的数据集合,其索引为从0开始且自然增长的整数,其元素值可以是任何js数据!...

  • JavaScript中数组对象详解

    Array对象即数组对象用于在单个变量中存储多个值,JS的数组是弱类型的,所以允许数组中含有不同类型的元素,数组元...

网友评论

    本文标题:JavaScript 类数组对象与 arguments

    本文链接:https://www.meiwen.com.cn/subject/lphzwftx.html