js 对Array的补充
Array.form的用法
1.可以将各种值转为真正的数组,并且还提供map
功能。这实际上意味着,只要有一个原始的数据结构,你就可以先对它的值进行处理,然后转成规范的数组结构,进而就可以使用数量众多的数组方法。
2.另一个应用是,将字符串转为数组,然后返回字符串的长度。因为它能正确处理各种Unicode字符,可以避免JavaScript将大于\uFFFF
的Unicode字符,算作两个字符的bug。
<!DOCTYPE html> <html> <head> </head> <body> <p id="h01"></p> <script> 'use strict'; //便利NodeList数组 let ps = document.querySelectorAll('p'); console.log(ps); Array.from(ps).forEach( function(p) { console.log(p); }); //装换成数组 console.log(Array.from("hello")); //本来的数组,返回原来的 let array0 = ["d","f","g"]; console.log(Array.from(array0)); //按照一定的规则改变数组内的值 console.log(Array.from([1,3,5]).map(x => x * x * x)); console.log(Array.from([1,,4,6,,0],(n => n || 0))); //自定义改变数组内的值 function typesOf () { return Array.from(arguments,value => typeof(value)) ; } console.log(typesOf(null,[],NaN)); </script> </body> </html>
Array.of()
Array.of
方法用于将一组值,转换为数组
这个方法的主要目的,是弥补数组构造函数Array()
的不足。因为参数个数的不同,会导致Array()
的行为有差异。
Array.of
基本上可以用来替代Array()
或new Array()
,并且不存在由于参数不同而导致的重载。它的行为非常统一。
Array.of
总是返回参数值组成的数组。如果没有参数,就返回一个空数组。
Array() // [] Array(3) // [, , ,] Array(3, 11, 8) // [3, 11, 8]
Array.of() // [] Array.of(undefined) // [undefined] Array.of(1) // [1] Array.of(1, 2) // [1, 2]
Array.of
方法可以用下面的代码模拟实现。
function ArrayOf(){ return [].slice.call(arguments); }
数组推导
提供简洁写法,允许直接通过现有数组生成新数组。这项功能本来是要放入ES6的,但是TC39委员会想继续完善这项功能,让其支持所有数据结构(内部调用iterator对象),不像现在只支持数组,所以就把它推迟到了ES7。Babel转码器已经支持这个功能
var a1 = [1, 2, 3, 4]; var a2 = [for (i of a1) i * 2]; a2 // [2, 4, 6, 8]
上面代码表示,通过for...of
结构,数组a2
直接在a1
的基础上生成。
注意,数组推导中,for...of
结构总是写在最前面,返回的表达式写在最后面。
for...of
后面还可以附加if
语句,用来设定循环的限制条件。
var years = [ 1954, 1974, 1990, 2006, 2010, 2014 ]; [for (year of years) if (year > 2000) year]; // [ 2006, 2010, 2014 ] [for (year of years) if (year > 2000) if(year < 2010) year]; // [ 2006] [for (year of years) if (year > 2000 && year < 2010) year]; // [ 2006]
上面代码表明,if
语句要写在for...of
与返回的表达式之间,而且可以多个if
语句连用。
map 和filter的区别:
map是对原数组的加工,filter是对原数组的过滤