变量提升

var: 定义:在变量声明前可以使用变量(实际上是一个bug),var关键字会让变量在程序的开始处全局声明

  1. console.log(a); # undefined
  2. var a = 2; // var a 放到全局前面;
  1. console.log(a);//undefined
  2. {
  3. var a = 1; // 放到全局前面
  4. }
  5. a = 2
  6. console.log(a); //2
  1. a = 2
  2. console.log(a);//2
  3. {
  4. var a = 1; //此处相当于把代码`var a`提升到最前面, a=1在此处
  5. }
  6. console.log(a); //2
  1. var a = 10;
  2. function foo() {
  3. console.log(a);
  4. if (1===2){
  5. var a = 'ecithy' // undefined 相当于把`var a`提升到函数最前面
  6. }
  7. }
  8. foo()
  9. console.log(a); //10

let: 1.let声明的变量不存在变量提升 2.属于块级作用域 3.不允许重复声明

  1. // 变量提升
  2. console.log(username);
  3. let username;
  4. //输出
  5. >Uncaught ReferenceError: Cannot access 'username' before initialization
  1. {
  2. let a = 1;
  3. }
  4. console.log(a); // Uncaught ReferenceError: a is not defined

变量作用域

  1. var 定义的变量:
  2.   只有全局作用域和函数作用域
  3. let 定义的变量:
  4.   有全局作用域和函数作用域,块级作用域 {};
  5.   let定义的变量不能重复定义
  6. const 定义的变量:
  7.   没有变量提升
  8.   带来了块级作用域
  9.   不能重复定义
  10.   定义之后不能修改
  11.   定义的时候必须赋值

变量定义

  1. var username = "zhaozhenyu";
  2. var username = "zhouxiang";
  3. console.log(username);
  4. //错误写法
  5. // let username = "xiedalei";
  6. // let username = "ok";
  7. // console.log(username);

解构赋值

  1. //数组解构
  2. let ary = [1, 2, 3];
  3. let [a, b, c] = ary;
  4. console.log(a, b, c);
  5. let [a,,c] = ary;
  6. //对象解构
  7. let obj = {
  8. username: "liyasong",
  9. age: 23
  10. };
  11. let { username: user, age: age } = obj;
  12. console.log(user, age);
  13. //变量交换
  14. let a = 1;
  15. let b = 2;
  16. [a, b] = [b, a];
  17. console.log(a, b);