如何把类数组对象转为数组对象

JavaScript高级解析:类数组对象、数组操作与数组判断技巧
本文详细讲解了JavaScript中类数组对象的概念、常见实例、转换为数组的方法,如Array.from()、slice、splice和concat,以及如何通过函数判断对象是否为类数组对象。还涵盖了稀疏数组的特点及常用的数组操作技巧。

目录

一、数组

二、对象

三、类数组对象

3.1 什么是类数组对象

3.2 js中哪些是类数组对象

3.3 类数组对象怎么转化为数组

1、Array.from()(ES6+)

2、slice

3、splice

4、concat

5、for循环依次遍历

稀疏数组 (sparse array)

3.4 怎么判断是不是类数组对象

3.5 复习一下这三种数组方法,我就没记得过

1. slice(start,end):

2、splice(index,howmany,item1,item2...):

3、concat(arr1,arr2...): 返回一个新拼接的数组,不会改变原来数组


首先先介绍一下数组和对象是啥

一、数组

数组是一个有序的数据集合,其索引值从0开始依次递增,有length属性,用于获取数组的元素个数,内部的值可以是任何js数据类型

二、对象

对象是一个无序的内部由若干键值对组成的数据集合,它没有length属性,但是我们可以通过把它内部的键改为从0开始依次递增的值来模拟数组,这样就成了类数组对象

三、类数组对象

3.1 什么是类数组对象

类数组对象首先它是一个对象,但是有数组的某些特点。怎么构造类数组对象呢?先把对象中的键都改为从0开始递增的值,然后我们需要定义一个length属性,手动模拟数组的length属性。

这样就能看出对象的length属性不会随着键的增加而增加,但是数组会随着内部元素的增加而增加。

3.2 js中哪些是类数组对象

如各种元素检索 API 返回的都是类数组,如 document.getElementsByTagNamedocument.querySelectorAll 等等。除了 DOM API 中,常见的 function 中的 arguments 也是类数组

1、argumments对象:arguments对象用于保存数组中的实参,可以直接通过arguments[0]访问函数的第一个实参

2、document.getElementsByTagName()、document.:返回一个类数组对象

3、字符串String:一个可读的类数组对象,可以通过str[0]获取第一个字符,str.length获取字符串的长度

3.3 类数组对象怎么转化为数组

一共有5种方法:

1、Array.from()(ES6+)

// [undefined, undefined, undefined]
Array.from({ length: 3 })

除了 Array.from 还有更简单的运算符 ... 扩展运算符,不过它只能作用于 iterable 对象,即拥有 Symbol(Symbol.iterator) 属性值

拥有 Symbol(Symbol.iterator) 属性值,意味着可以使用 for of 来循环迭代

// 适用于 iterable 对象
[...document.querySelectorAll('div')]

但是严格意义上来说,它不能把类数组转化为数组,如 { length: 3 }。它将会抛出异常

// Uncaught TypeError: object is not iterable (cannot read property Symbol(Symbol.iterator))
[...{length: 3}]

在 ES5 中可以借用 Array API 通过 call/apply 改变 this 或者 arguments 来完成转化。

最常见的转换是 Array.prototype.slice

2、slice

var arrObj = { 0: 'dog', 1: 'cat', 2: 'rabbit', 'length': 3 }
 
Array.prototype.slice.call(arrObj)

3、splice

Array.prototype.splice.call(arrObj, 0)

4、concat

Array.prototype.concat.apply([], arrObj)

5、for循环依次遍历


 var arr = []

for(var i = 0; i < arrObj.length; i++) {
    arr.push(arrObj[i])
}
console.log(arr)
 
// ["dog", "cat", "rabbit"]

当然由于借用 Array API,一切以数组为输入,并以数组为输出的 API 都可以来做数组转换,如

  • Array (借用 arguments)
  • Array.prototype.concat (借用 arguments)
  • Array.prototype.slice (借用 this)
  • Array.prototype.map (借用 this)
  • Array.prototype.filter (借用 this)

稀疏数组 (sparse array)

使用 Array(n) 将会创建一个稀疏数组,为了节省空间,稀疏数组内含非真实元素,在控制台上将以 empty 显示,如下所示

[,,,] 与 Array(3) 都将返回稀疏数组

> [,,,]
[empty × 3]
> Array(3)
[empty × 3]

当类数组为 { length: 3 } 时,一切将类数组做为 this 的方法将都返回稀疏数组,而将类数组做为 arguments 的方法将都返回密集数组


3.4 怎么判断是不是类数组对象

const MAX_SAFE_INTEGER = 9007199254740991 
// 能够被“安全”呈现的最大整数是 2^53 - 1
// 在ES6中被定义为Number.MAX_SAFE_INTEGER
// 最小整数是 -9007199254740991,ES6中被定义为 Number.MIN_SAFE_INTEGER

 javascript权威指南方法:

function isArrayLike(o) {
    if(o &&                                    // o不是null、undefined等
       typeof o === 'object' &&                // o是对象
       isFinite(o.length) &&                   // o.length是有限数值
       o.length >= 0 &&                        // o.length为非负值
       o.length === Math.floor(o.length) &&    // o.length是整数
       o.length < 4294967296)                  // o.length < 2^32
       return true
    else
       return false
}

3.5 复习一下这三种数组方法,我就没记得过

1. slice(start,end):

start可选,end可选;start,end都是数组索引下标,会返回start到end(不包括)元素的数组,不会改变原来数组

返回从原数组中指定开始下标到结束下标之间的项组成的新数组。slice()方法可以接受一或两个参数,即要返回项的起始和结束位置。在只有一个参数的情况下, slice()方法返回从该参数指定位置开始到当前数组末尾的所有项。如果有两个参数,该方法返回起始和结束位置之间的项——但不包括结束位置的项。

start可选,end可选;start,end都是数组索引下标,会返回start到end(不包括)元素的数组,不会改变原来数组

var fruits = ["Banana", "Orange", "Lemon", "Apple", "Mango"];
var citrus = fruits.slice(1,3);
 
//输出["Orange","Lemon"],不包括索引值为3的元素

2、splice(index,howmany,item1,item2...):

index必需,规定开始添加或删除的索引值,howmany:可选,截取几个,item1,item2...:可选,要添加的元素,会返回一个包含删除元素的数组,会改变原来数组

可以实现删除、插入和替换。返回值是删除的项构成的数组,如果未删除则返回一个空数组

删除:可以删除任意数量的项,只需指定 2 个参数:要删除的第一项的位置和要删除的项数。例如, splice(0,2)会删除数组中的前两项。

插入:可以向指定位置插入任意数量的项,只需提供 3 个参数:起始位置、 0(要删除的项数)和要插入的项。例如,splice(2,0,4,6)会从当前数组的位置 2 开始插入4和6。

 替换:可以向指定位置插入任意数量的项,且同时删除任意数量的项,只需指定 3 个参数: 起始位置、要删除的项数和要插入的任意数量的项。插入的项数不必与删除的项数相等。例 如,splice (2,1,4,6)会删除当前数组位置 2 的项,然后再从位置 2 开始插入4和6。

var fruits = ["Banana", "Orange", "Apple", "Mango"];
fruits.splice(2,1,"Lemon","Kiwi");
 
//输出:["Banana","Orange","Lemon","Kiwi","Mango"]

3、concat(arr1,arr2...): 返回一个新拼接的数组,不会改变原来数组

var hege = ["Cecilie", "Lone"];
var stale = ["Emil", "Tobias", "Linus"];
var kai = ["Robin"];
var children = hege.concat(stale,kai);
 
//输出:["Cecilie","Lone","Emil","Tobias","Linus","Robin"]
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值