Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

javascript题目解析——稀疏数组和filter方法 #7

Open
congtou221 opened this issue Jul 20, 2016 · 0 comments
Open

javascript题目解析——稀疏数组和filter方法 #7

congtou221 opened this issue Jul 20, 2016 · 0 comments

Comments

@congtou221
Copy link
Owner

@congtou221 congtou221 commented Jul 20, 2016

先来看题目:

//filter函数返回的结果是什么
var ary = [0, 1, 2];
var ary[10] = 10;
ary.filter(function(x){
    return x === undefined;
})

这道题考察的知识点是:稀疏数组、Array.prototype.filter方法。

稀疏数组

什么是稀疏数组

稀疏数组——具有不连续索引的数组,其length属性值大于元素的个数。
密集数组——具有连续索引的数组,其length属性值等于元素的个数。

如何产生稀疏数组

  • 用Array()构造函数。

    var a = new Array(5);

  • 在数组直接量中省略值。

    var a = [,,,];

  • 指定数组的索引值大于当前的数组长度。

    var a = [];
    a[1000] = 0;

  • 用delete操作符。
    var a = [1,2,3];
    delete a[1];

在稀疏数组上调用数组遍历方法

Array.prototype.forEach(callback[,thisArg])

Array.prototype.map(callback[,thisArg])

Array.prototype.filter(callback[,thisArg])

以上三个数组遍历方法都callback函数都不会处理稀疏数组的缺失元素;

但map函数返回的结果数组具有(与稀疏数组)相同的长度、相同的缺失元素;

而filter函数则直接返回密集数组,忽略稀疏数组中缺失的元素。

Array.prototype.filter()

语法
arr.filter(callback[, thisArg])

callback函数的执行规则
参数:自动传入三个参数

currentValue(当前被传递的元素);

index(当前被传递的元素的索引);

array(调用map方法的数组)

返回值:对每个传入callback的数组元素进行测试,callback函数返回true即通过测试。返回值即,所有通过测试的数组元素组成的新数组。

callback处理的数组范围:

  1. 只处理有值的索引。没有被赋值、被delete删除的索引(即稀疏数组中的缺失元素)不会被处理。
  2. 在处理过程中新增的元素不会被callback处理。
  3. 在处理过程中被删除的元素不会被callback处理。
  4. 在处理过程中被改变的元素,会以callback执行到该元素时的值被处理。

tips:综合2-4条:在callback第一次调用前,已经确定了被处理数组的最大范围。

thisArg
callback函数被调用时,this会指向thisArg参数所传的对象;

不向thisArg传值、或传的值为null/undefined时:在非严格模式下,this指向全局对象;在严格模式下,this指向undefined。

副作用
filter方法对原数组不产生影响。

题目分析

理解了所有背景知识以后,让我们再来看一下这道题:

//filter函数返回的结果是什么
var ary = [0, 1, 2];
var ary[10] = 10;
ary.filter(function(x){
    return x === undefined;
})

考察的知识点为:

1. 指定数组的索引值大于当前的数组长度时,会产生稀疏数组。

var ary = [0, 1, 2];
var ary[10] = 10;

//上述代码等价于
//var ary = [0, 1, 2, , , , , , , , 10];
//ary[3]至ary[9]均为稀疏数组的缺失元素

2. Array.prototype.filter()的callback函数不会处理稀疏数组的缺失元素。

ary.filter(function(x){
    return x === undefined;
}) 
//对于数组ary,即[0, 1, 2, , , , , , , , 10],callback只处理了0、1、2、10这四个元素
//由于0、1、2、10与undefined都不是严格相等的,四次执行回调函数都返回false
//因此filter函数的返回结果为[]

综上,这段代码中filter函数执行后返回的结果为[]。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
1 participant
You can’t perform that action at this time.