JavaScript数组的一些奇葩行为

 更新时间:2016年01月25日 11:12:17   作者:宇哥哥  
今天,复习了一下JavaScript的数组,然后,把他的一些奇葩行为总结了一下,分享在脚本之家平台,欢迎大家参考

在程序语言中数组的重要性不言而喻,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数组的一些奇葩行为,文章写的不好还请见谅,谢谢!

相关文章

  • uni-app配置APP自定义顶部标题栏设置方法与注意事项

    uni-app配置APP自定义顶部标题栏设置方法与注意事项

    相信很多小伙伴在使用uniapp进行多端开发的时候,在面对一些业务需求的时候,uniapp给我们提供的默认导航栏已经不能满足我们的业务需求了,这篇文章主要给大家介绍了关于uni-app配置APP自定义顶部标题栏设置方法与注意事项的相关资料,需要的朋友可以参考下
    2022-07-07
  • JavaScript写个贪吃蛇小游戏(超详细)

    JavaScript写个贪吃蛇小游戏(超详细)

    这篇文章主要介绍了JavaScript写个贪吃蛇小游戏(超详细),本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-03-03
  • javascript用户注册提示效果的简单实例

    javascript用户注册提示效果的简单实例

    这个可以增加用户验证,不用js alert来作提示,而是在右边提示,现在很多网站都这样做,有需要的朋友可以参考一下
    2013-08-08
  • 深入理解TypeScript 类型兼容性

    深入理解TypeScript 类型兼容性

    本文主要介绍了TypeScript 在函数、枚举、类和泛型中的类型兼容性规则,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-01-01
  • 微信小程序实现选择内容显示对应内容

    微信小程序实现选择内容显示对应内容

    这篇文章主要为大家详细介绍了微信小程序实现选择内容显示对应内容,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-07-07
  • window.onresize 多次触发的解决方法

    window.onresize 多次触发的解决方法

    用了window.onresize但是发现每次 onresize 后页面中状态总是不对,下面与大家分享下onresize 事件多次触发的解决方法
    2013-11-11
  • TS中declare的简单使用方法

    TS中declare的简单使用方法

    declare 关键字用来告诉编译器,某个类型是存在的,可以在当前文件中使用,本文给大家介绍TS中declare的简单使用方法,感兴趣的朋友一起看看吧
    2023-12-12
  • 微信小程序实现image组件图片自适应宽度比例显示的方法

    微信小程序实现image组件图片自适应宽度比例显示的方法

    这篇文章主要介绍了微信小程序实现image组件图片自适应宽度比例显示的方法,简单讲述了image组件的常用属性,并结合实例形式分析了微信小程序实现图片自适应宽度比例的相关操作技巧,需要的朋友可以参考下
    2018-01-01
  • javascript Onunload与Onbeforeunload使用小结

    javascript Onunload与Onbeforeunload使用小结

    Onunload,onbeforeunload都是在刷新或关闭时调用,可以在<script>脚本中通过window.onunload来指定或者在<body>里指定。区别在于onbeforeunload在onunload之前执行,它还可以阻止onunload的执行。
    2009-12-12
  • js仿苹果iwatch外观的计时器代码分享

    js仿苹果iwatch外观的计时器代码分享

    这篇文章主要介绍了JS+CSS3实现的类似于苹果iwatch计时器特效,很实用的代码,推荐给大家,有需要的小伙伴可以参考下。
    2015-08-08

最新评论