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学习笔记之jQuery的动画
Dec 22 Javascript
js导航栏单击事件背景变换示例代码
Jan 13 Javascript
Javascript解析URL方法详解
Dec 05 Javascript
JS实现弹出浮动窗口(支持鼠标拖动和关闭)实例详解
Aug 06 Javascript
在WordPress中加入Google搜索功能的简单步骤讲解
Jan 04 Javascript
jQuery+ajax的资源回收处理机制分析
Jan 07 Javascript
AngularJS日期格式化常见操作实例分析
May 17 Javascript
JS async 函数的含义和用法实例总结
Apr 08 Javascript
vuejs element table 表格添加行,修改,单独删除行,批量删除行操作
Jul 18 Javascript
js实现带有动画的返回顶部
Aug 09 Javascript
vue 授权获取微信openId操作
Nov 13 Javascript
JavaScript实现跟随鼠标移动的盒子
Jan 28 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 正则 过滤html 的超链接
2009/06/02 PHP
PHP实现的ID混淆算法类与用法示例
2018/08/10 PHP
jquery控制listbox中项的移动并排序
2009/11/12 Javascript
javascript 定义新对象方法
2010/02/20 Javascript
通过Javascript将数据导出到外部Excel文档的函数代码
2012/06/15 Javascript
深入理解JavaScript系列(49):Function模式(上篇)
2015/03/04 Javascript
JS实现的仿东京商城菜单、仿Win右键菜单及仿淘宝TAB特效合集
2015/09/28 Javascript
理解javascript中的with关键字
2016/02/15 Javascript
深入浅析JavaScript中的作用域和上下文
2016/03/26 Javascript
Angularjs实现多个页面共享数据的方式
2016/03/29 Javascript
JS及PHP代码编写八大排序算法
2016/07/12 Javascript
利用vue.js插入dom节点的方法
2017/03/15 Javascript
JavaScript之json_动力节点Java学院整理
2017/06/29 Javascript
vue中如何创建多个ueditor实例教程
2017/11/14 Javascript
jQuery模拟html下拉多选框的原生实现方法示例
2019/05/30 jQuery
在Angular中实现一个级联效果的下拉框的示例代码
2020/05/20 Javascript
[01:03:36]Ti4 循环赛第三日DK vs Titan
2014/07/12 DOTA
python list使用示例 list中找连续的数字
2014/01/27 Python
Python实现的一个自动售饮料程序代码分享
2014/08/25 Python
17个Python小技巧分享
2015/01/23 Python
在Python3中使用asyncio库进行快速数据抓取的教程
2015/04/02 Python
Python3+django2.0+apache2+ubuntu14部署网站上线的方法
2018/07/07 Python
python导包的几种方法(自定义包的生成以及导入详解)
2019/07/15 Python
python实现的多任务版udp聊天器功能案例
2019/11/13 Python
python scrapy重复执行实现代码详解
2019/12/28 Python
Jupyter 无法下载文件夹如何实现曲线救国
2020/04/22 Python
详解解决jupyter不能使用pytorch的问题
2021/02/18 Python
利用HTML5+css3+jquery+weui实现仿微信聊天界面功能
2018/01/08 HTML / CSS
英国高档时尚男装购物网站:MR PORTER
2016/08/09 全球购物
骆驼官方商城:CAMEL
2016/11/22 全球购物
学生实习自我鉴定
2013/10/11 职场文书
2014国庆节标语口号
2014/09/19 职场文书
劳动保障个人工作总结
2015/03/04 职场文书
python四个坐标点对图片区域最小外接矩形进行裁剪
2021/06/04 Python
Java8利用Stream对列表进行去除重复的方法详解
2022/04/14 Java/Android
优化Mysql查询的示例
2022/04/26 MySQL