变量提升
var: 定义:在变量声明前可以使用变量(实际上是一个bug),var关键字会让变量在程序的开始处全局声明
console.log(a); # undefined
var a = 2; // var a 放到全局前面;
console.log(a);//undefined
{
var a = 1; // 放到全局前面
}
a = 2
console.log(a); //2
a = 2
console.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);