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框架veryide.librar源代码
Mar 05 Javascript
jquery isEmptyObject判断是否为空对象的函数
Feb 14 Javascript
关闭浏览器时提示onbeforeunload事件
Dec 25 Javascript
JS选项卡动态替换banner图片路径的方法
May 11 Javascript
JS倒计时实例_天时分秒
Aug 22 Javascript
AngularJS中table表格基本操作示例
Oct 10 Javascript
解决element UI 自定义传参的问题
Aug 22 Javascript
vue.extend与vue.component的区别和联系
Sep 19 Javascript
vuejs router history 配置到iis的方法
Sep 20 Javascript
vue 输入电话号码自动按3-4-4分割功能的实现代码
Apr 30 Javascript
Vue 封装防刷新考试倒计时组件的实现
Jun 05 Javascript
国庆节到了,利用JS实现一个生成国庆风头像的小工具 详解实现过程
Oct 05 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整合PayPal支付
2015/06/11 PHP
PHP对象克隆clone用法示例
2016/09/28 PHP
ThinkPHP5与单元测试PHPUnit使用详解
2020/02/23 PHP
JavaScript 编写匿名函数的几种方法
2010/02/21 Javascript
URL地址中的#符号使用说明
2011/02/12 Javascript
jQuery使用动态渲染表单功能完成ajax文件下载
2013/01/15 Javascript
jQuery学习笔记之jQuery原型属性和方法
2014/06/09 Javascript
js实现同一页面多个不同运动效果的方法
2015/04/10 Javascript
JavaScript 封装一个tab效果源码分享
2015/09/15 Javascript
浅析AngularJs HTTP响应拦截器
2015/12/28 Javascript
javascript入门之string对象【新手必看】
2016/11/22 Javascript
Bootstrap和Java分页实例第一篇
2016/12/23 Javascript
vue.js根据代码运行环境选择baseurl的方法
2018/02/28 Javascript
结合Vue控制字符和字节的显示个数的示例
2018/05/17 Javascript
深入理解Promise.all
2018/08/08 Javascript
详解vue使用vue-layer-mobile组件实现toast,loading效果
2018/08/31 Javascript
JS实现简单随机3D骰子
2019/10/24 Javascript
Vue.js中Line第三方登录api的实现代码
2020/06/29 Javascript
[00:55]2015国际邀请赛中国区预选赛5月23日——28日约战上海
2015/05/25 DOTA
[47:20]DAC2018 4.4 淘汰赛 Optic vs Mineski 第一场
2018/04/05 DOTA
解决Python安装时报缺少DLL问题【两种解决方法】
2019/07/15 Python
wxpython实现按钮切换界面的方法
2019/11/19 Python
python进行参数传递的方法
2020/05/12 Python
Python应用自动化部署工具Fabric原理及使用解析
2020/11/30 Python
Python实现Appium端口检测与释放的实现
2020/12/31 Python
python批量提取图片信息并保存的实现
2021/02/05 Python
详解CSS3中字体平滑处理和抗锯齿渲染
2017/03/29 HTML / CSS
html2canvas把div保存图片高清图的方法示例
2018/03/05 HTML / CSS
浅谈Html5移动端ios/Android兼容性总结
2018/06/01 HTML / CSS
长青弘远的面试题
2012/06/09 面试题
运动会四百米广播稿
2014/01/19 职场文书
环境工程专业自荐信
2014/03/03 职场文书
领导班子“四风问题”“整改方案
2014/10/02 职场文书
观看禁毒宣传片后的感想
2015/08/11 职场文书
Python-OpenCV实现图像缺陷检测的实例
2021/06/11 Python
python Django框架快速入门教程(后台管理)
2021/07/21 Python