數據類型 - Javascript語法基礎 - Javascript核心

源代碼: https://github.com/RobinQu/Programing-In-Javascript/blob/master/chapters/Javascript_Core/Javascript_Basics/Types.mdjavascript

原文 http://pij.robinqu.me/Javascript_Core/Javascript_Basics/Types.htmlhtml

本文存在批註,但該網站的Markdown編輯器不支持,因此沒法正常展現,請到原文參考。java

Javascript數據類型

計算機程序的運行須要對值進行造做。在編程語言中,可以表示並操做的值的類型稱作數據類型。git

JavaScript的數據類型分爲兩類: 原始類型和對象類型。JavaScript中的原始類型包括數字,字符串和布爾值。程序員

1
"hello world"
true

JavaScript中有兩個特殊的原始值: null和undefined。github

null
undefined

JavaScript除了上述的就是對象了,對象是屬性的集合,每一個屬性都由 鍵值對組成。web

var i = {x: 1, y: 2}

一般對象是無序,JavaScript定義了一種特殊對象數組,他是有序的集合。編程

var a[10];

JavaScript還定義了另外一種特殊的對象-函數。函數是具備與它相關聯的可執行代碼的對象。經過調用函數來運行執行的代碼,並返回結果。數組

function a(){
  console.log("hello world");
}

數字

  • 不區分整數值和浮點數, JavaScript中全部數字均用64位浮點數值標識(IEEE 754)。
  • 就像java程序員所熟悉的double類型
  • 取值範圍在 ±1.7976931348623157 × 10 308 到 ±5 × 10 −324 之間
  • 文字:dom

    • 整數
    • 十六進制 0x
    • 八進制 0
    • 浮點表示
    • Math類
    • 方法

      • pow // 求冪
      • round //四捨五入
      • ceil //向上取整
      • floor //向下取整
      • abs //求絕對值
      • max //最大值
      • min //最最小值
      • sqrt
      • log
      • exp
      • acos
      • asin
      • atan
      • atan2
      • random
      • sin
      • cos
    • 常量

      • PI
      • E
      • LN2
      • LN10
      • LOG2E
      • LOG10E
      • PI
      • SQRT1_2
      • SQRT2
    • 無限值
    • 正無窮

      • Infinity //rw
      • Number.POSITIVE_INFINITY // r
      • 1/0
      • Number.MAX_VALUE + 1
    • 負無窮

      • Number.NEGATIVE_INFINITY //rw
      • -Intifinty //r
      • -1/0
      • -Number.MAX_VALUE - 1
    • NaN

      • 不與任何值相等 包括它本身.
      • NaN //rw
      • Number.NaN //r
      • 0/0 //計算結果爲NaN
    • Zero

      • Number.MIN_VALUE/2
      • -Number.MIN_VALUE/2
      • -1/Infinity
      • -0
    • Rounding-error

      var x = .3 - .2 
        var y = .2 - .1
        x == y
        x == .1 // => false .3 -.2 不等於 ./
        y == .1 // => true .2 - .1 等於 .1

布爾值

布爾值指代真或假,這個類型只有兩個值, 保留字true和false

一般比較語句的結果是布爾值 例如:

a==4

這段代碼檢測a是否等於4

任何JavaScript的值均可以轉換爲布爾值。下面這些值會被轉換爲false

undefined
null
0
-0    
NaN
"" // the empty string

全部其餘的值,包括全部對象都會轉換成true

null和undefined

null表示一個特殊值,經常使用來描述空值。 對null執行typerof,結果返回object, 也就是null被認爲是一種特殊的對象值,含義是非對象。

JavaScript使用undefined標識變量沒有初始化。例如函數沒有返回值,則返回undefined。undefined是預約義的全局變量(與null不同,它不是關鍵字)。

日期與時間

JavaScript語言核心包括Date()構造函數, 用來建立表示日期和時間的對象。這些日期對象的方法爲日期計算經過了簡單的API:

var then = new Date(2011, 0, 1); // 2011年1月1日
var later = new Date(2011, 0, 1, 17, 10, 30) //同一天,當地時間5:10:30pm,
var now = new Date(); //當前日期和時間
var elapsed = now - then; //日期減法: 計算時間間隔的毫秒數
later.getFullYear() // => 2011
later.getMonth() // => 0 從0開始計數的月份
later.getDate() // => 1 從1開始計數的天數
later.getDay() // => 5 獲得星期幾, 0表明星期日, 5表明星期一
later.getHours() // => 當地時間17   5pm
later.getUTHours() // 使用UTC表示小時的時間,基於時區

文本

字符串是一組由16位值組成的不可變的有序序列,每一個字符一般來自於Unicode字符集。

var i = "abcdefg";

在JavaScript字符串中,反斜線\有着特殊的用途,反斜線符號後加一個字符,就再也不表示它們的字面含義了,不如\n就是一個轉義字符,它表示一個換行符。

'You\'re right, it can\'t be a quote'

JavaScript的內置功能之一就是字符串鏈接:

msg = "Hello, " + "world";

字符串的length屬性能夠查看字符串的長度:

s.length

除了length屬性, 字符串還提供許多能夠調用的方法:

var s = "hello, world" //定義一個字符串
s.charAt(0)      // => "h" 第一個字符
s.charAt(s.length-1) // => "d" 最後一個字符
s.substring(1, 4) // => "ell" 第2-4個字符
s.slice(1,4) // => "ell" 同上
s.slice(-3)  // => "rld": 最後三個字符
s.indexOf("l") // => 2 字符l首次出現的位置
s.lastIndexOf("l") // => 10: 字符l最後一次出現的位置
s.indexOf("l", 3) // => 在位置3及以後首次出現字符l的位置
s.split(",") // => ["hello", "world"]分割成子串
s.replace("h", "H") // => "Hello, world": 全文字符替換
s.toUpperCase() // => "HELLO WORLD"

全局對象

全局對象在JavaScript中有着重要的用途: 全局對象的屬性是全局定義的符號, JavaScript程序能夠直接使用,當解釋器啓動時,它將建立一個新的全局對象,並給它一組定義的初始屬性:

  • 全局屬性,好比undefined, Infinity
  • 全局函數,好比parseInt()
  • 構造函數,好比Data(),
  • 全局對象,好比Math和JSON

包裝對象

看這樣一個例子:

var s = "hello world!";
var word = s.substring(s.indexOf(" ")+1, s.length);

字符串既然不是對象,爲何它會有屬性呢?只要引用了字符串s的屬性,JavaScript就會將字符串值經過調用new String(s)的方式轉換成對象,
同字符串同樣,數字和布爾值也有相應的方法。其餘相似的包裝類:

  • Number object
  • String object
  • Boolean Object
  • Function Object
  • RegExp Object
  • Error

    • SyntaxError
    • ReferenceError
    • TypeError
  • ...

不可變的原始值和可變的原始對象引用

原始值是不可改變的,原始值的比較是值比較, 對象的比較並不是值比較:即便兩個對象包含一樣的屬性以及相同的值,他們也不是相等的。咱們一般將對象稱爲引用類型,對象的值都是引用,對象的比較也是引用的比較,當且僅當他們引用同一個基獨享,他們才相等;

類型轉換

當指望使用一個布爾值的時候,能夠提供任意類型值,JavaScript將根據須要自行轉換類型。類型轉換能夠分爲隱式轉換和顯式轉換,所謂隱式轉換即程序在運行時進行的自動轉換,顯式轉換則是人爲的對類型進行強制轉換。

顯式轉換

經過手動進行類型轉換,Javascript提供瞭如下轉型函數:

  • 轉換爲數值類型:Number(mix)、parseInt(string,radix)、parseFloat(string)

  • 轉換爲字符串類型:toString(radix)、String(mix)

  • 轉換爲布爾類型:Boolean(mix)

Number(mix)函數,能夠將任意類型的參數mix轉換爲數值類型。其規則爲:

  • 若是是布爾值,true和false分別被轉換爲1和0

    Number(true); //=> 1
  • 若是是數字值,返回自己。

    Number(5); //=> 5
  • 若是是null,返回0.

    Number(null); //=>0
  • 若是是undefined,返回NaN。

    Number(undefined); //=> NaN

若是是字符串,遵循如下規則:

  • 若是字符串中只包含數字,則將其轉換爲十進制(忽略前導0)

    Number("00001"); //=> 1
  • 若是字符串中包含有效的浮點格式,將其轉換爲浮點數值(忽略前導0)

    Number("1.234"); //=> 1.234
  • 若是是空字符串,將其轉換爲0

    Number(""); //=> 0
  • 若是字符串中包含非以上格式,則將其轉換爲NaN

  • 若是是對象,則調用對象的valueOf()方法,而後依據前面的規則轉換返回的值。若是轉換的結果是NaN,則調用對象的toString() 方法,再次依照前面的規則轉換返回的字符串值。

下表列出了對象的valueOf()的返回值:

對象  返回值
Array   數組的元素被轉換爲字符串,這些字符串由逗號分隔,鏈接在一塊兒。其操做 與 Array.toString 和 Array.join 方法相同。
Boolean Boolean 值。
Date    存儲的時間是從 1970 年 1 月 1 日午夜開始計的毫秒數 UTC。
Function    函數自己。
Number  數字值。
Object  對象自己。這是默認狀況。
String  字符串值。

parseInt(string, radix)函數,將字符串轉換爲整數類型的數值。它也有必定的規則:

  • 忽略字符串前面的空格,直至找到第一個非空字符
  • 若是第一個字符不是數字符號或者負號,返回NaN
  • 若是第一個字符是數字,則繼續解析直至字符串解析完畢或者遇到一個非數字符號爲止
  • 若是上步解析的結果以0開頭,則將其看成八進制來解析;若是以0x開頭,則將其看成十六進制來解析
  • 若是指定radix參數,則以radix爲基數進行解析

    parseInt("12", 10); // => 12
    parseInt("12", 16); // => 18
    parseInt("1E", 10); // => 1
    parseInt("E", 10); // => NaN

parseFloat(string)函數,將字符串轉換爲浮點數類型的數值。
它的規則與parseInt基本相同,但也有點區別:字符串中第一個小數點符號是有效的,另外parseFloat會忽略全部前導0,若是字符串包 含一個可解析爲整數的數,則返回整數值而不是浮點數值。

parseFloat("1.222.2") // => 1.222
parseFloat("1.0") // => 1

toString(radix)方法。除undefined和null以外的全部類型的值都具備toString()方法,其 做用是返回對象的字符串表示。

對象  操做
Array   將 Array 的元素轉換爲字符串。結果字符串由逗號分隔,且鏈接起來。
Boolean 若是 Boolean 值是 true,則返回 「true」。不然,返 回 「false」。
Date    返回日期的文字表示法。
Error   返回一個包含相關錯誤信息的字符串。
Function    返回以下格式的字符串,其中 functionname 是被調 用 toString 方法函數的名稱: 
function functionname( ) { [native code] }
Number  返回數字的文字表示。
String  返回 String 對象的值。
默認  返回 「[object objectname]」,其中 objectname 是 對象類型的名稱。

String(mix)函數,將任何類型的值轉換爲字符串,其規則爲:

  • 若是有toString()方法,則調用該方法(不傳遞radix參數)並返回結果
  • 若是是null,返回」null」
  • 若是是undefined,返回」undefined」

Boolean(mix)函數,將任何類型的值轉換爲布爾值。
如下值會被轉換爲false:false、」"、0、NaN、null、undefined,其他任何值都會被轉換爲true。

隱式轉換

考慮一下狀況:

  • null == undefined
  • undefined == null
  • 2 == "2"
  • "2" == 2
  • NaN != NaN

在某些狀況下,即便咱們不提供顯示轉換,Javascript也會進行自動類型轉換,主要狀況有:

用於檢測是否爲非數值的函數:isNaN(mix)

isNaN()函數,經測試發現,該函數會嘗試將參數值用Number()進行轉換,若是結果爲「非數值」則返回true,不然返回false。

遞增遞減操做符(包括前置和後置)、一元正負符號操做符

這些操做符適用於任何數據類型的值,針對不一樣類型的值,該操做符遵循如下規則(通過對比發現,其規則與Number()規則基本相同):

  • 若是是包含有效數字字符的字符串,先將其轉換爲數字值(轉換規則同Number()),在執行加減1的操做,字符串變量變爲數值變量。
  • 若是是不包含有效數字字符的字符串,將變量的值設置爲NaN,字符串變量變成數值變量。
  • 若是是布爾值false,先將其轉換爲0再執行加減1的操做,布爾值變量編程數值變量。
  • 若是是布爾值true,先將其轉換爲1再執行加減1的操做,布爾值變量變成數值變量。
  • 若是是浮點數值,執行加減1的操做。
  • 若是是對象,先調用對象的valueOf()方法,而後對該返回值應用前面的規則。若是結果是NaN,則調用toString()方法後再應用前 面的規則。對象變量變成數值變量。

加法運算操做符

加號運算操做符在Javascript也用於字符串鏈接符,因此加號操做符的規則分兩種狀況:

若是兩個操做值都是數值,其規則爲:

  • 若是一個操做數爲NaN,則結果爲NaN
  • 若是是Infinity+Infinity,結果是Infinity
  • 若是是-Infinity+(-Infinity),結果是-Infinity
  • 若是是Infinity+(-Infinity),結果是NaN
  • 若是是+0+(+0),結果爲+0
  • 若是是(-0)+(-0),結果爲-0
  • 若是是(+0)+(-0),結果爲+0

若是有一個操做值爲字符串,則:

  • 若是兩個操做值都是字符串,則將它們拼接起來
  • 若是隻有一個操做值爲字符串,則將另外操做值轉換爲字符串,而後拼接起來
  • 若是一個操做數是對象、數值或者布爾值,則調用toString()方法取得字符串值,而後再應用前面的字符串規則。對於undefined和 null,分別調用String()顯式轉換爲字符串。

能夠看出,加法運算中,若是有一個操做值爲字符串類型,則將另外一個操做值轉換爲字符串,最後鏈接起來。

乘除、減號運算符、取模運算符

這些操做符針對的是運算,因此他們具備共同性:若是操做值之一不是數值,則被隱式調用Number()函數進行轉換。具體每一種運算的詳細規則請參 考ECMAScript中的定義。

邏輯操做符(!、&&、||)

邏輯非(!)操做符首先經過Boolean()函數將它的操做值轉換爲布爾值,而後求反。
邏輯與(&&)操做符,若是一個操做值不是布爾值時,遵循如下規則進行轉換:

  • 若是第一個操做數經Boolean()轉換後爲true,則返回第二個操做值,不然返回第一個值(不是Boolean()轉換後的值)
  • 若是有一個操做值爲null,返回null
  • 若是有一個操做值爲NaN,返回NaN
  • 若是有一個操做值爲undefined,返回undefined

邏輯或(||)操做符,若是一個操做值不是布爾值,遵循如下規則:

  • 若是第一個操做值經Boolean()轉換後爲false,則返回第二個操做值,不然返回第一個操做值(不是Boolean()轉換後的值)
  • 對於undefined、null和NaN的處理規則與邏輯與(&&)相同

關係操做符(<, >, <=, >=)

與上述操做符同樣,關係操做符的操做值也能夠是任意類型的,因此使用非數值類型參與比較時也須要系統進行隱式類型轉換:

  • 若是兩個操做值都是數值,則進行數值比較
  • 若是兩個操做值都是字符串,則比較字符串對應的字符編碼值
  • 若是隻有一個操做值是數值,則將另外一個操做值轉換爲數值,進行數值比較
  • 若是一個操做數是對象,則調用valueOf()方法(若是對象沒有valueOf()方法則調用toString()方法),獲得的結果按照前 面的規則執行比較
  • 若是一個操做值是布爾值,則將其轉換爲數值,再進行比較

注:NaN是很是特殊的值,它不和任何類型的值相等,包括它本身,同時它與任何類型的值比較大小時都返回false。

相等操做符(==)

相等操做符會對操做值進行隱式轉換後進行比較:

  • 若是一個操做值爲布爾值,則在比較以前先將其轉換爲數值
  • 若是一個操做值爲字符串,另外一個操做值爲數值,則經過Number()函數將字符串轉換爲數值
  • 若是一個操做值是對象,另外一個不是,則調用對象的valueOf()方法,獲得的結果按照前面的規則進行比較
    null與undefined是相等的
  • 若是一個操做值爲NaN,則相等比較返回false
  • 若是兩個操做值都是對象,則比較它們是否是指向同一個對象

須要注意的是一個值轉換爲另外一個值並不表明兩個值相等。

References

相關文章
相關標籤/搜索