ES6之變數與解構賦值

2021-09-29 06:23:03 字數 4323 閱讀 2325

變數宣告

var(函式作用域):可以重新賦值,重新定義

let(塊級作用域): 不能重新宣告,可以修改

const(塊級作用域):不能重新宣告,不能修改–常量

// var 是全域性變數,

for(

var i =

0; i <

10; i++

)for

(let i =

0; i <

10; i++),

1000)}

<

/script>

變數提公升
var命令會發生「變數提公升」現象,即變數可以在宣告之前使用,值為undefined。這種現象多多少少是有些奇怪的,按照一般的邏輯,變數應該在宣告語句之後才可以使用。

為了糾正這種現象,let命令改變了語法行為,它所宣告的變數一定要在宣告後使用,否則報錯。let沒有變數提公升

console.

log(fo)

;//輸出undefined

var fo =3;

console.

log(ba)

;//報錯referenceerror

let ba =

1;

暫時性死區
es6 明確規定,如果區塊中存在let和const命令,這個區塊對這些命令宣告的變數,從一開始就形成了封閉作用域。凡是在宣告之前就使用這些變數,就會報錯。

總之,在**塊內,使用let命令宣告變數之前,該變數都是不可用的。這在語法上,稱為「暫時性死區「簡稱ted

if

(true

)

let不允許在相同作用域內,重複宣告同乙個變數。

function

fun1()

不能在函式內部重新宣告引數

function

fun(arr)

fun();

//會報錯

function

fun(arr)

}fun()

;//不會報錯

塊級作用域
乙個 就是乙個塊級作用域

在塊級作用域下var宣告的變數依然是全域性的

在塊級作用域下let,const宣告變數是私有的

console.

log(a)

;//0

console.

log(b)

;//b is not defined

如果想表示乙個物件,需要用變數接收,否則會被當成塊級作用域。

一、陣列
這種寫法屬於「模式匹配」,只要等號兩邊的模式相同,左邊的變數就會被賦予對應的值。

let

[foo,

[[bar]

, baz]]=

[1,[

[2],

3]];

foo // 1

bar // 2

baz // 3

let[

,, third]=[

"foo"

,"bar"

,"baz"];

third // "baz"

let[x,

, y]=[

1,2,

3]; x // 1

y // 3

let[a,

[b], d]=[

1,[2

,3],

4]; a // 1

b // 2

d // 4

如果解構不成功,變數的值就等於undefined。

let arr =[1

,2,3

,4];

let[a, b, c, d, e]

= arr;

console.

log(a, b, c, d, e)

;//1,2,3,4,undefined

省略賦值

let[,

,b]=[1

,2,3

];consloe.

log(b)

;//3

不定引數賦值

let

[x1,x2,

...x3]=[

1,2,

3,4,

5];console.

log(x3)

;//[3,4,5]

二、物件
物件的解構與陣列有乙個重要的不同。陣列的元素是按次序排列的,變數的取值由它的位置決定;而物件的屬性沒有次序,變數必須與屬性同名,才能取到正確的值。

變數名和屬性名一致

let=;

foo // "aaa"

bar // "bbb"

變數名和屬性名不一致

let=;

baz // "aaa"

foo // error: foo is not defined

巢狀

let obj =]}

;let]}

= obj;

x // "hello"

y // "world"

p // ["hello", ]

let obj =

;let arr =

;(=)

;//不能對塊級作用域直接賦值,所以加個括號

obj //

arr // [true]

三、字串
字串也可以解構賦值。這是因為此時,字串被轉換成了乙個類似陣列的物件。

const

[a, b, c, d, e]

='hello'

; a // "h"

b // "e"

c // "l"

d // "l"

e // "o"

類似陣列的物件都有乙個length屬性,因此還可以對這個屬性解構賦值。

let

='hello'

; len // 5

四、數值和布林值
解構賦值時,如果等號右邊是數值和布林值,則會先轉為物件

let

=123

; s === number.prototype.tostring // true

let=

true

; s === boolean.prototype.tostring // true

只要等號右邊的值不是物件或陣列,就先將其轉為物件。由於undefined和null無法轉為物件,所以對它們進行解構賦值,都會報錯。

let

= undefined;

// typeerror

let=

null

;// typeerror

五、函式
function

get(

[a,b,c,

...d]

)get(1

,2,3

,4,5

);

function

geta(=

) console.

log(name,age);}

geta()

;//不傳參時

es6基礎之變數的解構賦值

本文源自阮老師的es6入門教程,為了之後方便自己隨時檢視,將常用的es6部分整理了一下 傳送門概念 es6 允許按照一定模式,從陣列和物件中提取值,對變數進行賦值 基本用法 1 let a,b,c 1,2,3 上面 表示,可以從陣列中提取值,按照對應位置,對變數賦值,也就是說,只要兩邊的模式相同,左...

es6基礎之變數的解構賦值

本文源自阮老師的es6入門教程,為了之後方便自己隨時檢視,將常用的es6部分整理了一下 傳送門概念 es6 允許按照一定模式,從陣列和物件中提取值,對變數進行賦值 基本用法 1 let a,b,c 1,2,3 上面 表示,可以從陣列中提取值,按照對應位置,對變數賦值,也就是說,只要兩邊的模式相同,左...

ES6(二)之變數的解構賦值

基本用法let arr 1,2,3 let a arr 0 let b arr 1 let c arr 2 console.log a,b,c 解構賦值後 let a,b,c 1,2,3 console.log a,b,c let num,str 6,str let 這種寫法不合理,右邊不屬於合法的...