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