ECMAScript 6(3)const和頂層物件

2021-07-25 20:34:00 字數 3457 閱讀 4321

解釋:

1. 簡單來說,學過c++的可以理解為c++的const,沒學過可以繼續往下看;

2. 如果指向非按引用傳遞型別(比如字串,布林值等),那麼該值宣告後無法被修改;

3. 如果指向按引用傳遞,則無法更改其指向的物件,但該物件的值可以被修改;

1、指向非按引用傳遞型別的變數,其變數值不可以被修改

即宣告後不能被修改,修改會報錯;

const a = 1;

a = 2; //uncaught typeerror: assignment to constant variable.

2、指向引用型別的變數,其值可以被修改,但是不能讓其指向另外乙個物件

物件的值可以被修改:

const a = ;

a.test = 2;

console.log(a.test); //2

不能修改指向的物件:(報錯這步是因為更改了指向的物件)

var a = ;

var b = ;

const c = a;

console.log(c); //

c = b; //uncaught typeerror: assignment to constant variable.

3、不能宣告const變數時不賦值

會報錯

const a;    //uncaught syntaxerror: missing initializer in const declaration
4、塊級作用域,相關特性類似let

顯然是塊級的

var a = 1;

console.log(a); //1

不存在變數提公升,出現暫時性死區,不能先使用後宣告

也不可重複宣告(在同乙個塊級作用域內)(使用let和var同樣不可)

5、指向乙個被凍結的物件

const和object.freeze不同,後者是凍結物件,而前者只涉及位址。

所以可以二者結合起來,讓const變數指向乙個被凍結的物件。那麼該變數則不可更改指向的目標(因為const)也不可更改其值(因為凍結)。

先從阮一峰的部落格拿來乙個深度凍結函式(遞迴凍結該物件所有屬性):

var constantize = (obj) => 

});};

然後略微修改,讓const變數指向乙個被凍結的物件,

會發現既無法更改變數裡物件的值,也無法讓變數指向另外乙個物件。

有點像讓const變數成為乙個常量。

(下面**沒有體現深度凍結的效果)

var constantize = (obj) => 

});return obj; //i add this code

};const a = constantize();

console.log(a); //

a.a = 2;

console.log(a.a); //1

a = 10; //uncaught typeerror: assignment to constant variable.

所謂頂層物件,在js裡面指window

當乙個變數在頂層作用域裡(比如說開啟瀏覽器通過f12的console來直接輸入命令),那麼該變數在之前情況下,是屬於window這個頂層物件的屬性的;

我們之前一般稱之為全域性變數,全域性變數在以前會被認為就是window的屬性的值;

而es6中則不是,全域性變數和頂層物件的屬性的值將脫鉤;

1、通過var或者function甚至直接寫變數名然後進行賦值建立的物件,其變數名作為key新增到window物件中,而window裡該key的值為被賦值的值。

如**:

console.log(window.a);  //undefined

console.log(window.b); //undefined

console.log(window.c); //undefined

var a = 1;

console.log(window.a); //1

b = 2;

console.log(window.b); //2

function

c(){}

console.log(window.c); //function c(){}

2、而通過let、const,以及之後的class建立的物件,則不會被新增到window裡面。

如**:

console.log(window.a);  //undefined

console.log(window.b); //undefined

let a = 1;

console.log(window.a); //undefined

const b = 2;

console.log(window.b); //undefined

簡單來說,頂層物件在瀏覽器裡就是window;但是在node.js裡面沒有window(web worker也沒有,他是執行在後台的js指令碼);

瀏覽器和web worker裡,self指向頂層物件,但是node.js裡沒有self;

node裡,頂層物件是global,但其他環境不支援(比如chrome裡打global會告訴你未定義);

有時候我們需要用同一套**,但在各個環境拿到頂層物件(啥時候?),所以得找個通用的辦法;

但是沒有非常完美的。

阮一峰給了兩個辦法,我直接摘抄了,如下**:

// 方法一

(typeof window !== 'undefined'

? window

: (typeof process === 'object' &&

typeof

require === 'function' &&

typeof global === 'object')

? global

: this);

// 方法二

var getglobal = function

() if (typeof window !== 'undefined')

if (typeof global !== 'undefined')

throw

newerror('unable to locate global object');

};

頂層const和非頂層const和函式過載的問題

不懂頂層const和非頂層const的區別的先檢視我的這篇部落格 介紹const函式過載的問題前,先介紹一下下面 includeusing namespace std int ans 42 void fun int tt int main int main int main int c fun in...

頂層const和底層const

頂層const 本身是乙個常量 底層const 所指的物件是乙個常量 int const p1 i const修飾p1,p1本身是乙個const,所以這個const是頂層const const int ci 42 const修飾ci,ci本身是乙個const,頂層 const int p2 ci c...

頂層const和底層const

1.頂層 const 與底層 const概念 指標本身是乙個物件,因為,指標實際對應著記憶體單元的一段儲存空間,然而,指標所指向的也是乙個資料物件,因此,指標是乙個常量與指標所指向的是乙個常量是兩個完全不同的概念,頂層 const表示的是指標本身是乙個常量,底層const 表示的是指標所指的物件是乙...