JavaScript数组的一些奇葩行为


Posted in Javascript onJanuary 25, 2016

在程序语言中数组的重要性不言而喻,JavaScript中数组也是最常使用的对象之一,数组是值的有序集合,由于弱类型的原因,JavaScript中数组十分灵活、强大,不像是Java等强类型高级语言数组只能存放同一类型或其子类型元素,JavaScript在同一个数组中可以存放多种类型的元素,而且是长度也是可以动态调整的,可以随着数据增加或减少自动对数组长度做更改。

今天,复习了一下JavaScript的数组,然后,把他的一些奇葩行为总结了一下,在这里和大家share一下,如果有不对的地方,欢迎指出!

奇葩1:Array()构造器函数可以不使用new关键字进行调用:

Array()构造器使用传递给他的参数作为数组的元素,从而创建数组,一般的,我们是如下调用的:

var a = new Array(1, 2, "bom!");
a.length; //3
console.log(a); //[1, 2, "bom!"]

但是,省略掉new也是可以的,如下:

var a = Array(1, 2, "bom!");
a.length; //3
console.log(a); //[1, 2, "bom!"]

虽然,我不知道他的内部实现机制是什么,但是,猜想他的构造器函数可能是如下定义的:

function Array(args) {
//如果,this不是Array的实例的话,
//说明不是通过new调用的,则在这里再重新调用
if( !this instanceof Array) {
return new Array(args);
}//后面是正常调用时的实现代码
//...
}

奇葩2:当只传一个参数给构造函数时,行为莫测

如果只传一个参数,并且这个参数是一个整数,将会得到一个数组,并且length等于这个参数

var a = new Array(12);
console.log(a.length); //12
console.log(a); //[]

如果只传一个浮点数,就会报错:

var a = new Array(1.1); //Uncaught RangeError: Invalid array length(…)

传递一个字符串就会正常工作,并且该字符串作为数组的第一个元素:

var a = new Array("1.1");
console.log(a.length); //
console.log(a); //["1.1"]

但是为了避免二义性,我建议最好是是直接使用字面量的形式创建数组:

var a = []; //空数组
var a = [1, 1, "bom"]; //三个元素
var a = [12]; //一个元素,并且元素是12

奇葩3:数组的length属性可以被修改(可写)

如下,我们直接把本来是2的length改成了100,而且还修改成功了!!!

var a = [1, 2, 3, 4];
console.log(a.length); //4
a.length = 100; 
console.log(a.length); //100

虽然length等于100,但是,元素a[4]-a[99]是不存在的,并且如果你请求他们的值的话,例如,从0到a.length做一个循环中做的话,那么会得到undefined。

接下来再看:

var a = [1, 2, 3, 4];
a.length = 100;
console.log(a[10]); //undefined
console.log(99 in a); //false

与下面的例子有点相似:

var a = [1, 2, 3, 4];
a[99] = undefined;
console.log(a.length); //100

不同之处在于,这里的a[99]存在了,因为我们创建了它,即使他拥有的是undefined的值。但是从a[4]到a[98]的所有元素则是不存在的,如下:

var a = [1, 2, 3, 4];
a[99] = undefined;
console.log(99 in a); //true;
console.log(98 in a); //false
console.log(a.length); //100

以上所述给大家分享了JavaScript数组的一些奇葩行为,文章写的不好还请见谅,谢谢!

Javascript 相关文章推荐
JavaScript delete操作符应用实例
Jan 13 Javascript
jQuery焦点图切换特效插件封装实例
Aug 18 Javascript
常用js字符串判断方法整理
Oct 18 Javascript
Javascript变量作用域详解
Dec 06 Javascript
javascript 实现map集合
Apr 03 Javascript
javascript 常用验证函数总结
Jun 28 Javascript
Bootstrap Table服务器分页与在线编辑应用总结
Aug 08 Javascript
JavaScript reduce和reduceRight详解
Oct 24 Javascript
微信小程序  Mustache语法详细介绍
Oct 27 Javascript
深入理解Javascript箭头函数中的this
Feb 13 Javascript
浅谈Angular路由复用策略
Oct 04 Javascript
cocos2dx+lua实现橡皮擦功能
Dec 20 Javascript
JavaScript文本框脚本编写的注意事项
Jan 25 #Javascript
详解js私有作用域中创建特权方法
Jan 25 #Javascript
超赞的jQuery图片滑块动画特效代码汇总
Jan 25 #Javascript
理解js对象继承的N种模式
Jan 25 #Javascript
解决js函数闭包内存泄露问题的办法
Jan 25 #Javascript
JavaScript数据类型学习笔记
Jan 25 #Javascript
分步解析JavaScript实现tab选项卡自动切换功能
Jan 25 #Javascript
You might like
50个PHP程序性能优化的方法
2014/06/02 PHP
Windows上php5.6操作mongodb数据库示例【配置、连接、获取实例】
2019/02/13 PHP
PHP大文件切割上传功能实例分析
2019/07/01 PHP
Laravel5.4框架中视图共享数据的方法详解
2019/09/05 PHP
细品javascript 寻址,闭包,对象模型和相关问题
2009/04/27 Javascript
基于jquery的让页面控件不可用的实现代码
2010/04/27 Javascript
最常用的12种设计模式小结
2011/08/09 Javascript
jQuery学习笔记 获取jQuery对象
2012/09/19 Javascript
js中escape对应的C#解码函数 UrlDecode
2012/12/16 Javascript
js 通用订单代码
2013/12/23 Javascript
js获取滚动距离的方法
2015/05/30 Javascript
详解页面滚动值scrollTop在FireFox与Chrome浏览器间的兼容问题
2015/12/03 Javascript
javascript实现的猜数小游戏完整实例代码
2016/05/10 Javascript
Javascript类型系统之String字符串类型详解
2016/06/21 Javascript
jQuery zTree树插件动态加载实例代码
2017/05/11 jQuery
js实现轮播图的两种方式(构造函数、面向对象)
2017/09/30 Javascript
Bootstrap fileinput 上传新文件移除时触发服务器同步删除的配置
2018/10/08 Javascript
[04:42]5分钟带你了解什么是DOTA2(第一期)
2017/02/07 DOTA
Python中优化NumPy包使用性能的教程
2015/04/23 Python
浅谈Python单向链表的实现
2015/12/24 Python
Python中动态创建类实例的方法
2017/03/24 Python
Python3实现简单可学习的手写体识别(实例讲解)
2017/10/21 Python
python 实现客户端与服务端的通信
2020/12/23 Python
利用HTML5中Geolocation获取地理位置调用Google Map API在Google Map上定位
2013/01/23 HTML / CSS
加拿大消费电子和手机购物网站:The Source
2017/01/28 全球购物
电大毕业个人生自我鉴定
2014/03/26 职场文书
协议书的格式
2014/04/23 职场文书
商品陈列协议书
2014/09/29 职场文书
班主任工作实习计划
2015/01/16 职场文书
公务员年终个人总结
2015/02/12 职场文书
童年读书笔记
2015/06/26 职场文书
68句权威创业名言
2019/08/26 职场文书
浅谈pytorch中stack和cat的及to_tensor的坑
2021/05/20 Python
教你如何用Python实现人脸识别(含源代码)
2021/06/23 Python
Ubuntu Server 安装Tomcat并配置systemctl
2022/04/28 Servers
利用Python实时获取steam特惠游戏数据
2022/06/25 Python