目录
变量的声明
var命令
1. 可以重复声明
var a=10;
var a=12;
console.log(a); //12
2. 变量可以提升
console.log(a); //undefined
var a=10;
3. 没有块级作用域
for(var i=0;i<10;i++){
console.log(i);
}
console.log('外部i',i); //10
let和const命令
1. 不能在相同作用域内重复声明变量
let a=10;
let a=12;
console.log(a) //报错
//报错
if(true){
let a=10;
var a=1;
}
2. 变量不可以提升
console.log(a); //ReferenceError
var a=10;
3. 有块级作用域
for(let i=0;i<10;i++){
console.log(i);
}
console.log('外部i',i); //undefined
4. 存在暂时性死区
如果区块中存在let和const命令,则这个区块对这些命令的声明的变量从一开始就形成封闭作用域。只要在声明之前使用这些变量,就会报错。
if(true){
//暂时性死区开始
tmp="abc"; //ReferenceError
console.log(tmp); //ReferenceError
//死区结束
let tmp;
console.log(tmp); //undefined
}
const命令
1.const命令用来声明常量。一旦声明,其值就能改变。这就意味着用cost声明的常量必须要初始化。
const PI=3.14;
PI=3;// TypeError:"PI" is read.only
const a; //SyntaxError
2. const声明的常量只在当前代码块有效。如果要跨模块则采用 模块暴露的方式。
// test1.js
export const A=2;
//index.js
import * as constants from './constants';
console.log(constants.A);
变量的解构赋值
数组的解构赋值
let arr=['terry','tom','larry'];
let a=arr[0];
let b=arr[1];
let c=arr[2];
//等价于下面这种
let [a,b,c]=arr;
let [head,...tail]=[1,2,3,4]; // head=1;tail=[2,3,4]
默认值
//默认值
let [a,b,c,d="dd"]=[1,2,3];
console.log(a) //1
console.log(d); //'dd'
案例:交换两个变量的值
//交换两个变量的值
let a=1;
let b=2;
[a,b]=[b,a];
对象的解构赋值
对象的解构是先找到同名属性,然后再赋值给对应的变量。
var obj={
name:"cc",
age:12
}
let {name:a,age:b}=obj;
console.log(a) //"cc";
conoole.log(b) //12
//可以简写如下形式===>
let {name,age}=obj;
console.log(name); //"cc"
指定默认值
默认值生效条件是对象的属性值全等于undefined
var {x=3}={};
x //3
var {x,y=5}={x:1};
x //1
y //5
var {x=3}={x:undefined}
x //3
var {x=3}={x:null}
x //null
字符串的解构赋值
1. 可以将字符串转换成一个类似数组的对象
let [a,b]="hello";
console.log(a) //'h';
//===>
let [c,d]=['h','e','l','l','o'];
2. 使用String原型中的方法进行解构
let s1="hello";
let {substring:subString}=s1;
subString.call(s1,0,2); // 'he'
数值、boolean的解构赋值
解析值的时候,如果等号右边是数值或布尔值,则会先转换为对象。
let {toString:s}=123;
s===Number.prototype.toString //true
let {toString:s}=true;
s===Boolean.prototype.toString //true