解釋:
1、指向非按引用傳遞型別的變數,其變數值不可以被修改1. 簡單來說,學過c++的可以理解為c++的const,沒學過可以繼續往下看;
2. 如果指向非按引用傳遞型別(比如字串,布林值等),那麼該值宣告後無法被修改;
3. 如果指向按引用傳遞,則無法更改其指向的物件,但該物件的值可以被修改;
即宣告後不能被修改,修改會報錯;
2、指向引用型別的變數,其值可以被修改,但是不能讓其指向另外乙個物件const a = 1;
a = 2; //uncaught typeerror: assignment to constant variable.
物件的值可以被修改:
不能修改指向的物件:(報錯這步是因為更改了指向的物件)const a = ;
a.test = 2;
console.log(a.test); //2
3、不能宣告const變數時不賦值var a = ;
var b = ;
const c = a;
console.log(c); //
c = b; //uncaught typeerror: assignment to constant variable.
會報錯
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)也不可更改其值(因為凍結)。
先從阮一峰的部落格拿來乙個深度凍結函式(遞迴凍結該物件所有屬性):
然後略微修改,讓const變數指向乙個被凍結的物件,var constantize = (obj) =>
});};
會發現既無法更改變數裡物件的值,也無法讓變數指向另外乙個物件。
有點像讓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的值為被賦值的值。
如**:
2、而通過let、const,以及之後的class建立的物件,則不會被新增到window裡面。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(){}
如**:
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 表示的是指標所指的物件是乙...