(一)const、var、let區別
const
定義的變量不可以修改,而且必須初始化
const b = 2;//正確
// const b;//錯誤,必須初始化
console.log('函數外const定義b:' + b);//有輸出值
// b = 5;
// console.log('函數外修改const定義b:' + b);//無法輸出
var
定義的變量可以修改,如果不初始化會輸出undefined,不會報錯
var a = 1;
// var a;//不會報錯
console.log('函數外var定義a:' + a);//可以輸出a=1
function change(){
a = 4;
console.log('函數內var定義a:' + a);//可以輸出a=4
}
change();
console.log('函數調用后var定義a為函數內部修改值:' + a);//可以輸出a=4
let
let是塊級作用域,函數內部使用let定義后,對函數外部無影響
let c = 3;
console.log('函數外let定義c:' + c);//輸出c=3
function change(){
let c = 6;
console.log('函數內let定義c:' + c);//輸出c=6
}
change();
console.log('函數調用后let定義c不受函數內部定義影響:' + c);//輸出c=3
(二)JavaScript中的神碼題
console.log(++[[]][+[]]+[+[]]) //完全有效的等式 結果為10
在 JavaScript 里,+[] === 0
是完全正確的。 +
會把一些字符轉化成數字,在這里,這個式子會變成 +""
或 0
,變成如下:
++[[]][0]+[0]
// ++ 比 + 有更高的優先級
[[]][0]
的意思是:獲取 [[]]
的第一個元素,結果如下:
-
[[]][0]
返回內部數組([])
,根據語言規范,[[]][0] === []
是不正確的,但把這個內部數組稱作 A,以避免錯誤的寫法。 -
++[[]][0] == A + 1
,因為++
的意思是+1
。 -
++[[]][0] === +(A + 1)
換句話說,得到的永遠是個數值(+1
并不一定得到的是個數值,但++
一定是)
接下來將A換回[]
:
+([] + 1)+[0]
在 JavaScript 里,這也是正確的:[] + 1 === "1"
,因為 [] == ""
(這相當于一個空的數組的內部元素連接),于是:
+([] + 1) === +("" + 1),并且 +("" + 1) === +("1"),并且 +("1") === 1
最后為 1+[0]
同樣,[0] == "0"
在JavaScript中也是正確的,因為這相當于一個有一個元素的數組的內部元素的連接,各元素會使用,
分隔。最后結果為:數字 + 字符串 = 字符串
1+"0"=== "10"
最后的結論:++[[]][+[]]+[+[]]
的結果是個字符串10
!
----------------個人了解,應該沒錯哈!冷楓