神秘的js

(一)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!
----------------個人了解,應該沒錯哈!冷楓

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容