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 相关文章推荐
网页中实现浏览器的最大,最小化和关闭按钮
Mar 12 Javascript
脚本之家贴图转换+转贴工具用到的js代码超级推荐
Apr 05 Javascript
用JavaScript将从数据库中读取出来的日期型格式化为想要的类型。
Aug 15 Javascript
js图片预加载示例
Apr 30 Javascript
举例详解Python中smtplib模块处理电子邮件的使用
Jun 24 Javascript
基于jQuery实现select下拉选择可输入附源码下载
Feb 03 Javascript
jQuery使用Selectator插件实现多选下拉列表过滤框(附源码下载)
Apr 08 Javascript
JQuery EasyUI学习教程之datagrid 添加、修改、删除操作
Jul 09 Javascript
如何提高javascript加载速度
Dec 26 Javascript
JS闭包可被利用的常见场景小结
Apr 09 Javascript
jquery validate 实现动态增加/删除验证规则操作示例
Oct 28 jQuery
JavaScript枚举选择jquery插件代码实例
Nov 17 jQuery
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获取MSN好友列表类的实现代码
2013/06/23 PHP
ThinkPHP模板中判断volist循环的最后一条记录的验证方法
2014/07/01 PHP
PHP二维数组去重算法
2016/12/17 PHP
基于laravel Request的所有方法详解
2019/09/29 PHP
Thinkphp集成抖音SDK的实现方法
2020/04/28 PHP
javascript算法学习(直接插入排序)
2011/04/12 Javascript
Jquery 跨域访问 Lightswitch OData Service的方法
2013/09/11 Javascript
Jquery实现图片放大镜效果的思路及代码(自写)
2013/10/18 Javascript
javascript实现des解密加密全过程
2014/04/03 Javascript
AngularJS基础学习笔记之表达式
2015/05/10 Javascript
基于jquery实现表格无刷新分页
2016/01/07 Javascript
使用基于Node.js的构建工具Grunt来发布ASP.NET MVC项目
2016/02/15 Javascript
JavaScript常用代码书写规范的超全面总结
2016/09/11 Javascript
详解关于element el-button使用$attrs的一个注意要点
2018/11/09 Javascript
vue使用axios上传文件(FormData)的方法
2019/04/14 Javascript
vue实现PC端录音功能的实例代码
2019/06/05 Javascript
vue-router为激活的路由设置样式操作
2020/07/18 Javascript
js实现全选和全不选功能
2020/07/28 Javascript
[02:21]DOTA2英雄基础教程 蝙蝠骑士
2013/12/16 DOTA
python3抓取中文网页的方法
2015/07/28 Python
python读文件保存到字典,修改字典并写入新文件的实例
2018/04/23 Python
selenium3+python3环境搭建教程图解
2018/12/07 Python
dataframe 按条件替换某一列中的值方法
2019/01/29 Python
Django 全局的static和templates的使用详解
2019/07/19 Python
Tensorflow训练MNIST手写数字识别模型
2020/02/13 Python
阻止移动设备(手机、pad)浏览器双击放大网页的方法
2014/06/03 HTML / CSS
项目经理的岗位职责
2013/11/23 职场文书
庆祝教师节活动方案
2014/01/31 职场文书
小学教师评语大全
2014/04/23 职场文书
2014年客房服务员工作总结
2014/11/18 职场文书
大学生个人简历自荐信
2015/03/06 职场文书
2016七夕情人节寄语
2015/12/04 职场文书
《赵州桥》教学反思
2016/02/17 职场文书
JavaScript实现登录窗体
2021/06/22 Javascript
python实现对doc、txt、xls等文档的读写操作
2022/04/02 Python
Pytorch中expand()的使用(扩展某个维度)
2022/07/15 Python