美文网首页Web 前端开发 让前端飞Web前端之路
2017.12.9-学习笔记:篇五之es6数组的扩展

2017.12.9-学习笔记:篇五之es6数组的扩展

作者: bixin | 来源:发表于2017-12-09 19:19 被阅读23次

数组的扩展

→点我去看基本的数组方法
→点我去看基本的字符串方法
→点我去看ES5新增的数组方法
→点我去看ES6新增的字符串方法

1.扩展运算符(...)

它好比 rest 参数的逆运算,将一个数组转为用逗号分隔的参数序列。

console.log(...[1, 2, 3])
// 1 2 3
 console.log(1, ...[2, 3, 4], 5)
// 1 2 3 4 5
  • 该运算符主要用于函数调用,如替代数组的 apply 方法
function add(a, b, c) {
  console.log(a + b + c);
}
let arr = [1, 2, 3];
add.apply(null, arr); // 6 ==> es5
add(...arr); // 6 ==> es6

Math.max.apply(null, [1, 2, 3]); // 3 ==> es5 写法
Math.max(...[1, 2, 3]); // 3 ==> ES6 写法
  • 扩展运算符的应用
// 1.复制数组
const a = [1, 2];
const b = [...a];
const [...c] = a;

// 2.合并数组(取代concat)
var a = [1, 2];
var b = [3, 4];
a.concat(b); // [1,2,3,4] ==> es5 写法
[...a, ...b]; // [1,2,3,4] ==> es6 写法

// 3.与解构赋值结合,生成数组
let [a, ...b] = [1, 2, 3, 4]
a // 1
b // [2,3,4]

// 4.将字符串转为真正的数组
let str = "abc";
[...str] // ["a","b","c"];
Array.from('abc'); // ['a','b','c'];

str.split("").reverse().join(""); ==> es5 写法
[...str].reverse().join(""); ==> es6 写法

2.array.from

Array.from(arrayLike: ?, mapFn?: fn(elt: ?, i: number), thisArg?: ?)

  • 参数
    arg1:类似数组的对象
    arg2:map 函数
    arg3:绑定 map 函数内的 this

  • 该方法用于将两类对象转为正真的数组:类似数组的对象和遍历的对象( 包括 set 和 map )

let arrLike = {
  '0': 'a',
  '1': 'b',
  '2': 'c',
  length: 3
};

var arr1 = [].slice.call(arrLike); // ["a", "b", "c"] ==> es5
let arr2 = Array.from(arrLike); // ["a", "b", "c"] ==> es6
  • 实际应用中,常见的类似数组的对象是 DOM 操作返回的 NodeList 集合,以及函数内部的 arguments 对象

  • 将字符串转为数组

Array.from('abc'); // ['a','b','c'];
[...'abc']; // ['a','b','c'];
'abc'.split(''); // ['a','b','c'];
  • 扩展运算符背后调用的是遍历器接口(Symbol.iterator),如果一个对象没有部署这个接口,就无法转换。Array.from方法还支持类似数组的对象。所谓类似数组的对象,本质特征只有一点,即必须有length属性。因此,任何有length属性的对象,都可以通过Array.from方法转为数组,而此时扩展运算符就无法转换。

  • Array.from还可以接受第二个参数,作用类似于数组的map方法,用来对每个元素进行处理,将处理后的值放入返回的数组。

Array.from('123',x=>x+'a'); // ["1a", "2a", "3a"]
  • 栗子,返回各种数据的类型
// 用arguments
function typesOf() {
  return Array.from(arguments, p => typeof p)
}
typesOf(null, [], NaN, 'abc', undefined, {}); // ["object", "object", "number", "string", "undefined", "object"]

// 用rest参数
function typesOf(...rest) {
  return Array.from(rest, p => typeof p)
}
typesOf(null, [], NaN, 'abc', undefined, {}); // ["object", "object", "number", "string", "undefined", "object"]
  • 栗子,处理两次函数
Array.from({length:2},()=>'a'); // ["a", "a"]

将 Set 结构转为数组

let items = new Set([1, 2, 3]);
let array = Array.from(items);

3.array.of

1.该方法返回参数值组成的数组。如果没有参数,就返回一个空数组。
2.替代Array()或new Array(),并且不存在由于参数不同而导致的重载。
( 感觉没什么用,直接用中括号不就完了吗 [ ] )

4.数组实例的copyWithin

[].copyWithin(target: number, start: number, end?: number)

  • 参数
    arg1:从该位置开始替换数据
    arg2:从该位置开始读取数据,默认为 0。如果为负值,表示倒数
    arg3:到该位置前停止读取数据,默认等于数组长度。如果为负值,表示倒数

  • 数组实例的copyWithin方法,在当前数组内部,将指定位置的成员复制到其他位置(会覆盖原有成员),然后返回当前数组。也就是说,使用这个方法,会修改当前数组。

['a','b','c'].copyWithin(0,1); // ["b", "c", "c"];

5.数组实例的find和findIndex

  • 找出第一个符合条件的数组成员(下标)(好像没什么使用场景)
[].find(callback: fn(element: ?, index: number, array: [?]) : bool, thisArg?: ?)

[].findIndex(callback: fn(element: ?, index: number, array: [?]), thisArg?: ?)

6.数组实例的fill

  • 替换、填充数组
    [].fill(value: ?, start?: number, end?: number)

9.数组实例的includes

[].includes(value: ?)

  • 返回布尔值,判断某数组是否包含某个 value 值
  • es5 中用 indexOf(value)===-1? 来判断是否包含

编程风格之类数组对象转数组

let ps = document.querySelectorAll('p');

// es5
[].slice.call(ps).forEach(p=> {
  console.log(p.innerText);
});

// es6
Array.from(ps).forEach(p=> {
  console.log(p.innerText);
});
[...ps].forEach(p=>{console.log(p.innerText)});



Knowledge changes the mind

相关文章

网友评论

    本文标题:2017.12.9-学习笔记:篇五之es6数组的扩展

    本文链接:https://www.haomeiwen.com/subject/fgbqbxtx.html