ECMAScript 6 简介
本笔记相当于阮一峰老师的ES6教程进行了进一步浓缩
- ECMAScript 6.0(以下简称 ES6)是 JavaScript 语言的下一代标准,已经在 2015 年 6 月正式发布了。
- ECMAScript 是 JavaScript 语言的标注规范。
- JavaScript 是 ECMAScript 规范的具体实现。
- ECMAScript 6 也被称作 ECMAScript 2015
- 目前,各大浏览器对 ES6 的支持可以查看kangax.github.io/compat-table/es6/。
- 对于不支持 ES6 的环境,可以使用一些编译转码工具做转换处理再使用
let 和 const 命令
1. let命令特性
1.1 let 具有块级作用域
1 2 3 4 5 6 7
| { let a = 10; var b = 1; }
console.log(a); console.log(b);
|
1.2 不存在变量提升
1 2
| console.log(bar); let bar = 2;
|
1.3 暂时性死区
1 2 3 4 5 6 7
| var tmp = 123 if (true) {
tmp = 'abc'; let tmp; }
|
1.4 不允许重复声明
let
不允许在相同作用域内,重复声明同一个变量。
1 2 3 4 5 6 7 8 9 10 11
| function func() { let a = 10; var a = 1; }
function func() { let a = 10; let a = 1; }
|
2. 块级作用域的好处
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| <body> <button>按钮1</button> <button>按钮2</button> <button>按钮3</button> <button>按钮4</button> <script> var btns = document.querySelectorAll("button");
for (let i = 0; i < btns.length; i++) { btns[i].onclick = function () { alert(i) }
}; </script> </body>
|
3. const 命令特性
和 let 特性一样 唯一的区别在于 const 声明后不能再修改,常量
1 2 3 4 5 6
| const ary = [100, 200]; ary[0] = 1; console.log(ary); ary = [3, 4]; console.log(ary);
|
4. 解构赋值
注意:解构赋值 必须要同时进行,不能先声明再赋值 如: let {a,b}; {a,b}={a:12,b:5} 这样是错的
4.1 基本使用
1 2 3 4
| let [a,b,c] = [1,2,3] let a = 1 let b = 2 let c = 3
|
本质上,这种写法属于“模式匹配”,只要等号两边的模式相同,左边的变量就会被赋予对应的值
1 2 3 4 5
| function f() { console.log('aaa'); }
let [x = f()] = [1];
|
上面代码中,因为x能取到值,所以函数f根本不会执行。上面的代码其实等价于下面的代码。
1 2 3 4 5 6
| let x; if ([1][0] === undefined) { x = f(); } else { x = [1][0]; }
|
4.2 对象的解构赋值
1 2 3 4 5 6
| let { bar, foo } = { foo: 'aaa', bar: 'bbb' }; foo bar
let { baz } = { foo: 'aaa', bar: 'bbb' }; baz
|
4.3 字符串的解构赋值
1 2 3 4 5 6
| const [a, b, c, d, e] = 'hello'; a b c d e
|
4.4 函数参数的解构赋值
1 2 3 4 5
| function add([x, y]){ return x + y; }
add([1, 2]);
|
上面代码中,函数add的参数表面上是一个数组,但在传入参数的那一刻,数组参数就被解构成变量x和y。对于函数内部的代码来说,它们能感受到的参数就是x和y。
4.5 用途
(1) 交换变量的值
1 2 3 4
| let x = 1; let y = 2;
[x, y] = [y, x];
|
上面代码交换变量x和y的值,这样的写法不仅简洁,而且易读,语义非常清晰。
(2)从函数返回多个值
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
|
function example() { return [1, 2, 3]; } let [a, b, c] = example();
function example() { return { foo: 1, bar: 2 }; } let { foo, bar } = example();
|
(3)提取 JSON 数据
解构赋值对提取 JSON 对象中的数据,尤其有用。
1 2 3 4 5 6 7 8
| let jsonData = { id: 42, status: "OK", data: [867, 5309] }; let { id, status, data: number } = jsonData; console.log(id, status, number);
|
5.字符串的扩展
模板字符串
1 2 3 4 5 6 7 8 9 10 11
| let uname = '王鹏飞';
let str = `hello,我的名字是${uname}`; console.log(uname); console.log(str);
let arr = [1, 55, 88, 4156, 12]; arr.forEach((item, index) =>console.log(`第${index}个:${item}`));
|
startsWith 和 endsWidth
- startsWith() : 表示参数字符串是否在原子符串的头部,返回布尔值
- endsWidth() :表示参数字符串是否在原字符串的尾部,返回布尔值
1 2 3
| let str = 'hello world' str.startsWith('hello') str.endsWidth('!')
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| let start = 'https://www.baidu.com/'; if (start.startsWith('http:')) { console.log('普通网址'); } else if (start.startsWith('https:')) { console.log('加密网址'); } else if (start.startsWith('svg:')) { console.log('库'); } else { console.log('其他网址') };
let end = '1.jpg'; if (end.endsWith('.jpg')) { console.log('jpg图片'); } else if (end.endsWith('.png')) { console.log('png图片'); } else if (end.endsWith('.webp')) { console.log('webp图片'); }
console.log('wpf'.repeat(3));
|
6.数组的扩展
6.1 Array.from()
Array.from方法用于将两类对象转为真正的数组:类似数组的对象(array-like object)和可遍历(iterable)的对象(包括 ES6 新增的数据结构 Set 和 Map)。
下面是一个类似数组的对象,Array.from将它转为真正的数组。
1 2 3 4 5 6 7 8 9 10 11 12
| let arrayLike = { '0': 'a', '1': 'b', '2': 'c', length: 3 };
var arr1 = [].slice.call(arrayLike);
let arr2 = Array.from(arrayLike);
|
实际应用中,常见的类似数组的对象是 DOM 操作返回的 NodeList 集合,以及函数内部的arguments对象。Array.from都可以将它们转为真正的数组。
1 2 3 4 5 6 7 8 9 10 11
| let ps = document.querySelectorAll('p'); Array.from(ps).filter(p => { return p.textContent.length > 100; });
function foo() { var args = Array.from(arguments); }
|
上面代码中,querySelectorAll方法返回的是一个类似数组的对象,可以将这个对象转为真正的数组,再使用filter方法。
6.2 Array.of()
Array.of方法用于将一组值,转换为数组。
1 2 3
| Array.of(3, 11, 8) Array.of(3) Array.of(3).length
|
这个方法的主要目的,是弥补数组构造函数Array()的不足。因为参数个数的不同,会导致Array()的行为有差异.
1 2 3
| Array() Array(3) Array(3, 11, 8)
|
6.3 数组实例的 find() 和 findIndex()
find()
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| const arr = [{ name: 'wpf', age: 23 }, { name: 'zyz', age: 24 }, { name: 'zd', age: 25 } ] let newArr = arr.find(item => item.name === 'wpf') console.log(newArr);
|
findIndex()
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| const arr = [{ name: 'wpf', age: 23 }, { name: 'zyz', age: 24 }, { name: 'zd', age: 25 } ] let newArr = arr.findIndex(item => item.name === 'zyz') console.log(newArr);
|
数组实例的 includes()
数组中是否包含某个元素
1 2 3
| [1, 2, 3].includes(2) [1, 2, 3].includes(4) [1, 2, NaN].includes(NaN)
|
rest参数
rest 参数(形式为…变量名),用于获取函数的多余参数,这样就不需要使用arguments对象了。rest 参数搭配的变量是一个数组,该变量将多余的参数放入数组中。
1 2 3 4 5
| function fn(a, ...args) { console.log(...args); console.log(args); } fn(1, 2, 3)
|
箭头函数
箭头函数就是用来简化函数定义语法的
适用场景: 在方法中使用。 比如: find(),map(),等
1 2 3 4
| funciton sum (num1,num2){ return num1 + num2 } const sum = (num1,num2) => num1 + num2
|
- 箭头函数特点
- 如果形参只有一个的话,可以省略小括号()
- 如果函数体中的代码只有一个return,可以省略小括号()
- this指向的是原先定义好的位置,而不是随着当前箭头函数的位置而改变
- 由于箭头函数this 的指向问题 所以:
- 不可以当作构造函数,也就是说,不可以使用new命令,否则会抛出一个错误。
- 不可以使用arguments对象,该对象在函数体内不存在。如果要用,可以用 rest 参数代替。
1 2 3 4 5 6 7 8 9
| function Person() { this.age = 0; setInterval(() => { this.age++; }, 3000); }
var p = new Person();
|