初学者跪着学JavaScript Day16 : 阵列Array 迭代的小小秘密

一日客语:中文:早安 客语:anˋzoˋ安走
前提:在学习Array.methods时会想知道他是如何迭代Array内的元素,才知道会有这一些稍微不同的迭代差异。

find、filter会迭代array,像是这样:

let a = ['apple', , , 'egg'];

a.find(function (value, index, array) {
    console.log('index:', index);
    console.log('value:', value);
    console.log('array:', array);
});
//结果
//index: 0
//value: apple
//array: [ 'apple', <2 empty items>, 'egg' ]
//index: 1
//value: undefined
//array: [ 'apple', <2 empty items>, 'egg' ]
//index: 2
//value: undefined
//array: [ 'apple', <2 empty items>, 'egg' ]
//index: 3
//value: egg
//array: [ 'apple', <2 empty items>, 'egg' ]

会把array元素一个个带进function

a = [0, 1, 2, 3, 4, 5, 6]

有想过在把a[4]元素带进CallBack function 的时候把後面元素删掉会发生什麽事吗?

find版本

执行方式:a[4]带入callBack function 带入时把a[5]元素删除

let a = [0, 1, 2, 3, 4, 5, 6];
a.find(function (value, index) {
    console.log('index:', index, 'value:', value);
    if (index == 4) {
        delete a[5];
    }
});
//结果
//index: 0 value: 0
//index: 1 value: 1
//index: 2 value: 2
//index: 3 value: 3
//index: 4 value: 4
//index: 5 value: undefined
//index: 6 value: 6

把元素迭代进function 事前会先把array.length长度算好,知道跑几次

就算把最後一个元素删除也是这样情况

let a = [0, 1, 2, 3, 4, 5, 6];
a.find(function (value, index) {
    console.log('index:', index, 'value:', value);
    if (index == 5) {
        delete a[6];
    }
});
//index: 0 value: 0
//index: 1 value: 1
//index: 2 value: 2
//index: 3 value: 3
//index: 4 value: 4
//index: 5 value: 5
//index: 6 value: undefined

因为一开始迭代长度已经算好,迭代时仍会找6

filter版本

会发现filter的index居然没有6!!和find不一样结果

let a = [0, 1, 2, 3, 4, 5, 6];
a.filter(function (value, index) {
    console.log('index:', index, 'value:', value);
    if (index == 5) {
        delete a[6];
    }
});
//index: 0 value: 0
//index: 1 value: 1
//index: 2 value: 2
//index: 3 value: 3
//index: 4 value: 4
//index: 5 value: 5

原因(aka小小秘密)

因此看一下ECMA 如何定义
ECMA 比较图:

演算法中filter方法多了HasProperty的确认机制,在find方法不会确认key为6的值存不存在而filter方法会~

像是map、reduce、forEach等常见方法也会确认HasProperty

不过在迭代时delete自己的property应该很少人这样使用,所以我自己把这个当作一个小小小小小的的知识


更详细Array methods 使用方式可以看看队友写的:
传送门
就决定是你了 - 阵列系列I
就决定是你了 - 阵列系列 II
就决定是你了 - 阵列系列III

感谢大神!
Cathy大大的神来之手 CathyShen-网页阿尼尛,到底是在干尛

资料参考:
ECMA262


<<:  Youtube Analytics API 教学 - OAuth2.0 开放授权 (2)

>>:  D3JsDay16 It's map birth,It's from path—生成地图

20. 在公司响起革新号角

前言 这篇蛮有趣的,适合senior以上,对组织各种不满,希望自己能帮助组织改变的人来看看。 演讲...

Day4 第一个HTML网页制作

VS CODE安装好之後,就可以来认识HTML啦~ 开始写HTML前的步骤 首先,在桌面上新增一个资...

[Day 30] 最後的行动装置

那个行动装置 虽然我们都概括说是手机版,但 Media Query 其实支援更多装置的呈现,只是,应...

Linux 移动档案夹

使用 mv 来更改档案名称 mv test1.txt test2.txt 使用 mv 来移动整个资料...

[Day06]没有稽核经验咋怎

在实习稽核阶段,如果没有导入经验或是稽核经验的时候,往往会非常吃亏。 (1) 无法从受稽方导入资讯...