关于数组的一些课外小知识

最近在看你不知道的js中,发现了一些很有意思的课外知识。大家都知道新建一个数组,无非就是用[]以及使用构造函数的方式。在红宝书中也有提及应该尽量避免使用构造函数,除非十分必要,注意这一点。为什么这么说呢,因为使用构造函数来创建数组经常会产生意想不到的结果。

 var a = new Array(1,2,3); // a  = [1,2,3] 

这是大家都知道,也是很明确的一种写法,写到这顺带提个小知识,也有很多人知道:构造函数Array(..)不要求必须带new关键字,不带new时,js会自动补上。有一点大家应该也都知道,也是Array构造函数的一个小问题,在Aarry构造函数中传入一个数字参数的时候,该参数会被作为数组的预设长度。用例子解释:var a = new Array(5) 。console.log(a.length)  //  5。这是一个很容易忘记以及容易出错的地方。但关键点在于,数组本身中并没有预设长度这个概念。这里再提及一个小知识,假设一个数组没有任何的单元(值),但它的length属性却显示有单元数量,这样奇特的数据结构会导致一些怪异的行为。而这一切都归咎于已被废止的旧特性(类似arguments这样的类数组)。我们将包含至少一个“空单元”的数组成为稀疏数组。

var a = new Array(3)

var  b = [undefined, undefined, undefined]

var c = []; c.length = 3;

b在当前版本的chrome中显示为[undefined, undefined, undefined ],而a和c则显示为[empty × 3]。更令人费解的应该算是在火狐中了,a和c都显示为[ , , , ],诶?三个逗号,难道不是代表着四个单元吗。他给出的解释是,从ES5规范开始就允许在列表末尾多加一个逗号(在实际处理中会被忽略不计)。所有如果你在代码或者调试控制台输入[ , , , ]实际上得到的是[ , , ]。因此针对这种情况,火狐将[ , , , ]改为显示Array[< 3 empty slots>]。

最后一个有意思的例子,var  a = Array.apply(null, { length : 3});

先不说结果,先一步步来解释下这如何解析的。 首先Array.apply中第一个参数为null,也就是把this指向了window作用域中,作用域在这并不是关键点,接着{length : 3 } 作为第二个参数。由于第二个参数必须是一个数组或者说是类数组的元素,也就是说我们可以换种思想说,apply对第二个参数会进行遍历。而{length : 3}作为类数组,apply在遍历时候,发现有长度,进行遍历,可是实际三个单元又是空的,那进行遍历时,自动的返回了undefined(进行对象或者数组访问,不存在的属性会返回undefined)。

说到这应该可以知道答案了吧。// a = [undefined, undefined, undefined]

此篇文章多数知识来源于你不知道的js。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值