JavaScript概論(3)

JavaScript概論

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)


發表迴響

這個網站採用 Akismet 服務減少垃圾留言。進一步瞭解 Akismet 如何處理網站訪客的留言資料