ES6语法笔记

let与const关键字

let关键字声明变量

  1. let 与 var 的第一个区别就是let关键字声明变量不能重复声明

    let name = 'admin'
    let name = 'byboy'; //Uncaught SyntaxError: Identifier 'name' has already been declared
  2. let关键字定义的变量拥有块级作用域,在循环和分支语句中使用

    {
      let uid = "byboy";
      console.log(uid); // byboy
    }
    console.log(uid); // Uncaught ReferenceError: uid is not defined
  3. let定义的变量没有变量提升(区别与var)

    console.log(a); // undefined
    var a = 10;
    console.log(a); // 10
    
    console.log(b); // Uncaught ReferenceError: Cannot access 'b' before initialization
    let b = 10;

const关键字声明常量

  1. 使用const关键字声明常量必须赋初始值

    const NAME = 'byboy';
  2. 常量的值不允许修改

    const a = 10;
    a = 20; // Uncaught TypeError: Assignment to constant variable
  3. const关键字定义的变量拥有块级作用域,在循环和分支语句中使用

    {
      const uid = "byboy";
      console.log(uid); // byboy
    }
    console.log(uid); // Uncaught ReferenceError: uid is not defined
  4. 使用const关键字定义的数组或对象可以修改数组或对象中的元素

    const list = [1, 2, 3, 4];
    list[1] = 5;
    console.log(list[1]); // 5

结构赋值

ES6 快速从数组和对象中提取值

// 定义一个数组
let list = [1, 2, 3];
// 对数组进行结构赋值
let [a, b, c] = list;
// 打印变量
console.log(a); // 1
console.log(b); // 2
console.log(c); // 3


// 定义一个对象
const person = {
  name: "byboy",
  age: 20,
  skills: {
    eat: "I can eat.",
    drink: "I can drink water.",
    sleep: "I can sleep.",
  },
  code: function () {
    return "Ctrl + C";
  },
};
// 结构赋值
let {
  name,
  age,
  skills: { eat, drink, sleep },
  code,
} = person;
// 打印变量
console.log(name); // byboy
console.log(age); // 20
console.log(eat); // I can eat.
console.log(drink); // I can drink water.
console.log(sleep); // I can sleep.
console.log(code()); // Ctrl + C

模板字符串

  1. 使用 `` 声明

    let str = `Today is a good day.`;
    console.log(str);
  2. 可以使用换行符

    let str = `Today is a good day.
    Tomorrow is a good day.`;
    console.log(str);
  3. 使用变量

    let name = "byboy";
    let msg = `${name} is a good man`;
    console.log(msg); // byboy is a good man

简化对象写法

let name = "byboy";
let age = 20;
let code = function () {
  return "Ctrl + C";
};
// const person = {
//   name: name,
//   age: age,
//   code: code,
// };
// 简写如下
const person = {
  name,
  age,
  code,
};

箭头函数

ES6 函数的另外一种写法

// 普通函数
let add = function (a, b) {
  return a + b;
};
console.log(add(1, 2)); // 3

// 箭头函数
let sub = (a, b) => {
  return a - b;
};
console.log(sub(2, 1)); // 1

箭头函数的this是静态的,始终指向函数在声明时所在的作用域指向的对象

// 设置window对象的name属性
window.name = "byboy";

// 在全局作用域下面声明getName01和getName02 this指向window
let getName01 = function () {
  console.log(this);
  console.log(this.name);
};
let getName02 = () => {
  console.log(this);
  console.log(this.name);
};

getName01(); // window对象和byboy
getName02(); // window对象和byboy

const person = {
  name: "admin",
  age: 20,
};

// 使用call方法改变this指向
getName01.call(person); // person对象和admin
getName02.call(person); // window对象和byboy

体会this始终指向函数在声明时所在的作用域指向的对象

window.name = "byboy";
var age = 20;

const person = {
  name: "admin",
  age: 20,
  // eat函数没有被其他函数包裹,this指向的是全局作用域
  eat: () => {
    console.log(this);
    console.log(this.name);
    console.log(this.age);
  },
  sleep: function () {
    console.log(this);
  },
};
person.eat(); // window对象 byboy 20
person.sleep(); // {name: 'admin', age: 20, eat: ƒ, sleep: ƒ}

console.log("========================================");

let me = {
  name: "byboy",
  sayHello: function () {
    let r = () => {
      console.log(this);
      console.log(this.name);
    };
    r();
  },
};
me.sayHello(); // person对象 和 byboy

箭头函数不能作为构造器实例化对象

// 普通函数
let Person = function (name, age) {
  this.name = name;
  this.age = age;
};
let byboy = new Person("byboy", 20);
console.log(byboy); // Person {name: 'byboy', age: 20}

// 箭头函数
let Person = (name, age) => {
  this.name = name;
  this.age = age;
};
let byboy = new Person("byboy", 20); // Uncaught TypeError: Person is not a constructor

箭头函数不能使用 arguments 变量

// 普通函数
let fn01 = function () {
  console.log(arguments);
};
fn01(1, 2, 3); // Arguments(3) [1, 2, 3, callee: ƒ, Symbol(Symbol.iterator): ƒ]

// 箭头函数
let fn02 = () => {
  console.log(arguments);
};
fn02(1, 2, 3); // Uncaught ReferenceError: arguments is not defined

箭头函数简写,当形参只有一个的时候可以省略 () ,当代码体只有一条retrun语句的时候可以省略 {} 和 return

let pow = (n) => {
  return n * n;
};

// 箭头函数简写
let pow = n => n * n;

总结:

箭头函数适合与this无关的回调,不适合与this有关的回调。

参数默认值

ES6允许给函数形参赋初始值

function add(a, b, c) {
  return a + b + c;
}
console.log(add(1, 2, 3)); // 6
console.log(add(1, 2)); // NaN

function sub(a, b, c = 0) {
  return a - b - c;
}
console.log(sub(3, 2, 1)); // 0
console.log(sub(3, 2)); // 1

console.log("===========================================")

function connect({ host = "127.0.0.1", username, password, port = 3306 }) {
  console.log(host); // 127.0.0.1
  console.log(username); // root
  console.log(password); // 123456
  console.log(port); // 3306
}
let dataBase = {
  // host: "db.byboy.cn",
  username: "root",
  password: "123456",
  // port: "3306",
};
connect(dataBase);

rest参数

// ES5 获取实参的方式
function fn1() {
  console.log(arguments); // arguments对象,不能使用数组的方法,虽然它的访问像素组
  console.log(arguments[0]); // One
  console.log(arguments[1]); // Two
  console.log(arguments[2]); // Three
}
fn1("One", "Two", "Three");

// ES6 rest参数
function fn2(...args) {
  console.log(args); // 数组,可以使用数组的方法
  console.log(args[0]); // 1
  console.log(args[1]); // 2
  console.log(args[2]); // 3
}
fn2(1, 2, 3);

注意: 当函数有多个参数,且存在rest参数的时候,rest参数要放到形参的最后面

扩展运算符

扩展运算符:...

扩展运算符将一个数组转为用逗号分隔的参数序列

...运算符主要用于数组和对象的一些操作

let arr = [11, 22, 33, 44, 55];
console.log(...arr); // 11 22 33 44 55

函数调用

function add(a, b) {
  return a + b;
}
let num = [1, 2];
console.log(add(...num)); // 3

复制数组

let a = [1, 2];
let b = [...a];
console.log(b);

合并数组

let a = [1, 2, 3];
let b = [4, 5, 6];
let c = [...a, ...b];
console.log(c); // (6) [1, 2, 3, 4, 5, 6]

将字符串转换成数组

let arr = [..."HelloWorld"];
console.log(arr); // (10) ['H', 'e', 'l', 'l', 'o', 'W', 'o', 'r', 'l', 'd']

合并对象

let student = {
  name: "byboy",
  age: 20,
};
let typer = {
  name: "admin",
  gender: "male",
};
let byboy = { ...student, ...typer }; // 后面相同的属性覆盖前一个
console.log(byboy);

将伪数组转化成真数组

<body>
  <div>1</div>
  <div>2</div>
  <div>3</div>
  <script>
    let divs = document.querySelectorAll("div");
    console.log(divs); // NodeList(3) [div, div, div]
    let divArr = [...divs];
    console.log(divArr); // (3) [div, div, div]
  </script>
</body>
阅读剩余
THE END