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 相关文章推荐
jquery一般方法介绍 入门参考
Jun 21 Javascript
easyui datagrid 键盘上下控制选中行示例
Mar 31 Javascript
c#程序员对TypeScript的认识过程
Jun 19 Javascript
实例详解JavaScript获取链接参数的方法
Jan 01 Javascript
js滑动提示效果代码分享
Mar 10 Javascript
Bootstrap每天必学之警告框插件
Apr 26 Javascript
用js实现博客打赏功能
Oct 24 Javascript
jQuery快速实现商品数量加减的方法
Feb 06 Javascript
jQuery validata插件实现方法
Jun 25 jQuery
JavaScript html5 canvas实现图片上画超链接
Oct 20 Javascript
vue组件实现可搜索下拉框扩展
Oct 23 Javascript
基于javascript canvas实现五子棋游戏
Jul 08 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
劣质的PHP代码简化
2010/02/08 PHP
php中计算未知长度的字符串哪个字符出现的次数最多的代码
2012/08/14 PHP
浅析php学习的路线图
2013/07/10 PHP
ThinkPHP之A方法实例讲解
2014/06/20 PHP
PHP错误Warning: Cannot modify header information - headers already sent by解决方法
2014/09/27 PHP
php中preg_match的isU代表什么意思
2015/10/01 PHP
Zend Framework开发入门经典教程
2016/03/23 PHP
PHP PDOStatement::errorCode讲解
2019/01/31 PHP
javascript ready和load事件的区别示例介绍
2013/08/30 Javascript
jquery关于事件冒泡和事件委托的技巧及阻止与允许事件冒泡的三种实现方法
2015/11/27 Javascript
jQuery四种选择器使用及示例
2016/06/05 Javascript
对javascript继承的理解
2016/10/11 Javascript
AngularJS出现$http异步后台无法获取请求参数问题的解决方法
2016/11/03 Javascript
Node.js 使用axios读写influxDB的方法示例
2018/10/26 Javascript
Element-UI中Upload上传文件前端缓存处理示例
2019/02/21 Javascript
Vue 实例事件简单示例
2019/09/19 Javascript
JavaScript实现前端倒计时效果
2021/02/09 Javascript
[06:53]DOTA2每周TOP10 精彩击杀集锦vol.3
2014/06/25 DOTA
Python Web框架Flask信号机制(signals)介绍
2015/01/01 Python
用Python的Flask框架结合MySQL写一个内存监控程序
2015/11/07 Python
纯python实现机器学习之kNN算法示例
2018/03/01 Python
python:print格式化输出到文件的实例
2018/05/14 Python
python进程和线程用法知识点总结
2019/05/28 Python
Python基于OpenCV实现人脸检测并保存
2019/07/23 Python
pytorch对梯度进行可视化进行梯度检查教程
2020/02/04 Python
美国时尚女装在线:Missguided
2016/12/03 全球购物
linux面试题参考答案(7)
2012/10/29 面试题
安全生产管理责任书
2014/04/16 职场文书
环保倡议书50字
2014/05/15 职场文书
大学生联谊活动策划书(光棍节)
2014/10/10 职场文书
2014初中数学教研组工作总结
2014/12/19 职场文书
信用卡工作证明范本
2015/06/19 职场文书
医护人员继续教育学习心得体会
2016/01/19 职场文书
《狼牙山五壮士》读后感:宁死不屈,视死如归
2019/08/16 职场文书
MySQL 可扩展设计的基本原则
2021/05/14 MySQL
MySQL数据库表约束讲解
2022/06/21 MySQL