JavaScript 概論延續探討
JavaScript判斷式、變數、方法範疇,學習心得整理
判斷式
in 語法:[prop] in [objectName]
prop:引述或是屬性名稱
objectName:物件的名稱
用途:查詢物件內是否有某屬性
用法範例:
var point = {x:1,y:1};
“x” in point //true
“y” in point //true
“toString” in point //true
var data = [7,8,9]
“0” in data //true
1 in data //true
3 in data //false
說明:範例中point物件有x和y兩個屬性,所以”x” in point的回傳結果為True(因為”x”元素有在point物件內),比較特別的是”toString” in point因為toString是prototype的方法,所以在建構物件時本身就會含有此方法所以會回傳true,這也代表了可以使用in語法查詢物件是否含有某prototype的方法;data為一個引述為0-2的陣列,”0″ in data回傳結果為True,因為此陣列引述有”0″,1 in data回傳結果為true,因為數字1會被轉成字串”1″,之後比對data是否有”1″引述,因為有1引述所以回傳true,3 in data因為找不到引述”3″或是有3數值的資料所以回傳false。
instanceof 語法:[object] instanceof [class]
object:物件名稱
class:類別名稱
用途:傳回的布林值將判斷物件是否屬於某個類別
用法範例:
var d = new Date();
d instanceof Date; //true
d instanceof Object; //true
d instanceof Number; //false
var a = [1,2,3];
a instanceof Object; //true
說明:d instanceof Date回傳值為true,因為d物件是使用Date()所創立的物件,d instanceof Object回傳值為true,因為Date類別是物件,所以d屬於物件,d instanceof Number回傳值為false,因為d物件是Date類別不是Number類別,所以回傳false,比較特別的是a instanceof Object回傳值為true,因為在javascript中陣列算是一種物件類別,所以回傳值為true。
其他狀況
var p = null;
p && p.x; //false
(a==b)&&stop();
data[i++] *= 2;
data[i++] = data[i++]*2;
說明:p && p.x會回傳null,因為p的值為null,所以&&運算時會直接回傳null而不會對p.x做運算,這樣的算式很常看到用於如果某物件有值則回傳該值的地方。(a==b)&&stop();這相當於if(a==b)stop();,在javascript中,可以拿&&來當簡易的if then運算使用。data[i++] *= 2;會等於data[i]=data[i++]*2而不是等於data[i++] = data[i++]*2;,這關係到了運算式的先後順序,因為執行順序是左到右,所以加權順序(越大越先執行)[]是19、++是16、*是14、*=和=是3,因為順序是左到右所以data[i++] *= 2;會變成data[i] = data[i]*2執行完成後i++,data[i++] = data[i++]*2;會變成先執行左邊的data[i++]所以在執行右邊的算式時i已經加1了然後運算完後i會再加1,運算會變成類似data[i] = data[i+1]*2;i+=2的運算。
範疇
範疇為Javascript中函數或是變數所影響的範圍。
範例:
var geval = eval;
var x = “global”, y = “global”;
function f(){
var x = “local”;
eval(“x += ‘changed'”);
return x;
}
function g(){
var y = “local”;
geval(“y += ‘changed'”);
return y;
}
console.log(f()); //localchanged
console.log(g()); //local
console.log(x); //global
console.log(y); //globalchanged
說明:
f()輸出結果為localchanged,因為eval是函式內的eval呼叫指令所以函數內的x回傳localchanged。g()輸出結果為local因為geval是外部函數,call的是函數外的y=”global”所以g()函數內的y變數沒有被改變,回傳值為local。x回傳值為global,因為在外部call所以指的是外部的x,因為剛剛f()輸出變動的是f()函數內的x所以外部的x沒有變動,輸出為global。y回傳值為globalchanged,因為先前的g()函數執行時geval(“y += ‘changed'”);是外部函數,所以將外部變數的y由global變為globalchanged了,所以在外部的console.log()函數輸出y為globalchanged。
結語:
這次介紹的javascript有判斷式的一些語法和使用方法,這些方法有助於解決,在程式撰寫中的一些特殊判斷狀況,在我撰寫的簡訊系統區塊也較少被使用,不過用&&來當if then來使用,算是我相對比較常使用於程式的一個小技巧,另外in的部分其實常常用於for回圈將物件或陣列所有的屬性執行一次,不過要注意的一點是,for(var i in obj)使用時,i的值不是該物件的那個屬性值而是該屬性的索引值(index)所以引用的時候要使用obj[i],另外一方面,本篇也介紹了一些基本的javascript的範疇例子,之後會有更多的介紹,因為我覺得範疇在寫程式當中很重要,如果能熟悉規則可以精準的預測執行結果,debug也會變快,當然也可以避免很多不必要的bug發生。
參考:JavaScript大全(ISBN:9789862764411)