JS 裏的數據類型

概述

JavaScript語言的每個值,都屬於一種數據類型,共有七種:numberstringbooleansymbol(ES6新增)、undefinednullobject。 注意沒有 array 類型也沒有 function 類型。編程

1、number

  • 整數和小數:11.1.1
  • 科學記數法:1.23e2
  • 二進制:0b11
  • 八進制:011(後來 ES5 添加了 0o11 語法)
  • 十六進制:0x11

2、string

  • 空字符串:''
  • 多行字符串:
var s = '12345' +
           '67890' // 無回車符號
   或
   var s = `12345
   67890` // 含回車符號
複製代碼
  • 轉義符

反斜槓(\)在字符串內有特殊含義,用來表示一些特殊字符,因此又稱爲轉義符。數組

須要用反斜槓轉義的特殊字符,主要有下面這些:bash

\0 null(\u0000)
\b 後退鍵(\u0008)
\f 換頁符(\u000C)
\n 換行符(\u000A)
\r 回車鍵(\u000D)
\t 製表符(\u0009)
\v 垂直製表符(\u000B)
\' 單引號(\u0027) \" 雙引號(\u0022) \\ 反斜槓(\u005C) 複製代碼

上面這些字符前面加上反斜槓,都表示特殊含義。若是在非特殊字符前面使用反斜槓,則反斜槓會被省略。若是字符串的正常內容之中,須要包含反斜槓,則反斜槓前面須要加一個反斜槓,用來對自身轉義。函數

3、boolean

  • boolean 的取值只有兩個值:truefalse

若是JS預期某個位置應該是布爾值,會將該位置上現有的值自動轉爲布爾值。轉換規則是除了下面六個值被轉爲false,其餘值都視爲true。spa

undefined
null
false
0
NaN
""''(空字符串,引號之間沒有空格)
複製代碼
  • a && bab 都爲 true 時,取值爲 true;不然爲 false
  • a || bab 都爲 false 時,取值爲 false;不然爲 true

4、symbol

Symbol 是ES6引入的一種新原始數據類型,表示獨一無二的值。設計

Symbol 值經過 Symbol 函數生成。這就是說,對象的屬性名如今能夠有兩種類型,一種是原來就有的字符串,另外一種就是新增的 Symbol 類型。凡是屬性名屬於 Symbol 類型,就都是獨一無二的,能夠保證不會與其餘屬性名產生衝突。code

5、undefined 和 null

nullundefined 均可以表示「沒有」,含義很是類似。將一個變量賦值爲 undefinednull ,語法效果幾乎沒區別。對象

if 語句中,它們都會自動轉爲 false,相等運算符 == 甚至直接報告二者相等。ip

undefined == null  //true
複製代碼

都表示沒有值,至於 JS 爲何有兩個表示「沒有值」的東西:字符串

1995年JavaScript誕生時,最初像Java同樣,只設置了null做爲表示"無"的值。根據C語言的傳統,null被設計成能夠自動轉爲0。可是,JavaScript的設計者Brendan Eich,以爲這樣作還不夠,有兩個緣由。首先,null像在Java裏同樣,被當成一個對象。可是,JavaScript的數據類型分紅原始類型和合成類型兩大類,Brendan Eich以爲表示"無"的值最好不是對象。其次,JavaScript的最第一版本沒有包括錯誤處理機制,發生數據類型不匹配時,每每是自動轉換類型或者默默地失敗。Brendan Eich以爲,若是null自動轉爲0,很不容易發現錯誤。所以,Brendan Eich又設計了一個undefined。

  • (規範)若是一個變量沒有被賦值,那麼這個變量的值就是 undefiend
  • (習慣)若是你想表示一個還沒賦值的對象,就用 null。若是你想表示一個還沒賦值的字符串/數字/布爾/symbol,就用 undefined(可是實際上你直接 var xxx 一下就好了,不用寫 var xxx = undefined

6、object

  • object 就是上面幾種基本類型(無序地)組合在一塊兒;
  • object 裏面能夠有 object
var person = {
      name: 'aaa', 
      'child': {
          name: 'bbb'
      }, // 最後這個逗號無關緊要
  }
複製代碼
  • objectkey 一概是字符串,不存在其餘類型的 key;
  • object[''] 是合法的;
  • object['key'] 能夠寫做 object.key;
  • 注意 object.keyobject[key] 不一樣;
  • delete object['key'](delete命令用於刪除對象的屬性);
  • 'key' in object(in運算符用於檢查對象是否包含某個屬性,注意檢查的是鍵名,不是鍵值);

7、type of 操做符

  • 數值、字符串、布爾值分別返回字符串 numberstringboolean
typeof 123    //"number"
    typeof '你好'  //"string"
    typeof true  //"boolean"
複製代碼
  • 函數返回字符串 function
function f() {}
    typeof f   //"function"
複製代碼
  • undefined undefined 返回字符串 'undefined'
typeof undefined   //"undefined"
複製代碼

利用這一點,typeof 能夠用來檢查一個沒有聲明的變量,而不報錯。

v    //ReferenceError: v is not defined
    typeof v    //"undefined"
複製代碼

上面代碼中,變量 v 沒有用 var 命令聲明,直接使用就會報錯。可是,放在 typeof 後面,就不報錯了,而是返回 undefined。 實際編程中,這個特色一般用在判斷語句:

// 錯誤的寫法
    if (v) { // ...}    //ReferenceError: v is not defined
    // 正確的寫法
    if (typeof v === "undefined") { // ...}
複製代碼
  • 其餘 除此之外,其餘狀況都返回 object
typeof window    //"object"
    typeof {}        //"object"
    typeof []        //"object"  數組本質上只是一種特殊的對象
    typeof null      //"object"
複製代碼

這裏 null 的類型也是 object,這是因爲歷史緣由形成的。爲了兼容之前的代碼,後來就無法修改了。這並非說 null 就屬於對象,本質上 null 是一個相似於 undefined 的特殊值。

相關文章
相關標籤/搜索