Javascript数组与算法相关面试要点及答案

匿名网友 匿名网友 发布于: 2016-06-13 00:00:00
阅读 204 收藏 0 点赞 0 评论 0

数组的属性与方法(Javascript权威指南第六版)

 

构造函数

 

new Array();

new Array(size);

new Array(ele1,ele2,…,elen);

返回值

 

新建和初始化数组。当不带参数调用Array()时,返回的数组为空,length属性为0。当用单个数值参数调用时,构造函数返回的数组带有指定个数的未定义元素。使用其他参数调用时,构造函数会使用指定的参数值初始化数组。当Array()构造函数不带new操作符,直接当做函数调用时,其表现行为与带new操作符调用时是完全一样的。

 

异常

 

RangeError:当size为负数时或者大于2e32-1时,会抛出RangeError异常。

 

直接量语法

 

var a = [1, true, ‘abc’];

var b = [a[0], a[0]*2, f(x)];

属性

 

length

方法

 

在ES5之前,除了IE,其他浏览器已经实现了以下方法:

 

concat()

every()

filter()

forEach()

indexOf()

join()

lastIndexOf()

map()

pop()

push()

reduce()

reduceRight()

reverse()

shift()

slice()

some()

sort()

splice()

toLocalString()

toString()

unshift()

ES5新添加了以下方法:

 

every()

filter()

forEach()

indexOf()

lastIndexOf()

map()

reduce()

reduceRight()

some()

Array.concat()

 

衔接数组

 

array.concat(value, …)

返回值

 

返回一个新数组,包含array的元素以及衔接的新元素

 

细节

 

concat()会将参数衔接到array中得到一个新数组并返回;

它不会修改原数组array;

如果传给concat()的某个参数本身是一个数组,则会将数组的元素衔接到array中,而不是数组本身。多维数组只传递本维度的数组元素。

示例

 

var a = [1,2,3];

a.concat(4,5); //[1,2,3,4,5]

a.concat([4,5]); //[1,2,3,4,5]

a.concat([4,5],[6,7]) //[1,2,3,4,5,6,7]

a.concat(4,[5,[6,7]]) //[1,2,3,4,5,[6,7]]

Array.every()

 

测试断言函数是否对每个函数为真

 

array.every(predicate);

array.every(predicate, o);

predicate:用来测试数组元素的断言函数。 o:调用predicate时的可选this值。

 

返回值

 

如果predicate函数都返回true,则返回true;如果有任何一个元素的predicate返回false,则返回false。

 

细节

 

every()方法用来测试数组的所有元素是否满足某些条件。它会遍历array的元素,对每个元素调用predicate函数,遇到false则终止遍历,返回false。当遍历的数组为空,返回true。

 

对数组的每一个序号i,调用predicate时带有三个参数:

 

predicate(array[i], i, array);

示例

 

[1,2,3].every(function(x){ return x < 5; }) //=>true:所有元素都小于5

[1,2,3].every(function(x){ return x < 3; }) //=>false:最后一个元素不小于3

[].every(function(x){ return false; }) //=>true:空数组总返回true

Array.filter()

 

返回通过断言的数组元素

 

array.filter(predicate);

array.filter(predicate, o);

返回值 新数组,返回一个只包含那些让predicate返回true的数组元素组成的新数组。

 

细节

 

filter()会创建一个新数组,包含那些predicate返回true的数组元素;

不会修改array数组本身(但是predicate可能会修改);

按序号从小到大遍历数组,predicate函数有三个参数

 

predicate(array[i], i, array)

示例

 

[1,2,3].filter(function(x){ return x > 1; }) //=>[2,3]

Array.forEach()

 

为每一个数组元素调用一个函数

 

array.forEach(f);

array.forEach(f, o);

返回值 无返回值

 

细节

 

按序号从小到大遍历数组,对每一个数组元素调用一次f;

 

f(array[i], i, array);

f的任何返回值都会被忽略,注意forEach()没有返回值。特别注意,它不会返回数组。

 

数组方法的细节

 

下述细节适用于forEach()方法,也适用于相关方法:map(), filter(), every()和some()。

 

所有这些方法都接受函数作为第一个参数,并接受可选的第二个参数。如果指定了第二个参数o,则调用函数时,就好像该函数是o的方法一样。也就是说,在函数体内,this值等于o。如果没有指定第二个参数,则就像函数一样调用该参数(而不像方法),this值在非严格模式下是全局对象,在严格模式下则是null。

 

所有这些方法都会在开始遍历前就记录array的length长度。如果调用函数把新元素追加到array中,这些新元素是不会遍历到的。如果调用的函数修改了为遍历到的已存在元素,则调用时会传递修改后的值。

 

当作用于稀疏数组时,这些方法不会在实际不存在元素的序号上调用函数。

 

示例

 

var a = [1, 2, 3];

a.forEach(function(x,i,a){ a[i]++; }); //a现在是[2,3,4]

Array.indexOf()

 

查找数组

 

array.indexOf(value);

array.indexOf(value, start);

value:要在array中查找的值; start:开始查找的可选数组序号。如果省略,默认为0。

 

返回值 一个大于等于start的最小序号值,该序号值处的array元素与value全等。如果不存在匹配的元素,则返回-1。

 

细节

 

查找value值在array中的序号,并返回第一个匹配的序号;

查找的起始位置从start指定的数组序号开始(包括start),如果没有start,则从0开始,直到找到匹配的元素或者检查完所有元素。

判断是否相等使用”===”操作符。

返回找到的第一个匹配元素的序号,若没找到,返回-1。

示例

 

[‘a’, ‘b’, ‘c’].indexOf(‘b’) //=> 1

[‘a’, ‘b’, ‘c’].indexOf(‘d’) //=> -1

[‘a’, ‘b’, ‘c’].indexOf(‘a’, 1) //=> -1

Array.join()

 

将数组元素衔接为字符串

 

array.join();

array.join(separator);

separator:分隔符,如果省略,默认是英文逗号(,)。

 

返回值

 

一个字符串。

 

细节

 

逆向方法String.split()。

 

示例

 

a = new Array(1,2,3,”testing”);

s = a.join(“+”); // s是字符串”1+2+3+testing”

Array.lastIndexOf()

 

反向查找数组,参照Array.indexOf()。

 

array.lastIndexOf(value);

array.lastIndexOf(value, start);

Array.map()

 

从数组元素中计算新值

 

array.map(f);

array.map(f, o);

返回值

 

一个新数组,由函数f计算出的元素组成。

 

细节

 

map()会创建一个新数组,长度与array一样,数组元素通过将array的元素传递给f计算得到。

原数组不变。

map()按照从小到大的顺序遍历array的序号,并为每一个元素调用一次f,对于序号i,调用f时带有三个参数:

 

a[i] = f(array[i], i, array);

示例

 

var arr = [1,2,3];

arr.map(function(x){return x*x; }); //=>[1,4,9]

Array.pop()

 

移除并返回数组的最后一个元素

 

array.pop();

返回值

 

array的最后一个元素

 

细节

 

会改变原数组,移除array的最后一个元素,缩短数组长度;

返回所移除的元素的值;

如果数组为空,返回undefined,不会修改原数组array。

示例

 

pop()与push()可以提供先进后出(FILO)的栈功能

 

var stack = []; // stack: []

stack.push(1,2); // stack: [1,2] 返回2

stack.pop(); // stack: [1] 返回2

stack.push([4,5]); // stack: [1,[4,5]] 返回[4,5]

stack.pop(); // stack: [1] 返回[4,5]

stack.pop(); // stack: [] 返回1

Array.push()

 

给数组追加元素

 

array.push(value, …)

返回值

 

数组的新长度

 

细节

 

直接修改array,array的长度会改变。

可以和pop()一起提供先进后出的栈功能。

示例

 

参照Array.pop()。

 

Array.reduce()

 

从数组元素中计算出一个值

 

array.reduce(f);

array.reduce(f, inital);

f:一个函数,可以合并两个值(比如两个数组元素),并返回一个”缩减”的新值。 inital:用来缩减数组的可选初始值。如果指定该参数,reduce()的行为会像是把该参数插入到array的头部一样。

 

返回值

 

数组的化简值,该值是最后一次调用f时的返回值。

 

细节

 

reduce()方法就收函数f作为第一个参数。该函数的行为应该像一个二元操作符一样:接受两个值,执行某些操作,返回结果。如果array有n个元素,reduce()的方法会调用n-1次来将这些元素缩减为一个合并值。

第一次调用f时传入的是array的前两个元素。接下来的调用会传入之前的计算值和array的下一个元素(按从小到大的序号顺序)。最后一次调用f的返回值会成为reduce()方法的返回值。

可以传入可选的参数inital。如果指定inital,reduce()的行为会像是把该参数插入到数组头部一样(注意,实际上并没有修改数组)。当指定inital时,要缩减的元素有n+1个,调用n次f。

如果array为空,又没有指定inital,会抛出typeError异常。

如果array为空,但指定inital,则返回inital,且永远不调用f。

如果array只有一个元素,且没有指定inital,则不调用f,返回array的单个元素。

实际上f有四个参数,第三个参数是第二个参数的序号,第四个是array本身:

 

f(a1,a[i],i,array);

示例

 

[1,2,3,4].reduce(function(x,y){ 

        return x*y; 

    }); //=> 24: ((1*2)*3)*4

Array.reduceRight()

 

从右到左缩减数组

 

array.reduceRigt(f);

array.reduceRight(f, initial);

返回值

 

数组的缩减值,参照reduce()。

 

细节

 

与reduce()一样,唯一区别就是从右到左(序号从大到小)

 

示例

 

[2,10,60].reduceRight(function(x,y){

    return x/y;

}); //=>3:(60/10)/2

Array.reverse()

 

颠倒数组中的元素顺序

 

array.reverse();

细节

 

在原数组中进行操作,重新调整array的元素,而不是创建一个新的数组

示例

 

a = new Array(1,2,3);

a.reverse(); // a现在是[3,2,1]

Array.shift()

 

移除数组的第一个元素

 

array.shift();

返回值 数组原来的第一个元素

 

细节

 

移除并返回array第一个元素,并将所有后续元素前移一位,填补数组头部空缺。

如果数组为空,shift()什么也不干,直接返回undefined。

没有创建新的数组,直接修改原数组array。

与unshift()一起使用。

示例

 

var a = [1,[2,3],4];

a.shift(); //返回1,a = [[2,3],4]

a.shift(); //返回[2,3], a = [4]

Array.slice()

 

返回数组的一部分

 

array.slice(start,end);

start:数组片段开始处的序号。如果为负数,则表示从数组尾部开始计算。 end:数组片段结束处的序号。如果没有指定,该片段会包含从start到数组结束的所有数组元素。如果为负数,则表示从数组尾部开始计算。

 

返回值

 

一个新数组。包含从start到end之间的所有元素(包含start指定的元素,不包含end指定的元素)。

 

细节

 

返回array的片段,或者称为子数组。

从start到end之间的所有元素(包含start指定的元素,不包含end指定的元素)。

如果没有指定end,该片段会包含从start到数组结束的所有数组元素。

slice()不修改原数组array,而是生成新的数组。如果要移除原数组的一部分,参照splice()。

示例

 

var a = [1,2,3,4,5];

a.slice(0,3); //返回 [1,2,3]

a.slice(3); //返回 [4,5]

a.slice(1,-1); //返回 [2,3,4]

a.slice(-3,-2); //返回 [3]; 在IE4下有误:返回 [1,2,3],IE4下bug:start不能为负数,IE的后续版本已经修复

Array.some()

 

判断是否有元素满足断言函数

 

array.some(predicate);

array.aome(predicate, o);

返回值 如果array中有至少一个元素调用predicate时返回true,则返回true。如果所有元素调用predicate都返回false,则返回false。

 

细节

 

测试是否有元素满足某些条件。

按从小到大的序号顺序遍历array数组,并依次调用predicate函数,如果调用返回true,则停止遍历,返回true。如果每一次都返回false,则一直遍历到数组结尾,返回false。

如果数组为空,则总是返回false。

类似every()。

示例

 

[1,2,3].some(function(x){ return x>5; }); //返回false

[1,2,3].some(function(x){ return x>2; }); //返回true

[].some(function(x){ return true; }); //返回false,空数组总返回false

Array.sort()

 

对数组元素进行排序

 

array.sort();

array.sort(orderfunc);

返回值 该数组的引用。注意是在原数组上进行排序,没有创建新的数组。

 

细节

 

在原数组上进行排序,没有创建新的数组。

如果调用sort()时不带参数,则按照字母顺序(更精确的说,是字符编码顺序)对数组进行排序。需要将元素转化为字符串,然后进行比较。

调用sort()时带有比较函数orderfunc的话,返回一个值表示相对顺序,比较函数接受两个参数a和b,并返回如下:

 

一个小于0的值。表示a<b,表示a应该排在b的前边。

0。a = b,a和b相等。

一个大于0的值。a > b,表示a应该排在b的后边。

数组中的undefined元素始终排在数组末尾,因为undefined不会传给orderfunc。

 

示例

 

//用于数组排序的排序函数

function numberorder(a, b){ return a-b; };

a = new Array(33, 4, 1111, 222);

a.sort(); //字母排序:1111,222,33,4

a.sort(numberorder); //数值排序:4,33,222,1111

Array.splice()

 

插入,删除或替换数组元素

 

array.splice(start, deleteCount, value, …)

start:开始插入和(或)删除处的数组元素的序号。 deleteCount:要删除的元素个数,从start开始,并包含start处的元素。如果指定为0,表示插入元素,而不用删除任何元素。 value,…:要插入数组的0个或多个值,从start序号处开始插入。

 

返回值

 

如果从array中删除了元素,则返回一个新数组,包含这些剔除的元素。

 

细节

 

删除从start开始(包含start)的零个或多个元素,并用参数领表中的零个或多个值替换掉那些删除的元素。

位于插入或删除的元素之后的数组元素,在有必要的情况时都会移动,以保持与原数组中剩余元素的连续性。

与slice()不同,splice()会直接修改数组,而slice()创建一个原数组的一个子数组。

示例

 

var a = [1,2,3,4,5,6,7,8];

a.splice(1,2); //返回 [2,3]; a此时变为[1,4,5,6,7,8]

a.splice(1,1); //返回 [4]; a此时为[1,5,6,7,8]

a.splice(1,0,2,3); //返回 []; a此时为[1,2,3,5,6,7,8]

Array.toLocaleString()

 

将数组转化为本地化字符串

 

array.toLocaleString()

返回值 数组本地化字符串表示

 

细节

 

调用该方法时如果对象不是Array,则抛出TypeError异常。

它首先调用数组所有元素的toLocaleString()方法,然后使用地区特定的分隔字符将结果字符串连接起来。

参考Array.toString()、Object.toString()。

Array.toString()

 

将数组转化成字符串

 

array.toString()

返回值 array的字符串表示

 

细节

 

调用该方法时如果对象不是Array,则抛出TypeError异常。

当数组用于字符串上下文时,Javascript会调用该方法将数组自动转换成一个字符串。但是在一些场景下,还是需要显示调用该方法。

它首先调用数组所有元素的toString()方法,然后使用逗号将结果字符串连接起来,返回与不带参数join()返回值是一样的。

Array.unshift()

 

在数组头部插入元素

 

array.unshift(value, …)

返回值 新数组的长度

 

细节

 

会将参数插入array头部,后边的元素数次后移。

不创建新数组,直接修改array本身。

示例

 

//unshift()经常与shift()一起使用

var a = []; //a:[]

a.unshift(1); //a:[1] 返回1

a.unshift(22); //a:[22,1] 返回2

a.shift(); //a:[1] 返回22

a.unshift(33,[4,5]); //a:[33,[4,5],1] 返回3

评论列表
文章目录