今天听公开课,趁热整理一下es6的相关知识点
ES6提供了新的变量声明方式代替var 【let , const】
var 与 let 声明的特点
1. var 不支持封闭作用域,会声明到全局作用域上 i==window.i
- let 和 {} 配合可以产生一个作用域
- let 支持块级作用域声明的变量只会声明在当前作用域内,不会上升到全局作用域
- let 可以解决作用域污染问题和局部作用域问题
2. 在同一个作用域内,用 var 可以多次声明同一个变量,let 可以防止变量被重复声明
3. 域解析问题,变量提升问题,可以用 let 解决这个问题
暂存死区: 某个作用域中有这啊用一个变量,那么在该作用域内就绑定这个变量,不会继续向上查找了
let a = 1;
{
console.log('a:',a) // 结果为 a = 3 因为在该作用域内查找到有 a 的定义,所以就不会继续往上层去查找了
a = 3
}4. 通过 const 声明的变量不能被修改,不能被修改引用空间
1. const a = 1; a = 2; //这是错误的 Uncaught SyntaxError: Identifier 'a' has already been declared
2. const a = {name: 'momo'}
a.age = 20 // 这是可以的,因为空间没有被修改,仍然是指向同一个变量a ,只是变量内容更变化了
解构赋值: 声明和赋值都放在一起了
解构: 表示等号左边和右边的解构类似
- 数组的位置必须相同
- 对象解构时的名称必须相同
- 如果有关键字可以采用
[关键字]:[别名]的形式进行更改姓名 - 如果要设置某个属性的默认值,使用
[键] = [值] - 解构的应用:函数传参
// 数组的必须位置相同
let [, age] = ['momo', 9];
// 对象解构时名字必须相同
let { length } = ['momo', 9];
console.log(length); // 2// 如果有关键字可以采用:的形式进行更改名字
let { name, age, default: d } = { name: 'momo', age: 9, default: 'xxx' };
console.log(d);// 如果想设置某个属性的默认值 必须采用=号的方式
let [, { address: [, a] }, hobby = '游泳'] = [
{ name: 'zfpx' },
{ age: 9, address: [1, 2, 3] },
]
console.log(hobby);
// 解构的应用
function test() {
return [1, 2, 3];
}
let [a, b, c] = test();
function ajax({ url = new Error('url without'), type = "get", data = xxx }) {
console.log(url, type, data);
}
ajax({
url: '/test',
data: {}
});ES6 模板字符串 (特殊的字符串)
- 模板字符串取代了原有的字符串拼接功能 `` [英文状态下输入的键盘上tab键上面的那一个键]
let name = 'momo'
let age = 19
let str = `Hello~ ${name}`- 用 ``包住的字符串,只需要在里面用 `${name}` 这个方式就可以嵌套变量了
- 可以支持换行,不用转义字符
- 自己实现一个类模板字符串
let name = 'zfpx'; let age = 9; let str = 'hello~${name}今年${age}岁了'; str = str.replace(/\$\{([^}]*)\}/g, function () { console.log(arguments) return eval(arguments[1]); // with }); console.log(str); // 正则匹配${} ,然后替换对应变量
箭头函数
1. 写起来简单
- ()=> {}
- 如果只有一个参数,可以省略(),没有return 可以省略 {}
- 如果返回的是一个对象,要用()包裹起来 return ({name: 'momo'})
- 看this指代的是谁,前面是谁就是谁
- 解决this的问题,不用写 var that = this
- 解决通过bind方式绑定问题,bind(this),call apply
- 箭头函数:箭头函数没有this指向,也没有arguments
- 对象不是作用域,let声明的也不会声明到全局上,不会到window
- ... 剩余运算符(延展符),把多余的都放在数组中
let fn = (x , ...args) => { console.log(args) } fn('x' , 1,2,3,4) // [1,2,3,4]