变量提升
var: 定义:在变量声明前可以使用变量(实际上是一个bug),var关键字会让变量在程序的开始处全局声明
console.log(a); # undefinedvar a = 2; // var a 放到全局前面;
console.log(a);//undefined{var a = 1; // 放到全局前面}a = 2console.log(a); //2
a = 2console.log(a);//2{var a = 1; //此处相当于把代码`var a`提升到最前面, a=1在此处}console.log(a); //2
var a = 10;function foo() {console.log(a);if (1===2){var a = 'ecithy' // undefined 相当于把`var a`提升到函数最前面}}foo()console.log(a); //10
let: 1.let声明的变量不存在变量提升 2.属于块级作用域 3.不允许重复声明
// 变量提升console.log(username);let username;//输出>Uncaught ReferenceError: Cannot access 'username' before initialization
{let a = 1;}console.log(a); // Uncaught ReferenceError: a is not defined
变量作用域
var 定义的变量:只有全局作用域和函数作用域let 定义的变量:有全局作用域和函数作用域,块级作用域 {};let定义的变量不能重复定义const 定义的变量:没有变量提升带来了块级作用域不能重复定义定义之后不能修改定义的时候必须赋值
变量定义
var username = "zhaozhenyu";var username = "zhouxiang";console.log(username);//错误写法// let username = "xiedalei";// let username = "ok";// console.log(username);
解构赋值
//数组解构let ary = [1, 2, 3];let [a, b, c] = ary;console.log(a, b, c);let [a,,c] = ary;//对象解构let obj = {username: "liyasong",age: 23};let { username: user, age: age } = obj;console.log(user, age);//变量交换let a = 1;let b = 2;[a, b] = [b, a];console.log(a, b);
