关于Javascript"数组"那点事儿
记住Javascript里没有“数组”
忘掉一切吧,骚年...
一切都是对象:书中还细分了下简单类型和对象类型
基本类型:typeof xxx => "number"数字,"boolean"布尔,"string"字符串,还有两个特殊的成员(null,undefined)
剩下的其他的是对象(有点像c#的引用类型)
不是还有个数组吗?
아니오.那个还不算真正的数组思密达。只能算是个“类数组”的假冒货,容我细细道来:
var arr;//undefined
arr=[];//typeof arr=>"object",arr.length==0
这个对象比较特殊于普通Object的一点是有个length属性
[]-这个操作符当然啦不是“数组”的专属啦
可以var b={hello:'world'};
如访问对象属性值: b['hello'] //注意这里不能b[hello]直接,意义不一样,这里hello是个表达式(单个的就是变量啦),首先会计算这个表达式(一发现变量hello未声明就报错了)。
可以实验:
b[hello]='world';//ReferenceError: hello is not defined
var hello;
b[hello]='world';//这时hello声明了,值为undefined,转换为字符串'undefined'后作为“数组”的属性名
所以console.info(b[undefined]);//会得到'world'
对于使用'hello'作为属性名的可以var k='hello';alert(b[k]);这样就可以了。所以两者意义是不一样的。
既然数组也是对象,所以也可以使用[]操作符
//先设置几个“属性”,需要注意的是对数组来说,设置属性时,如果这个属性看上去是个非负整数的话,那么如果比当前length值大的话会加一并更新给数组的length属性,数组不要求“数字索引”(不是索引,同c#之类的不太一样)连续
arr[999]='哈哈哈';//999>arr.length(==0),所以arr.length=999+1
//但实际的arr来说不存在0-998这些键,arr看上去是这样的{999:'哈哈哈',length:1000}
自行测试: (判断是不是一个对象的属性名,可以用in操作符)
999 in arr ===>返回 true
998 in arr ====>返回 false
[]操作会计算它的表达式,并调用toString()转换一个字符串作为数组对象的属性名:
arr['']=‘我是空’;//这也可以的,''不像整数不更新Length
a['10']=123;//10比1000小,length不更新
a[true]=1;//'true'做键
a[1/0]='无穷';//1/0=>'Infinity'
...都是toString()....
length也可以作为左值,可以修改的:
arr.length=10000;//改大了,其实只是修改了length属性值而已,对元素没什么影响
//好比 {....,length:10000}
并不是前面多了N多个undefine,对于浏览器插件显示的有误,如chrome的控制台
如果设置的比当前length值小,会截断:
长得比length小的“类整数"键会抹掉,如"类数组“{0:0,1:1,2:2,'true':true,8:'8',10:10,'':'empty',length:11}(注意:这里为了表达,故意用了个普通Object的形式~~)
如果length设置为7,则只有小于7的“数字”属性名保留 {0:0,1:1,2:2,'true':true,'':'empty',length:11}
当然了数组有个简洁的初始化语法 var a=[1,2,'true',undefined,false];
上面的再提示一下:
var a=[];
a.length=5;
var b=[undefined, undefined, undefined, undefined, undefined];
试试 3 in a 和 3 in b就知道区别了
还有关于”删除元素“提一下:
var a=[1,2,3];
delete a[1]; //1 in a ==false,会留下空档
和
a[1]=undefined;不一样 // 1 in a ==true
关于Javascript"数组"那点事儿的更多相关文章
- Javascript数组操作
使用JS也算有段时日,然对于数组的使用,总局限于很初级水平,且每每使用总要查下API,或者写个小Demo测试下才算放心,一来二去,浪费不少时间:思虑下,堪能如此继续之?当狠心深学下方是正道. 原文链接 ...
- Javascript数组操作(转)
1.数组的创建 var arrayObj = new Array(); //创建一个数组 var arrayObj = new Array([size]); //创建一个数组并指定长度,注意不是上限, ...
- JavaScript 数组
JavaScript 数组 简介:数组是值的有序集合,JavaScript在同一个数组中可以存放多种类型的元素,而且是长度也是可以动态调整的,可以随着数据增加或减少自动对数组长度做更改. 一:创建数组 ...
- 也谈面试必备问题之 JavaScript 数组去重
Why underscore (觉得这部分眼熟的可以直接跳到下一段了...) 最近开始看 underscore.js 源码,并将 underscore.js 源码解读 放在了我的 2016 计划中. ...
- js 判断数组包含某值的方法 和 javascript数组扩展indexOf()方法
var questionId = []; var anSwerIdValue = []; ////javascript数组扩展indexOf()方法 Array.prototype.indexOf ...
- JavaScript 数组 length 属性获取数组长度或设置数组元素的数目
JavaScript 数组 length 属性 JavaScript 数组 length 属性可返回或设置或组中元素的数目,语法如下: array_object.length 利用 length 属性 ...
- 【读书笔记】-- JavaScript数组
数组是一段线性分配的内存,它通过整数计算偏移并访问其中的元素.大多数的语言都会要求一个数组的元素是相同类型,但JavaScript数组可以包含任意类型. var misc = ['string', n ...
- 什么才是正确的javascript数组检测方式
前面的话 对于确定某个对象是不是数组,一直是数组的一个经典问题.本文专门将该问题择出来,介绍什么才是正确的javascript数组检测方式 typeof 首先,使用最常用的类型检测工具——typeof ...
- javascript数组对象排序
javascript数组对象排序 JavaScript数组内置排序函数 javascript内置的sort函数是多种排序算法的集合 JavaScript实现多维数组.对象数组排序,其实用的就是原生的s ...
随机推荐
- Netbackup备份失败:ORA-19506 ORA-27028 ORA-19511
Netbackup之前备份RAC数据一直都非常正常,突然这几天出现异常: channel ch00: starting piece 1 at 2013-11-24:18:02:32released c ...
- 如何通过PhpMyAdmin批量删除MYSQL数据库数据表
使用这个方法前,强烈建议先备份整个数据库.至于怎么备份?你不会么?在本文下方留言吧. 具体方法:复制下面的php执行语句,保存为sql.php文件(注意配置数据库名称.密码.数据表头),通过ftp上传 ...
- ScrollView 与ListView 滑动冲突完美解决
一.介绍ListView高度的设置方法 二.根据实际需求解决冲突问题 一.介绍ListView高度的设置方法 在ScrollView中使用ListView,ListView的高度会不正常. 方式一:在 ...
- ansible安装(批量执行命令
rpm安装 下载epl源 : Download the latest epel-release rpm from:http://dl.fedoraproject.org/pub/epel/6/x86 ...
- Servlet之创建与配置
上篇已将介绍完了,下面来实践操作走一个: 首先在名为"com.caiduping"的包中创一个MyFilter的对象: 1 package com.caiduping; 2 3 i ...
- SQL Server内存数据写入磁盘方法比较
众所周知,SQLServer增删改数据最先都是在内存中进行的,这可以大大加快数据操作的速度: 当内存中的数据被修改了,而磁盘中的数据还没有被修改时,就产生了所谓的“脏页”,SQLServer是如何同步 ...
- (转)DES、RSA、MD5、SHA、随机生成加密与解密
一.数据加密/编码算法列表 常见用于保证安全的加密或编码算法如下: 1.常用密钥算法 密钥算法用来对敏感数据.摘要.签名等信息进行加密,常用的密钥算法包括: DES(Data Encr ...
- (转)使用Aspose.Cell控件实现Excel高难度报表的生成(一)
本文章主要介绍报表的生成,基于Aspose.Cell控件的报表生成.谈到报表,估计大家都有所领悟以及个人的理解,总的来说,一般的报表生成,基本上是基于以下几种方式:一种是基于微软Excel内置的引擎来 ...
- java计时器
//用于计时,要求xx秒后开始发送短信,短信之间间隔xx秒 public static Date dateOperateBySecond(Date date,int second){ Calendar ...
- ArcEngine10:ArcGIS version not specified. You must call RuntimeManager.Bind before creating any ArcGIS components.
在Program.cs中添加ESRI.ArcGIS.RuntimeManager.Bind(ESRI.ArcGIS.ProductCode.EngineOrDesktop);如下 static voi ...