事情是这样的

今天我想写一个能快速生成一个自然数数组的函数,就是[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. Spring Boot 系列(五)web开发-Thymeleaf、FreeMarker模板引擎

    前面几篇介绍了返回json数据提供良好的RESTful api,下面我们介绍如何把处理完的数据渲染到页面上. Spring Boot 使用模板引擎 Spring Boot 推荐使用Thymeleaf. ...

  2. CentOS环境下中文显示乱码,vim和ls命令显示中文均为乱码的解决办法

    1.登陆linux系统打开操作终端之后,输入 echo $LANG可以查看当前使用的系统语言 2.查看是否有中文语言包可以在终端输入 locale命令,如有zh cn 表示已经安装了中文语言 3.如果 ...

  3. 51nod_1122:机器人走方格 V4 (矩阵快速幂)

    题目链接 昨天上随机信号分析讲马氏链的时候突然想到这题的解法,今天写一下 定义矩阵A,Ans=A^n,令A[i][j]表示,经过1次变换后,第i个位置上的机器人位于第j个位置的情况数,则Ans[i][ ...

  4. linux用户及权限管理

    [文件管理.管道.用户及组管理.用户及权限管理]\用户及组管理 用户与组管理 Linux系统是一个多用户多任务的分时操作系统,任何一个要使用系统资源的用户,都必须首先向系统管理员申请一个账号,然后以这 ...

  5. APP测试 - android os6,7 新增特性测试

    背景 android os6,7推出后,公司的APP在市场上面反映的一些问题.初始方案在7月份已经整了一份,但是邮件发出大部分同学都看不到,这里在博客里面整理后再在部门内邮件发出来. android ...

  6. 关于MUI集成微信分享遇到的坑

    今天聊一下MUI这个框架吧! 首先,用这个框架也有很长一段时间了,项目不同,涉及到的功能也有不同,之前没有涉及到微信分享相关的内容!今天,遇到了,也解决了,分享出来. 下面是手顺: 1.分享的代码是参 ...

  7. 解决mydql执行sql文件时报Error: Unknown storage engine 'InnoDB'的错误。

    我运行了一个innoDB类型的sql文件,报了Error: Unknown storage engine 'InnoDB'错误,网上查了很多方法,但是都没办法真正解决我的问题,后来解决了,在这里总结一 ...

  8. 阿里聚安全移动安全专家分享:APP渠道推广作弊攻防那些事儿

    移动互联网高速发展,要保持APP持续并且高速增长所需的成本也越来越高.美团网CEO在今年的一次公开会议上讲到:"2017年对移动互联网公司来说是非常恐的.".主要表现在三个方面,手 ...

  9. JAVA多线程之Synchronized关键字--对象锁的特点

    一,介绍 本文介绍JAVA多线程中的synchronized关键字作为对象锁的一些知识点. 所谓对象锁,就是就是synchronized 给某个对象 加锁.关于 对象锁 可参考:这篇文章 二,分析 s ...

  10. 【模板小程序】链表排序(qsort/insert_sort/merge_sort)

    前言 本文章整理了链表排序的三种方法,分别是快速排序.插入排序.归并排序.为适应不同用途,先给出常用的int版本,再在此基础上抽象出类模板. 目录 一.针对整数的版本(常用) 文中链表定义 链表相关操 ...