ES6

233 阅读3分钟

今天听公开课,趁热整理一下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'})
2. 可以解决this的问题
  • 看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]