7. 資料型別、等於、型別轉換等

undefined (值未定義)

沒有被賦值會得到 undefined:

  • 變數:尚未初始化
  • 物件的屬性:不存在或已被刪除
  • 陣列中:不存在的元素

可以用 undefined 檢視是否已被賦值

undefined 自己就是一個資料型別,意義是「有找到,但內容未定義」

"認識 Dom" 說到

getElementById 沒 id 屬性,會返回 nullsetAttribute 屬性不存在會得到 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

results matching ""

    No results matching ""