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 相关文章推荐
js四舍五入数学函数round使用实例
May 09 Javascript
javascript中clone对象详解
Dec 03 Javascript
JavaScript比较两个对象是否相等的方法
Feb 06 Javascript
解析Javascript单例模式概念与实例
Dec 05 Javascript
javascript图片预览和上传(兼容IE)
Mar 15 Javascript
JS中的BOM应用
Feb 02 Javascript
详解Angular6 热加载配置方案
Aug 18 Javascript
详解vue 动态加载并注册组件且通过 render动态创建该组件
May 30 Javascript
微信小程序 wxParse插件显示视频问题
Sep 27 Javascript
jquery实现垂直手风琴菜单
Mar 04 jQuery
Vue通过getAction的finally来最大程度避免影响主数据呈现问题
Apr 24 Javascript
微信小程序使用GoEasy实现websocket实时通讯
May 19 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伪造referer突破网盘禁止外连的代码
2008/06/15 PHP
解析zend Framework如何自动加载类
2013/06/28 PHP
Laravel中基于Artisan View扩展包创建及删除应用视图文件的方法
2016/10/08 PHP
基于JQuery的类似新浪微博展示信息效果的代码
2012/07/23 Javascript
document.documentElement和document.body区别介绍
2013/09/16 Javascript
jquery遍历select元素(实例讲解)
2013/12/31 Javascript
jquery实现导航固定顶部的效果仿蘑菇街
2014/10/22 Javascript
vue分页组件table-pagebar使用实例解析
2020/11/15 Javascript
Node.js常用工具之util模块
2017/03/09 Javascript
jQuery加密密码到cookie的实现代码
2017/04/18 jQuery
element-ui循环显示radio控件信息的方法
2018/08/24 Javascript
vue填坑之webpack run build 静态资源找不到的解决方法
2018/09/03 Javascript
JS中数据结构之栈
2019/01/01 Javascript
通过实例了解JS 连续赋值
2019/09/24 Javascript
vue - vue.config.js中devServer配置方式
2019/10/30 Javascript
原生js实现随机点餐效果
2019/12/10 Javascript
JavaScript实现PC端四格密码输入框功能
2020/02/19 Javascript
[06:30]DOTA2英雄梦之声_第15期_死亡先知
2014/06/21 DOTA
[01:06:25]Secret vs Liquid 2018国际邀请赛淘汰赛BO3 第一场 8.25
2018/08/29 DOTA
Python使用Flask框架同时上传多个文件的方法
2015/03/21 Python
Python使用poplib模块和smtplib模块收发电子邮件的教程
2016/07/02 Python
python逆序打印各位数字的方法
2018/06/25 Python
python使用matplotlib模块绘制多条折线图、散点图
2020/04/26 Python
django多对多表的创建,级联删除及手动创建第三张表
2019/07/25 Python
用Python爬取QQ音乐评论并制成词云图的实例
2019/08/24 Python
python实现指定ip端口扫描方式
2019/12/17 Python
PyTorch中的padding(边缘填充)操作方式
2020/01/03 Python
Yummie官方网站:塑身衣和衣柜必需品
2019/10/29 全球购物
公务员总结性个人自我评价
2013/12/05 职场文书
前处理班长职位说明书
2014/03/01 职场文书
市场营销专业应届生自荐信
2014/06/19 职场文书
努力工作保证书
2015/02/28 职场文书
幼儿园开学温馨提示
2015/07/15 职场文书
导游词之嵊泗列岛
2019/10/30 职场文书
JS实现扫雷项目总结
2021/05/19 Javascript
SQL Server数据库的三种创建方法汇总
2023/05/08 MySQL