ES6的變數宣告方式

2021-08-26 12:12:46 字數 3593 閱讀 2117

保留了var和function。新增加了let、const、class和import。 

而且,let、const、class宣告的全域性變數再也不會和全域性物件的屬性掛鉤了。

------------

let------------

1、let只在所在的**塊中有效

for (var i = 0; i < 10; i++) {}

console.log(i); //10

for(let j = 0; j < 10; j++) {}

console.log(j);// error: j is not define

2、以前我們需要用iife解決的問題

for (var i = 0; i < 5; i++) ,0);

} for (var k = 0; k < 5; k++) ,0);

})(k);

} for (let j = 0; j < 5; j++) ,0);

} 3、不存在變數宣告提公升

console.log(foo); // 輸出undefined

console.log(bar); // 報錯referenceerror

var foo = 2;

let bar = 2;

可能動手實踐的同學會發現在webpack配置的es6環境中。

並不會出現這種情況,那主要是babel轉碼是還是講let轉成了var,不要糾結這個。

4、暫時性死區tdz

var temp = 123;

if (true)

其實這個也可以解釋上面那條 不存在變數宣告提公升。

同時在tdz區域中使用typeof temp 也是不安全的。

但是你typeof 未宣告的變數 倒是返回undefined, 這就是tdz的效果。

同樣這裡你也可能試驗不出來,你看一下bundle.js,你就懂了。

5、let不允許重複宣告

----------

const

----------

1、大部分與let差不多。

2、const (唯讀)(一旦宣告必須賦值)

const max = 123;

max = 1; //轉碼階段就爆錯了。

3、對於復合型別變數 (可以給他的屬性賦值)

const a = {};

a.name = "dai";

a.age = 21;

4、如何你不想新增屬性

const b = object.freeze({});

b.name = 'dai'; //typeerror

插曲–es6引入了塊級作用域 

其實這也解釋了為什麼let、const在自己所在的**塊有效了。

console.log(b); //10

} console.log(a); //1

}

---------

class

---------

1、class作為es6的語法糖,實際上es5也可以實現的。

class point

tostring ()

} //上面是乙個類

object.assign(point.prototype, ,

gety ()

})let p1 = new point(1,2);

console.log(p1.tostring()); //1,2

console.log(p1.getx()); //1

console.log(p1.gety()); //2

console.log(object.keys(point.prototype)); // ["getx", "gety"]

(1)、方法之間不需要逗號分隔

(2)、tostring () {} 等價於 tostring: function () {}

(3)、你仍然可以使用point.prototype

(4)、你可以用object.assign()一次性擴充套件很多方法

(5)、類內部定義方法多是不可以列舉的

(6)、constructor(){}是乙個預設方法,如果沒有新增,會自動新增乙個空的。

(7)、constructor預設返回例項物件(this),完全可以指定返回其他的物件。

(8)、必須用new呼叫

(9)、不存在變數提公升

(10)、當用乙個變數去接受class時,可以省略classname

(11)、es6不提供私有方法。

2、使用extends繼承

class threedpoint extends point

tostring ()

static getinfo()

get z()

set z(value)

} threedpoint.getinfo(); // "static method"

let ta = new threedpoint(2,3,4);

console.log(ta.tostring()); //2,3,4

console.log(ta.z); // 4

ta.z = 200; // 200

console.log(object.getprototypeof(threedpoint)); //point

(1)、constructor中必須呼叫super,因為子類中沒有this,必須從父類中繼承。

(2)、子類的__proto__屬性總是指向父類

(3)、子類的prototype屬性的__proto__總是指向父類的prototype

(4)、object.getprototypeof()獲取父類

(5)、super作為方法只能在constructor中

(6)、super作為屬性指向父類的prototype.

(7)、在constructor中使用super.x = 2,實際上this.x = 2;但是讀取super.x時,又變成了父類.prototype.x。

(8)、原生建構函式是無法繼承的。

(9)、get set 方法可以對屬性的賦值和讀取進行攔截

(10)、靜態方法不能被例項繼承。通過static宣告

(11)、靜態屬性只能 threedpoint.name = "123" 宣告 (與static沒什麼關係)

-----------

import

-----------

1、es6引入了自己的模組系統。通過export匯出,import匯入。

2、與commonjs不同的是,它是獲取模組的引用,到用的時候才會真正的去取值。

3、例如student.js中:

let student = [

,] export default student; // 這種匯出方式,你可以在import時指定它的名稱。

import studentlist from './student.js'; //指定名稱

console.log(studentlist[0].name); //xiaoming

ES6 變數宣告方式

var,function,let,const,import,class1.let只在所在的 塊中有效 2.以前我們需要用iife解決的問題 3.不存在變數宣告提公升 4.暫時性死區tdz 1.let只在所在的 塊中有效 2.以前我們需要用iife解決的問題 3.不存在變數宣告提公升 console....

ES6之新的變數宣告方式

作用域就是變數的有效範圍 之前只有全域性作用域和函式作用域 let和const是新的變數宣告方式 輸出結果 使用let定義的變數只能用在定義它的那個塊裡 在這個塊之外是不能使用這個變數的 就是將宣告的變數繫結在宣告該變數的塊裡 同理 可以看做為最簡單的塊級元素 大括號外當然也訪問不到 輸出結果 因為...

Es6之變數宣告

es6變數宣告let 和 canst,let 所宣告的變數具有塊級作用域,且宣告的變數不會前置,而const宣告的是不變了常量 let test test let 所宣告的變數只在塊級作用域內有效,而var就不同 for var i 1 i 5 i console.log str 輸出hello.c...