JavaScript 概論延續探討
JavaScript的基本規則,變數範圍、範疇規則等等,學習心得整理。
其他型態衍伸狀況
typeof(null) //”object”
null可以代表數字、字串、物件中沒有值的狀況
數字、字串、boolen等變數的方法是使用類似new的建構函數製造出來,然後用完以後就會被釋放
例如:
var s = “test”;
s.len = 4; //len暫時存在
var t = s.len; //len消失所以t=undefined
建立wrapper物件
wrapper物件new出來的物件基本上和直接存取的變數差不多,只是一個是物件一個是變數
例如:
var s = “test”,n = 1,b=true;
var S = new String(s); //wrapper string
var N = new Number(n); //wrapper number
var B = new Boolen(b); //wrapper boolen
alert(typeof(s)); //string
alert(typeof(S)); //object
s == S //true
s === S //false
物件和陣列特性
個別的物件永遠不會相等
例如
var o = {x:1},p = {x:1};
o===p; //false
var a=[],b=[];
a===b; //false
物件使用’=’給值時會是連接物件的位置而不是複製一個物件所以變更物件內容時兩個物件的內容都會被變更
例如
var a=[];
var b=a; //b 參考 a
b[0]=1;
a[0]; //1
a===b //true
以下為複製一個陣列或是物件的方法
var a = [1,2,3];
var b = [];
for(var i in a)b[i]=a[i]; //複製a array
Javascript自動轉換型態規則
1.除了’+’以外的運算符號會將之轉為數值
例如
“7”*”4″ //28
- Undefind轉換成數值會變成NaN
例如
n=1-x //NaN
- Undefind轉換成字串會變成”Undefind”
例如
n+”obj” // “Undefindobj”
各種型態的轉換
Undefind轉String=”Undefind”
Undefind轉Number=NaN
Undefind轉boolen=false
Undefind轉object=ErrorType
Null轉String=”Null”
Null轉Number=0
Null轉boolen=false
Null轉object=ErrorType
True轉String=”true”
True轉Number=1
True轉object= new Boolean(true)
False轉String=”false”
False轉Number=0
False轉object= new Boolean(false)
“”轉Number=0
“”轉boolen=false
“”轉object=new String(“”)
“test”轉Number=NaN
“test”轉boolen= true
“test”轉object= String(“test”)
[]or{}轉String=””
[]or{}轉Number=0
[]or{}轉boolen= false
Undefind==null //true
“0”==0 //true
“0”==false //true
Date轉換
var d = new Date(2015,10,23);
d.valueOf() // 1479830400000(微秒)
//1479830400000=2015/11/23-1970/1/1
Date+數值會轉換成String,Date-數值會轉換成number
範疇
1.
var qq = 1;
function f(){
var qq = 2;
console.log(qq); //2
}
f();
console.log(qq); //1
2.
var qq = 1;
function f(){
console.log(qq); //1
qq++
}
f();
console.log(qq); //2
3.
var qq = 1;
function f(){
console.log(qq); //undefind
var qq = 2;
}
f();
console.log(qq); //1
以上三個範例用於比較Javascript的範疇差異,範例一在function內外都宣告同樣名稱的變數qq,結果和大部分的程式語言一樣,function範疇內的使用的qq變數會是function內宣告的變數qq,範例二在function外宣告變數qq,function內沒有宣告同樣名稱的變數時,function內取用變數qq時,範疇會擴大到function外,所以會取得的是function外的qq變數,範例三和範例二類似但是答案卻完全不同,範例三中function內外都宣告同樣名稱的變數qq但是若在function的變數宣告前使用變數qq時,因為function內有宣告同名的變數所以範疇在function但是因為是在宣告變數前引用,所以變數qq會是undefind狀態。
範疇鏈:意旨js找變數的順序及範圍
運算子
~ 反轉位元(Not)
void 回傳undefind
>>> 右移補零
instanceof 測物件類別
in 測試特性是否存在(常用在loop中)
^ 計算位元XOR
運算順序
等式基本上由右至左結合
Ex:
var w=1,x=2,y=3,z=4;
w=x=y=z //w=x=y=z=4
其他運算順序幾乎都和數學運算一樣
算術運算>邏輯運算
詳細的順序對照可以參考https://developer.mozilla.org/zh-TW/docs/Web/JavaScript/Reference/Operators/Operator_Precedence
判斷式
===:完全相等,不轉型的狀況下數值相等
NaN==NaN //回傳false
NaN永遠不會等於任何值包含NaN本身
如果要查變數x是否等於NaN可以使用以下方式
x!==x //回傳true表示x=NaN;
‘tow’<7 //回傳false
因為tow會被轉型為NaN,NaN做任何比較都會回傳false(除了!=以外)
結語
最近在寫簡訊系統程式的時候剛好有碰到轉型態的判斷這樣的狀況,我相信常常在寫javascript的人應該很容易碰到這些狀況,不過可能因為程式會自動轉換型態所以忽略了這些規則,其實有時候因為自動轉型很方便所以會忘記這些程式基本的順序以及規則,這樣往往會導致,有時候在程式自動轉型之中可能會讓程式出現bug但是卻不知道問題的發生原因,在處理這些問題時往往會花上不少時間,因為這些規則性的問題往往不是使用log能看得出來的,好比說NaN永遠不會等於NaN在if判斷內永遠都會是false就算輸出值兩個變數的值都是NaN,if判斷依舊只會執行false,亦或變數的範疇搞錯了,找不出為何明明有宣告變數值但是取變數的時候變數卻是undefind的狀態,像是範疇的狀況應該很多人都有在寫程式的初期會碰到過,我認為只要了解規則常常練習,時間久了寫程式自然就會有了避免這些事情發生的習慣了。
參考來源:David Flanagan。JavaScript大全(第六版)。歐萊禮出版