类数组及其转换

什么是类数组

? 宽泛点讲,一个具有length属性的对象就是类数组,但类数组顾名思义它只是像数组但又不是数组,所以它往往不具备数组自带的方法,如forEach(), push(), shift()等等

? 在JavaScript的世界里有许许多多的类数组,如NodeList, HTMLCollection, NameNodeMap, DOMTokenList,还有函数中的arguments...它们都是具有length的对象

类数组转化成数组

? 上面说了类数组只是长得像数组但不具备好些数组所具有的方法,因此操作起来并不方便因此我们可以将他们转化为数组

// ES3,5
Array.prototype.slice.call(arrlike) //or apply
Array.apply(null, arrlike) // apply的第二个参数接受一个数组或者类数组

// ES6
Array.from(arrlike)

[...arrlike] // 前提是这个arrlike得具备迭代器接口[Symbol.iterator]。而以上三种有length即可

? 之前说了类数组是具有length属性的对象,其实这样定义并不确切。因为还有里面有要需要注意的地方,数组是以数值作为下标的,但是按照之前的定义类数组只是有length属性的话其实看起来不像是数组,它的属性有可能不是数值形式的字符串。当然数组也是可以定义非数值类型的字符串作为属性的,毕竟数组本身也是对象,但是它的主要还是以数值下标的形式来存储数据,且那些属性并不被计入length中

? 因此类数组在转化为数组的时候,如果对象中的属性并不是数值形式的字符串,或者数值要大于等于length,对应的数据都是不会被存储到创建的数组中的

空缺的是以undefined填充而不是empty空单元

const arrlike1 = { 0: ‘a‘, 1: ‘b‘, ‘2‘: ‘c‘, length: 3 }
console.log(Array.from(arrlike1)) // [‘a‘, ‘b‘, ‘c‘]

const arrlike2 = {  0: ‘a‘, ‘a‘: ‘b‘, ‘2‘: ‘c‘, length: 3 }
console.log(Array.from(arrlike2)) // [‘a‘, undefined , ‘c‘]

const arrlike3 = {  1: ‘a‘, length: 1 }
console.log(Array.from(arrlike3)) // [undefined]

原文地址:https://www.cnblogs.com/guanine/p/9216967.html

时间: 2024-10-14 15:53:32

类数组及其转换的相关文章

求平均数-----类数组转换成数组

求平均数的代码function avgFn() { 首先把arguments转化为数组 var ary = []; for (var i = 0; i < arguments.length; i++) { ary.push(arguments[i]); ary[ary.length] = arguments[i]; } 数组排序 ary.sort(function (a, b) { return a - b; }); 掐头去尾 ary.unshift(); ary.pop(); 求和求平均值,小

数组/矩阵转换成Image类

Python下将数组/矩阵转换成Image类 原创 2017年04月21日 19:21:27 标签: python / 图像处理 3596 先说明一下为什么要将数组转换成Image类.我处理的图像是FITS (Flexible Image Transport System)文件,是一种灰度图像文件,也就是单通道图像.FITS图像的特点是灰度值取值为0~65535,这类图像在python下读成数组首先是不能直接转换成位图,也就不能用OpenCV.Image等方法了.如果是普通的jpg图像,用自带的

Array.from()方法就是将一个类数组对象或者可遍历对象转换成一个真正的数组。

详解:https://www.cnblogs.com/jf-67/p/8440758.html Array.from()方法就是将一个类数组对象或者可遍历对象转换成一个真正的数组. 1. let arrayLike = { 0: 'tom', 1: '65', 2: '男', 3: ['jane','john','Mary'], 'length': 4 } let arr = Array.from(arrayLike) console.log(arr) // ['tom','65','男',['

C#中自定义类数组和结构数组的使用

如有雷同,不胜荣幸,若转载,请注明 最近在很多项目中发现很多时候给定的数组要实现某个逻辑或处理很是麻烦,一维数组,二维数组,,,等等需要经过n多转换,还不如自己写一个自定义数组,既方便又节省时间,以下是类数组,其实相当于定义了一个实体类一样,只是使用的时候写成数组的形式在用 Class RGB { public byte red; public byte green; public byte blue; public RGB(byte r,byte g,byte b) { this.red =

js类数组转数组的方法(ArrayLike)

1. 什么是类数组ArrayLike 拥有length属性,其它属性(索引)为非负整数(对象中的索引会被当做字符串来处理,这里你可以当做是个非负整数串来理解) 不具有数组所具有的方法 //类数组示例 var a = {'1':'gg','2':'love','4':'meimei',length:5}; Array.prototype.join.call(a,'+');//'+gg+love++meimei' //非类数组示例 var c = {'1':2}; //没有length属性就不是类数

观V8源码中的array.js,解析 Array.prototype.slice为什么能将类数组对象转为真正的数组?

在官方的解释中,如[mdn] The slice() method returns a shallow copy of a portion of an array into a new array object. 简单的说就是根据参数,返回数组的一部分的copy.所以了解其内部实现才能确定它是如何工作的.所以查看V8源码中的Array.js     可以看到如下的代码: 一.方法  ArraySlice,源码地址,直接添加到Array.prototype上的"入口",内部经过参数.类型

[Effective JavaScript 笔记]第58条:区分数组对象和类数组对象

示例 设想有两个不同类的API.第一个是位向量:有序的位集合 var bits=new BitVector(); bits.enable(4); bits.enable([1,3,8,17]); bits.bitAt(4);//1 bits.bitAt(8);//1 bits.bitAt(9);//0 enable方法被重载了,可以传入一个索引或索引的数组.第二个类的API是字符串集合:无序的字符串集合 var set=new StringSet(); set.add('Hamlet'); se

数组原型方法调用及函数apply调用时 类数组参数在IE8下的问题

当函数以 apply 方式调用时, 传参方式是一个由各个参数组成的数组或类数组(一个有length属性的对象),传入参数个数取决于 length 的值,例如,某个对象 args.length=3; apply 会将 args[0],args[1],args[2] 三个参数传入,如果对应的值不存在则传入了undefined. 例如: function f(a,b,c){ console.log(a,b,c);} f.apply(null,{0:123,1:456,2:789,length:2});

Javascript 类数组(Array-like)对象

Javascript中的类数组对象(Array-like object)指的是一些看起来像数组但又不是数组的对象.Javascript中的arguments变量.document.getElementsByTagName()返回值就是典型的类数组对象. 类数组特性 类数组对象具有一个length属性且length的值为非负整数. 类数组对象不具有数组对象的方法.例如:push. pop等方法. 类数组对象可以像数组一样遍历,但不支持数组对象的方法. function test1() { for(