ES6中變數的宣告與解析
阿新 • • 發佈:2018-11-12
目錄
變數的宣告
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