7. 資料型別、等於、型別轉換等
undefined (值未定義)
沒有被賦值會得到 undefined:
- 變數:尚未初始化
- 物件的屬性:不存在或已被刪除
- 陣列中:不存在的元素
可以用 undefined 檢視是否已被賦值
undefined 自己就是一個資料型別,意義是「有找到,但內容未定義」
"認識 Dom" 說到
「getElementById 沒 id 屬性,會返回 null;
setAttribute 屬性不存在會得到 null」
getElementById,它應該要回傳一個元素物件。
但當在 DOM 找不到指定元素時,沒有參址器可回傳物件,就是 null。
- null常用在 "應該有,卻沒有(找不到、沒有)"。
- undefined常用在 "變數未初始化"、"物件少了屬性"、"陣列元素少值"。
null (no object)
null 自己也是一個資料型別,代表此 "物件" 尚未存在。
把 "變數" 值指定為 null:
將來會將一個 "物件" 指定給該變數,現在還未指定,
var a = null
// 狀況:之後打算指定給 a 一個 "物件"
之後可以這樣確認 a 有無取得物件:
if (a === null ){
    // 通報錯誤
}
typeof
js 的內建運算符 用來探測 js 運算元的資料型別
var a = "happy"
console.log( typeof a )
// string
// typeof 用字串表示型別
因為 null 是「不存在的 "物件" 」
(typeof null == object)
// true
但最近把 null 資料型別定為 null。
NaN
代表一個"數值",但無法被 js 表示。 NaN 資料型別是 Number。 NaN "不等於" 任何值,包含 NaN
- 0/0 (數學無法回答)
- Math.sqrt(-9) (負數平方根是虛數, js 無法表示虛數)
- "foo" * 100 (這個值應該是數字,但現在是非數字... 給 NaN)
用 isNaN( 我的變數 ) 檢驗 "我的變數" 是否非數字。
infinity (無限) "超過電腦浮點數上限"
- e.g. 10/0 會得到 infinity
- 資料型別是 Number。
- -infinity代表負數。
infinity - infinity == NaN 
// true
// 題外話,js 是用浮點運算... 因為電腦用 2 進位。
0.1 + 0.2
0.30000000000000004
"等於" 運算符 ==
用於比較。 相同資料型別才能比較。
js 會自動轉型別來做比較
if(99=="99"){
    console.log("==")
}else {
    console.log("!")
}
// true
"340" 
// 轉型別過程 "340" >> 3"40" >> 34"0" >> 340
數字與字串
99 == "abc"
99 == NaN
// false
空字串 == 0
1 == ""
1 == 0
// false
布林值與其他
- 數字、布林1 == true 1 == 1 // true
- 字串、布林 - "1" == true "1" == 1 1 == 1 //true- "true" == true "true" == 1 NaN == 1 // false- null, undefine 相等
(null == undefine) 
// true
比較字串
("apple" > "banana") 
// true
// 比較的是字符的 "UNICODE 順序", UNICODE 中 "a" 在 "b" 前面
("apple" > "appla")
// false 
// 最後一個字母 UNICODE 中 "e" 比 "a" 後面
若有運算元是字串, + 會變連接號
(-true == -1) // true
true + "love" // "true love"
全等比較 ===
型別和值完全相等
連結、加法
1 + 2 
3
"3" + 4
"3" + "4"
"34"
+ 是左到右的結合..
1 + 2 + " pizza"
3 + " pizza"
3 + NaN
"3" + " pizza"
"3 Pizza"
1 + ( 2 + " pizza" )
"12 pizza"
-true 會轉為 -1
布林 + 字串,布林會轉字串
true + " love"
"true" + " love"
"true love"
Number( 參數 ) 會將 引數 轉為數字,若無法回傳 NaN
如何確定兩個物件是否相等
v1 是物件,v2 也是物件...
(v1 == v2) || (v1 === v2) 皆可
// 比較物件是比較 "參照位置"。
falsy, truthy
除了 undefine, null, 0, "", NaN 
其他都是 truthy
字串
是基本型別、也可以是 "字串物件"。 js 會在需要的時候,將基本型別暫時轉為字串物件,來使用字串物件的方法屬性操作它。
字串總是資料型別,但可以用建構式以特殊方式建立字串物件。 數字或布林有時候行為也向物件,但字串有用的屬性較多。
常用屬性
- length:長度
- charAt( 索引號 ):回傳字符位置- charAt( 3 )- 回傳字串 index 為 3 的字符,0 為第一個字符。
 
- indexOf( 字串, 起始索引 ):回傳字串位置- indexOf("ha", 5 )- 回傳 "ha" 字符第一次出現的索引號,由頭算起,
- 第二個參數是指定起始索引號。
- 第一個字符索引號為 0。
- 找不到回傳 -1
 
- substring( start, end ):回傳字串某個部份- substring(5, 10)- start 和 end 中較小的值做為子字串的起點,大的值 -1 為終點。
- 第二個參數可省,即到最後一個字。
- substring(5, 10)
- 返回字串索引 5 ~ (10-1) 間的字串。第一個字索引號為 0。
 
- split( 字符 )以字符為分割處,將字串轉為陣列。
instanceof
查詢為誰的實例
var a = new A
console.log( a instanceof A)
// true