事情是这样的

今天我想写一个能快速生成一个自然数数组的函数,就是[0,1,2,3]这样的,然后我写了下面的代码:

new Array(10).map((item, index) => {

  return index

})

我本以为会得到一个0-9的数组,结果确发现map方法并没有执行。原来是稀疏数组在搞鬼。

什么是稀疏数组

首先看下面这个问题:

a = [undefined,undefined];

b = new Array(2);

a,b的元素个数是不是一样呢,从length上来看的一样的,都是2,就是说都有两个undefined,但是,对a和b都调用map方法却发现a的执行了,而b的没有执行。问题就在于b数组并没有两个undefined元素,而是只有两个位置(其实是只有一个长度属性length),这两个位置上没有值,也不是undefined。

[undefined,1,undefined,] 和 [,1,,]的区别在哪里

有一个直观的方法可以得到上面的结论,就是借助hasOwnProperty方法,有人可能会奇怪,这个不是用来判断对象是否有一个自己的属性的吗?其实,在js中,没有方法,只有函数的方法形式的调用。常见的一个用法是,将一个类数组对象变成一个数组:

函数调用的四种方式

你知道回字的四种写法吗?不知道没关系,但是你要知道函数的四种调用方式:

  1. 普通调用 b()
  2. 方法调用 a.b()
  3. call,apply调用 [].slice.call(arguments)
  4. new 调用 new A()

更多详情可以参考这篇文章函数的四种调用方式

var divs = document.querySelectorAll('div');

Array.isArray(divs)//false

divs = [].slice.call(divs)

Array.isArray(divs)//true

这里就是对一个类数组对象调用数组的方法,使它变成一个数组。下面,我们来看看如何借助hasOwnProperty让稀疏数组现出原形。首先,定义两个数组。

var a = [,1,,];

var b = [undefined,1,undefined];

借助索引运算试试

上面,我们定义了两个数组,通过索引运算得到的值都是相同的:

for(var i = 0; i < a.length; i++){

  console.log(a[i] === b[i])

}
//打印出3次true

所以,索引运算是判别不出真假孙悟空的,接下来我们请出hasOwnProperty同学:

借助hasOwnProperty


var hasOwnProp = Object.prototype.hasOwnProperty; hasOwnProp.call(a, '0'); //false hasOwnProp.call(b, '0'); //true hasOwnProp.call(a, '1'); //true hasOwnProp.call(b, '1'); //true

所以神奇吧,虽然a[0]===b[0];都是undefined,但是,稀疏数组在['0']的位置是没有值的,而b数组确实有值的,只不过是undefined罢了;而稀疏数组在[1]的位置上则有值,那这么说,稀疏数组真的是名副其实了。其实除了在1的位置有值之外,稀疏数组还有一个自己的属性,就是length了,这么重要的属性怎么能丢呢

hasOwnProp.call(a, 'length'); //true

总结

现在。我们差不多可以解释最开始的问题了,map函数的内心os可以是这样的:

> 没有值你让我迭代个毛线。。。

总体上来说,稀疏数组还是人畜无害的,只是在调用数组自己的迭代方法时要注意一下;如forEach,map,filter等,函数会跳过那些稀疏的位置,最后放一个快速生成自然数的链接,如何简单快速生成一个数组,数组的元素是前N个自然数

贴上vue官网生成20个元素的非稀疏数组的代码


Array.apply(null, { length: 20 }) //es6 Array.from({length:20}) //变体 Array.apply(null,new Array(5))

[undefined,1] 和 [,1]的区别在哪里--认识js中的稀疏数组的更多相关文章

  1. js课程 3-10 js中字符串函数数组函数和其它语言中对应函数的区别和联系是什么

    js课程 3-10  js中字符串函数数组函数和其它语言中对应函数的区别和联系是什么 一.总结 一句话总结:js中是对象点方法的形式,这些方法都是对象的方法,而在php.java中却不是这样. 1.j ...

  2. JS中遍历普通数组和字典数组的区别

    // 普通数组 var intArray = new Array(); intArray[0] = "第一个"; intArray[1] = "第二个"; fo ...

  3. 聊一聊js中的null、undefined与NaN

    零.寒暄 翻翻自己的博客,上一篇竟然是六月26号的,说好的更新呢?回顾刚刚过去的这个七月,整天都是公司的入职培训加上自己的小论文,每天奋战到凌晨1点多,这是要挂的节奏啊!但是不论怎么说,自己的时间管理 ...

  4. 处理 JS中 undefined 的 7 个技巧

    摘要: JS的大部分报错都是undefined... 作者:前端小智 原文:处理 JS中 undefined 的 7 个技巧 Fundebug经授权转载,版权归原作者所有. 大约8年前,当原作者开始学 ...

  5. JS中innerHTML、outerHTML、innerText 、outerText、value的区别与联系?jQuery中的text()、html()和val()

    一.JS中innerHTML.outerHTML.innerText .outerText.value的区别与联系?jS中设置或者获取所选内容的值:①innerHTML :属性设置或返回该标签内的HT ...

  6. js中由undefined说起

    typeof()函数 返回的是字符串.有六种可能:"number"."string"."boolean"."object" ...

  7. 浅谈js中null和undefined的区别

    在JS中,null和undefined是经常让人摸不着头脑的东西,尤其是在数据初始化以及处理的过程中,经常稍微不注意,就会让页面在渲染时出现报错,下面来细说下,这两者之间的区别: null 表示一个对 ...

  8. 浅谈JS中的!=、== 、!==、===的用法和区别 JS中Null与Undefined的区别 读取XML文件 获取路径的方式 C#中Cookie,Session,Application的用法与区别? c#反射 抽象工厂

    浅谈JS中的!=.== .!==.===的用法和区别   var num = 1;     var str = '1';     var test = 1;     test == num  //tr ...

  9. json,js中typeof用法详细介绍及NaN、 null 及 undefined 的区别

    JSON.parse(jsonstr); //可以将json字符串转换成json对象 JSON.stringify(jsonobj); //可以将json对象转换成json对符串 在js使用中的一个函 ...

随机推荐

  1. 100+个MySQL调试和优化技巧

    MySQL是一个功能强大的开源数据库.随着越来越多的数据库驱动的应用程序,人们一直在推动MySQL发展到它的极限.这里是101条调节和优化MySQL安装的技巧.一些技巧是针对特定的安装环境的,但这些思 ...

  2. 中缀表达式变后缀表达式、后缀表达式(逆波兰)求值(python版本)

    定义: 中缀表达式: 在通常的表达式中,二元运算符总是置于与之相关的两个运算对象之间,这种表示法也称为中缀表达式 后缀表达式: 又叫逆波兰表达式 ,不包含括号,运算符放在两个运算对象的后面,所有的计算 ...

  3. MongoDB 系列(一) C# 简易入门封装

    之前写过一篇关于MongoDB的封装 发现太过繁琐 于是打算从新写一篇简易版 1:关于MongoDB的安装请自行百度,进行权限认证的时候有一个小坑,3.0之后授权认证方式默认的SCRAM-SHA-1模 ...

  4. 理解梯度下降法(Gradient Decent)

    1. 什么是梯度下降法?   梯度下降法(Gradient Decent)是一种常用的最优化方法,是求解无约束问题最古老也是最常用的方法之一.也被称之为最速下降法.梯度下降法在机器学习中十分常见,多用 ...

  5. 某天U盘插在笔记本打不开了,是U盘坏了还是电脑的问题?

    五六月份忙着毕业设计与毕业论文,U盘在这个时候就是大功臣啦! 然而打印完最终版本论文上交后,再次把U盘插在自己的笔记本上读取失败了... 只有一个空白的图标,打不开,也无法格式化. 试着删除,拔了又插 ...

  6. 微信小程序怎么用?线下商家最适合玩小程序

    随着微信小程序不断地释放新功能,许多行业越来越关注小程序,目前已经有不少餐饮和线下传统零售企业开始谋划利用好小程序.但是,线下商业有着复杂的场景,如何针对自己行业的特点和需求开发出属于自己的小程序,是 ...

  7. 如何将 Microsoft Bot Framework 机器人部署以及网页应用

    <Bot Framework>是微软开发的一款可让任何人制作自己的聊天机器人.该工具可以理解自然语言并对图片进行分析等,初期开放了 22 个可集成到应用的 API. 首先说到Bot大家的第 ...

  8. MyBatis+PageHelper实现分页

    转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/7256105.html 前面讲到Spring+SpringMVC+MyBatis深入学习及搭建(十七)--Sp ...

  9. iOS-联系人应用(一)

    环境:xcode6,iphone 4s simulator with iOS8.0 一.功能界面介绍 1.1 应用启动进入联系人列表页面,数据为模拟数据,来源与一个plist文件: 1.2 点击右上角 ...

  10. 基于angular2x+ng-bootstrap构建后台管理系统界面(干货)

    写在前面的话 近来公司要做一个后台管理系统,人手比较少,于是作为一个前端也参与进来,其实据我所知,大部分的公司还是后台自己捣鼓的. 在后台没有到位的情况下,前端应该使用什么技术也着实让我为难了一把.经 ...