跳到主要内容

数组

数组中的空值

考虑下面的代码,array 的结果是什么?

let array = [ ,1 , ,2 , ,3];
array = array.map(i => ++ i);

答案:[ ,2 , ,3 , ,4]

🔍 解析

array 的长度实际是 6,第一个、第三个、第五个元素都是空值(empty)。map 函数在遍历数组时会跳过运算空值,但最终结果会保留它,因此有值的元素进行了运算,空值元素不变。

💡 数组中的迭代方法都是怎样对待空值的?

例如:

ary = [ ,1 , ,null ,undefined ,2];    // 长度是 6 四个空值
ary.forEach(i => { console.log(i) });

ary = [ ,1 , ,null ,undefined ,2];
var res1 = ary.join("");
var res2 = ary.join();
console.log("join(''): ", res1);
console.log("join(): ", res2);

ary = [ ,1 , ,null ,undefined ,2];
var res = ary.reduce((prev, cur) => prev + cur);
console.log("reduce: ",res);

ary = [ ,1 , ,null ,undefined ,2];
var res = ary.every(i => i < 4);
console.log("every: ",res);

console.log("toString: ",ary.toString());

打印结果:

1
null
undefined
2
join(''): 12
join(): ,1,,,,2
reduce: NaN
every: false
toString: ,1,,,,2

forEacheveryreduce 函数都会忽略数组中的空值,但 nullundefined 并不会认为是空值,所以 reduce 返回了 NaN(undefined + 1 等于 NaN)。undefined 与数值比较结果总是 false,因此 every 最终返回了 false

join 函数的参数如果省略,数组元素用逗号(,)分隔。如果是空字符串(""),则所有元素之间都没有任何字符。如果一个元素为 undefinednull,它会被转换为空字符串。toString 的返回结果与 join 函数没有参数时返回结果一样。

其他的,如 filter 函数和 some 函数也会跳过数组中的空值,sort 函数在排序时 undefined 会排在数组后面,空值会排在 undefined 后面,无论做怎样的排序。当数组中有 null 时,就比较奇特了,例如下面的比较:

console.log("null < 1: ",null < 1); // true
console.log("null <= 2: ",null <= 2); // true
console.log("null >= 1: ",null >= 1); // false
console.log("null <= 0: ",null <= 0); // true
console.log("null >= 0: ",null >= 0); // true
console.log("null > 0: ",null > 0); // false
console.log("null < 0: ",null < 0); // false
console.log("null == 0: ",null == 0); // false

null 可以大于等于 0,可以小于等于 0,而去掉等号会返回 false,结果 null 最终判定不与 0 相等。。。当数组中有 0 和 null 时,给数组排序,0 可能出现在 null 之前,也可能出现在 null 之后。

扩展运算符浅复制一个数组,空值会被转成 undefinedpopshift 操作一个空值时,返回的结果会被转成 undefined

数组去重

ES5 中利用对象去重

var unique = function(array){
var obj = {},
result = [];
for(var v of array){
if(!obj[v]){
// 对象中没有这个属性时就添加
result.push(v);
obj[v] = v;
}
}
return result;
}

ES6 中利用 Set 去重:

var unique = function(array){
return [...new Set(array)];
}

寻找数组中的最大项

ES5 中使用 Math.minMath.max 来实现。

var getMaxItem = function(array){
return Math.max.apply(null,array);
}
var getMinItem = function(array){
return Math.min.apply(null,array);
}

ES6 的实现

var getMaxItem = function(array){
return Math.max(...array);
}
var getMinItem = function(array){
return Math.min(...array);
}