重學Javascript之數據類型

Number類型

在Javascript,數值類型包括整數、浮點數。不管是什麼類型,在js中都是使用64爲來存儲數值。這些數值因爲分爲正數和負數,因此64位內存既要用來存儲正數,也要能存儲負數。在這64位中,52位保存整數,11位保存小數,剩下的1位爲符號位。

對於整數而言,除了可以使用常用的十進制來表示之外,還可以使用八進制和十六進制。

  • 八進制是以數字0開頭的數字,如012是10的八進制表示
  • 注意,如果0後面的數字超出範圍,會以十進制來進行解析。
  • 十六進制是以數字0和x開頭的數字,後面的數字可以0-9, a-f的任意組合
  • 特殊的數值——infinity -infinity 以及NaN

  • infinity表示能表示的最大數值

  • -infinity表示js能表示的最小數值

  • NaN: 代表一個計算錯誤。他是一個不正確的或者是一個未定義的數學操作所得到的結果。

  • 對於NaN,可以通過isNaN來判斷是否”不是數值“。接受一個參數。將接受的參數轉換爲數字,然後再判斷是不是NaN


  • 如果對一個對象調用isNaN,或者對其進行整數操作,首先會調用對象的valueOf()方法

  • 與此類似的有isInfiite() , 將參數轉換爲數字,常規數字 -> true 否則 -> false

  • 還有一個常用的比較方法: Object.is().他基本與 ===相同,只有兩點不同: Object.is(NaN, NaN) === true ; Object.is(0, -0) === false
  • toString(base)

通過num.toString(base) 可以將數字轉換爲特定base進制的字符串。

數字的攝入操作

  • Math.floor() 向下取整

  • Math.ceil() 向上取整

  • Math.round() 就進取整

  • Math.trunc() 移除小數點後的所有內容,沒有舍入

不精確的計算

  • 這裏有一個常見的問題: 爲什麼0.1 + 0.2 !== 0.3

  • 原因: 數據在內存中是以二進制進行存儲的,0.1 和 0.2轉換成二進制都是無限循環小數。而在JS中,小數位的精度爲17位,超過的話會進行舍入,從而造成舍入誤差。

  • 如何解決? 通過toFixed(n) 進行解決。通過toFixed(n)可以對結果進行舍入,保留n個小數位,且返回的結果爲字符串。

字符串轉換成數字

  • parseInt()

  • parseFloat()

在這裏,他們接受一個字符串,從字符串中第一個數字位開始讀取,直到遇到一個非數字位。parseInt()還可以接受第二個參數,表示以多少進制解析字符串

小操作: 在字符串之前加上+ , - 可以把字符串立即轉換成數值。

String類型

現在的字符串表示形式主要有三種方式:

  • 單引號

  • 雙引號

  • 模板字符串的形式(abcd

模板字符串是ES6中出現的。作爲新出現的特性,必定是爲了解決以前存在的一些痛點,及做了擴展。

主要有兩種:

  • 可以實現多行文本。

之前的字符串,要實現換行,一般都是在文本中要換行的地方插入 \n 。這種方式很不方便。

  • 可以讓我們較爲自由的插入變量。

一般我們的字符串字面量一旦創建就不會也不能再發生改變。而在模板字符串中,通過使用佔位符${var}可以實現將變量嵌入到字符串中。更爲具體地說,不僅僅可以插入變量,只要是JS表達式,都可以進行插入。

  • 標籤模板。可以在模板字符串前加上一個標籤模板,可以是一個函數。

調用toString()方法,將其他值轉換成字符串的值。

NULL

僅僅代表 ”空“,“無” 或者 “值未知”。

Undefined

表示一個值,已經聲明但是未被賦值。

注意 undefined和undeclared的區別:

undefined表示已經被聲明瞭,只是這個變量還沒有被賦值。undeclared表示連聲明都沒有。所以,雖然基本類型中沒有undeclared,但是要注意區別。

Object類型

對象類型,其實就是一組鍵值對。他可以通過對象字面量創建,也可以通過new操作符來創建。

每個Object的實例都具有一下幾種屬性:

  • Constructor : 指向創建該對象實例的函數。

  • hasOwnProperty() : 檢查特定屬性書不是在當前對象實例中(而不是在原型中)

  • isPrototypeOf(object) : 用於判斷傳進來的對象是不是當前對象的原型。

  • toLocalString() : 返回對象的字符串表示。與當地對應。

  • toString() : 對象的字符串表示

  • valueOf() : 返回對象的數值,字符串或布爾值表示。

  • propertyIsEnumerable(proname) : 當前對象的屬性能不能通過for-in來枚舉。

Symbol

主要用於定義唯一的標識符。

如何判斷數據的類型

  • Typeof
  • Instanceof

如果想要判斷一個對象的具體類型,可以通過 obj instanceof Obj 來進行判斷。

原理: 判斷Obj是不是在obj的原型鏈上。

  • Object.prototype.toString.call()
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章