JavaScript的类数组
类数组对象啊,被人问到它跟真正的数组对象有什么差别啊?说不上来就老埋汰了,只知道函数的arguments对象是个类数组对象,也有length属性,其他呢?干货奉上:
首先先说说数组吧:
1,当有新的元素添加到列表中时,会自动更新length属性。
2,设置length为一个较小值将截断数组。
3,从Array.prototype中继承一些有用的方法。
4,其类属性为“Array”。
这些类数组对象可以进行遍历,但是不能使用数组方法,也不用期望length属性有什么特殊的行为,看看类数组对象是怎么生成的吧?
var a = {};
var i = 0;
while(i<10){
a[i] = i*i;
i++;
}
a.length = i;
var total = 0;
for(var j = 0;j<a.length;j++){
total += a[j];
}
这里其实生成了一个对象a,里面有key,value的键值对,key值是从0到9,还有一个length属性,这个length属性是定义好的,除非手动更新,否则不变的。
之前函数的arguments对象就是一个类数组对象,在客户端javascript中,一些DOM的方法:如document.getElementsByTagName()的结果也是返回类数组对象。如何检测类数组对象呢?
首先先确定是个对象,不是null或者undefined,它的length是有限非负整数,typeof o === 'object';
好像数组也符合这个,因为类数组对象没有继承Array.prototype,应该再加上Object.prototype.toString.call(o) !== 'Array',就是个类数组对象了。
划重点!!!来来来!!!
虽然类数组对象没有继承Array.prototype,没有什么join,slice,pop,push等等方法,但是忘记call和apply神器的用法了么?代码如下:
var a = {"0":"a","1":"b","2":"c","3":"d",length:4};
Array.prototype.join.call(a,'+'); //"a+b+c"
Array.prototype.slice.call(a,0) //['a','b','c','d'],真正数组的副本啊
这里出个题了,怎么将一个类数组对象转化为一个真正的数组对象???
答案就是:a = Array.prototype.slice.call(a,0),再用Array.isArray(a)检测类型,true,哈哈哈哈
Part two:作为数组的字符串
字符串的行为类似于只读数组,除了用charAt()访问单个字符以外,还可以用方括号[]:
var s = 'test';
undefined
s.charAt(0) === s[0]
true
方括号代替charAt()更加简洁,可读并且高效。
也可以用数组的方法应用在字符串上面:
Array.prototype.join.call(s,",")
"t,e,s,t"
注意:字符串是不可变值,当做数组看待时候,只读。所以,push,sort,reverse,splice等在字符串上面是无效的。而且尝试用会报错。
JavaScript的类数组的更多相关文章
- JavaScript arguments类数组
1. 什么是类数组 arguments 是一个类数组对象.代表传给一个function的参数列表. 我们来传一个实例. function printArgs() { console.log(argu ...
- javascript:类数组 -- 对象
在javascript中,对象与数组都是这门语言的原生规范中的基本数据类型,处于并列的位置. 类数组:本质是一个对象,只是这个 对象 的属性有点特殊,模拟出数组的一些特性. 一般来说,如果我们有一个 ...
- javascript中关于数组的一些鄙视题
一.判断一个数组中是否有相同的元素 /* * 判断数组中是否有相同的元素的代码 */ // 方案一 function isRepeat1(arrs) { if(arrs.length > 0) ...
- 简述JavaScript对象、数组对象与类数组对象
问题引出 在上图给出的文档中,用JavaScript获取那个a标签,要用什么办法呢?相信第一反应一定是使用document.getElementsByTagName('a')[0]来获取.同样的,在使 ...
- Javascript 类数组(Array-like)对象
Javascript中的类数组对象(Array-like object)指的是一些看起来像数组但又不是数组的对象.Javascript中的arguments变量.document.getElement ...
- JavaScript类数组对象参考
JavaScript和DOM中有很多类数组对象,它们有以下特点 1.有length属性 2.可以使用[]通过下标访问 3.部分类数组对象使用[]访问成员时不只可以使用下标,还可以使用id或name 4 ...
- 浅谈JavaScript和DOM中的类数组对象
JavaScript是一门弱类型语言,它的数据类型分为两大类:简单数据类型(5种:Undefined.Null.Boolean.Number.String)和复杂数据类型(1种:Object).Obj ...
- javascript 类数组对象
原文:https://segmentfault.com/a/1190000000415572 定义: 拥有length属性,其他属性(索引)为非负整数(对象中的所有会被当做字符串来处理,这里你可以当做 ...
- JavaScript数组&类数组转换
一.数组 在JavaScript中数组可以容纳任何类型的值,可以是数字.字符串.对象.甚至其他数组(多为数组) var a = [1,'2',[3]]; a.length;//3 a[0];//1 a ...
随机推荐
- ORs-5-OR Subgenomes Variation among Birds, Sea Turtle and Alligator
OR Subgenomes Variation among Birds, Sea Turtle and Alligator 由 该图数据计算每种鸟的relative percentage,得到下图: ...
- continuing|offensive
the fact of something continuing for a long period of timewithout being changed or stopped 连续性,持续性,连 ...
- 3dmax2013卸载/安装失败/如何彻底卸载清除干净3dmax2013注册表和文件的方法
3dmax2013提示安装未完成,某些产品无法安装该怎样解决呢?一些朋友在win7或者win10系统下安装3dmax2013失败提示3dmax2013安装未完成,某些产品无法安装,也有时候想重新安装3 ...
- 概率/期望DP初步——BZOJ1415 聪聪和可可
期望相关: 数学期望,可以简单理解的加权平均数.设有一系列的值$x_i$,每个值被取到的概率为$p_i$,则期望$E=\sum\limits_{i=1}^n p_i x_i$. 期望具有线性性:$$E ...
- flink分层 api
最底层的processFunction 功能强大,使用复杂 中间层的DataSet api map reduce ...一些基本运算api 中上层的tableAPI 最上层 SQL 两个相似,只是写法 ...
- [LC] 28. Implement strStr()
Implement strStr(). Return the index of the first occurrence of needle in haystack, or -1 if needle ...
- C# SerialPort 读写三菱FX系列PLC
1:串口初始化 com = , Parity.Even, , StopBits.One); 2:打开关闭串口 if (com.IsOpen) { com.Close();//关闭 } com.Open ...
- caffe之mac环境下通过XCode调试C++程序
caffe log输出参考:http://blog.csdn.net/langb2014/article/details/50482150mac下用xcode开发caffe:http://coldmo ...
- struts2和springmvc比较1
其实都是ssh只是一个是struts2+spring3.0+hibernate,而另外一个是 springmvc+spring3.0+hibernate,纵向来看比较struts2和springmvc ...
- django models 中choices之用法举例
CHOICES常用做单选属性,下面举例在django models中人物性别的用法: 我们先定义一个模型,名字为Students ,这个Students 包含了名字和性别两个字段,代码如下: from ...