[undefined,1] 和 [,1]的区别在哪里--认识js中的稀疏数组
事情是这样的
今天我想写一个能快速生成一个自然数数组的函数,就是[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中,没有方法,只有函数的方法形式的调用。常见的一个用法是,将一个类数组对象变成一个数组:
函数调用的四种方式
你知道回字的四种写法吗?不知道没关系,但是你要知道函数的四种调用方式:
- 普通调用 b()
- 方法调用 a.b()
- call,apply调用 [].slice.call(arguments)
- 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中的稀疏数组的更多相关文章
- js课程 3-10 js中字符串函数数组函数和其它语言中对应函数的区别和联系是什么
js课程 3-10 js中字符串函数数组函数和其它语言中对应函数的区别和联系是什么 一.总结 一句话总结:js中是对象点方法的形式,这些方法都是对象的方法,而在php.java中却不是这样. 1.j ...
- JS中遍历普通数组和字典数组的区别
// 普通数组 var intArray = new Array(); intArray[0] = "第一个"; intArray[1] = "第二个"; fo ...
- 聊一聊js中的null、undefined与NaN
零.寒暄 翻翻自己的博客,上一篇竟然是六月26号的,说好的更新呢?回顾刚刚过去的这个七月,整天都是公司的入职培训加上自己的小论文,每天奋战到凌晨1点多,这是要挂的节奏啊!但是不论怎么说,自己的时间管理 ...
- 处理 JS中 undefined 的 7 个技巧
摘要: JS的大部分报错都是undefined... 作者:前端小智 原文:处理 JS中 undefined 的 7 个技巧 Fundebug经授权转载,版权归原作者所有. 大约8年前,当原作者开始学 ...
- JS中innerHTML、outerHTML、innerText 、outerText、value的区别与联系?jQuery中的text()、html()和val()
一.JS中innerHTML.outerHTML.innerText .outerText.value的区别与联系?jS中设置或者获取所选内容的值:①innerHTML :属性设置或返回该标签内的HT ...
- js中由undefined说起
typeof()函数 返回的是字符串.有六种可能:"number"."string"."boolean"."object" ...
- 浅谈js中null和undefined的区别
在JS中,null和undefined是经常让人摸不着头脑的东西,尤其是在数据初始化以及处理的过程中,经常稍微不注意,就会让页面在渲染时出现报错,下面来细说下,这两者之间的区别: null 表示一个对 ...
- 浅谈JS中的!=、== 、!==、===的用法和区别 JS中Null与Undefined的区别 读取XML文件 获取路径的方式 C#中Cookie,Session,Application的用法与区别? c#反射 抽象工厂
浅谈JS中的!=.== .!==.===的用法和区别 var num = 1; var str = '1'; var test = 1; test == num //tr ...
- json,js中typeof用法详细介绍及NaN、 null 及 undefined 的区别
JSON.parse(jsonstr); //可以将json字符串转换成json对象 JSON.stringify(jsonobj); //可以将json对象转换成json对符串 在js使用中的一个函 ...
随机推荐
- Educational Codeforces Round 21 A-E题题解
A题 ............太水就不说了,贴下代码 #include<string> #include<iostream> #include<cstring& ...
- 迭代器 Iterator
迭代器 Iterator 2016-5-7 可以这样说,迭代器统一了对容器的访问方式. 考虑这样的情景:原本是对着List编码,但是后来发现需要把相同的代码用于Set.我们需要一种不关心容器类型 而能 ...
- Codeforces_776B: Sherlock and his girlfriend(素数筛)
题目链接 题意:对2~n+1染色,一个数不能与其素因子同色. 故而只需两种颜色即可,素数染1,合数染2便可满足条件 #include<bits/stdc++.h> using namesp ...
- POJ 2566 尺取法(进阶题)
Bound Found Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 4297 Accepted: 1351 Spe ...
- 1、微信小程序----弹幕的实现(无后台)
小程序刚刚出来,现在网上的demo是多,但是要找到一个自己需要的却不容易.今天跟大家分享自己写的一个弹幕功能. 先来一张效果图: 我的思路是这样的,先用<switch>标签确定是否打开弹幕 ...
- IT软件管理人员的职业路线(从技术经理到总经理) - CEO之公司管理经验谈
技术.业务和管理永远是工作的一个话题.笔者今天就根据自身的经验,通过这三个方面介绍下IT软件管理人员的职业路线.前面写过一个文(IT软件技术人员的职位路线(从程序员到技术总监) - 部门管理经验谈), ...
- Spring源码情操陶冶-AbstractApplicationContext#postProcessBeanFactory
阅读源码有利于陶冶情操,承接前文Spring源码情操陶冶-AbstractApplicationContext#prepareBeanFactory 约定:web.xml中配置的contextClas ...
- Spring源码情操陶冶-AbstractApplicationContext#prepareRefresh
前言-阅读源码有利于陶冶情操,本文承接前文Spring源码情操陶冶-AbstractApplicationContext 约束: 本文指定contextClass为默认的XmlWebApplicati ...
- 花了一年时间开发的弯管机YBC编程软件
弯管技术广泛应用于锅炉及压力容器,空调制造,汽车,航空航天等多种行业.管型的形状复杂多变弯管工艺人员通常依据图纸输入关键点的坐标(XYZ坐标),然后生成可以由弯管机设备直接直接完成的加工指令YBC数据 ...
- 连续子序列最大和的O(NlogN)算法
对于一个数组,例如:int[] a = {4,-3,5,-2,-1,2,6,-2}找出一个连续子序列,对于任意的i和j,使得a[i]+a[i+1]+a[i+2]+.......+a[j]他的和是所有子 ...