問題1: 使用連續賦值後面的變數會成為全局對象的一個屬性,並且這個屬性可以通過delete刪除。 原因:賦值語句是從右往左執行的,我們將10賦值給了c,但是c此時還聲明,接著把c的返回值賦值給了b,但是b也還沒有聲明,最後賦值給了a此時a有聲明,所以a就是局部變數。 var a = b = c =
問題1:
使用連續賦值後面的變數會成為全局對象的一個屬性,並且這個屬性可以通過delete刪除。
原因:賦值語句是從右往左執行的,我們將10賦值給了c,但是c此時還聲明,接著把c的返回值賦值給了b,但是b也還沒有聲明,最後賦值給了a此時a有聲明,所以a就是局部變數。
var a = b = c = 10;
console.log(delete a); //false
console.log(delete b); //true
console.log(delete c); //true
這樣好像看不出來什麼太大的關係,但是在函數中就會出現很大的問題。
function fn(){
var a = b = c = 10;
}
fn();
console.log(b); //10
console.log(c); //10
console.log(a); //a is not defined
此時b和c在全局範圍都能夠訪問,因為b和c成了全局對象window的一個屬性。
問題2:
如果把數組length事先保存到一個變數中,需要註意的是不管這個數組的長度在這之後是否有改動過,這個變數保存的數組的值依然是事先獲取到的長度。
var arr = [1,2,3],
i = 0,
len = arr.length;
arr.length = 2;
console.log(len); //3
console.log(arr.length); //2
所以如果在之後有改動這個數組的長度的時候需要重新獲取一下,以免出錯。
問題3:
在js中不能按理說是不能把比較符當做函數的參數傳遞並且執行的,但是很多時候我們確實需要這樣的一個功能,這兩天發現一個方法可以實現這個功能。通過eval傳遞> || < .....
function fn(a){
if(eval(10+a+2)){
console.log(1);
}
}
fn(">") //1
實現的原理是因為,eval方法會把字元串當做代碼來執行,至於使用的場景,由你自己想象。