隨手記一記之【JS資料型別】

weixin_34248705發表於2018-07-23

JS資料型別有6種,其中5種基本資料型別——String、Number、Undefined、Null、Boolean,還有一種複雜資料型別——Object。不過在ES6中引入了第7種資料型別——Symbol。

typeof 操作符

typeof 用來檢測資料型別,對一個值使用 typeof 操作符可能返回一下幾種字串:

  • undefined - 如果這個值未定義
  • boolean - 如果值為布林值
  • string - 如果值為字串
  • number - 如果是數字
  • object - 如果值是物件或者 null
  • function - 如果值是函式

紅寶書第三版 P23

  • symbol - 如果值是 symbol
const a = 'a'
const b = 123
const c = true
const d = null
const e = () => {}
const f = {}
const g = Symbol()

console.log(typeof a) //string
console.log(typeof b) //number
console.log(typeof c) //boolean
console.log(typeof d) //object
console.log(typeof e) //function
console.log(typeof f) //object
console.log(typeof g) // symbol

除了 null 以外,都能返回正確的結果。而 null 會返回 object,這是 js 的一個缺陷。那麼可以通過 Object.prototype.toString.call(xx) 的方式獲取變數的正確型別:

console.log(Object.prototype.toString.call('null')) //[object String]
console.log(Object.prototype.toString.call(123)) //[object Number]
console.log(Object.prototype.toString.call(null)) //[object Null]

number

JS 的數字型別是浮點型別的,沒有整型。並且浮點型別基於 IEEE 754標準實現,在使用中會遇到某些 Bug。NaN 也屬於 number 型別,並且 NaN 不等於自身。

0.1 + 0.2 != 0.3

因為 JS 採用 IEEE 754 雙精度版本(64位),並且只要採用 IEEE 754 的語言都有該問題。
我們都知道計算機表示十進位制是採用二進位制表示的,所以 0.1 在二進位制表示為

// (0011) 表示迴圈
0.1 = 2^-4 * 1.10011(0011)
0.2 = 2^-3 * 1.10011(0011)

IEEE 754 雙精度。六十四位中符號位佔一位,整數位佔十一位,其餘五十二位都為小數位。因為 0.1 和 0.2 都是無限迴圈的二進位制了,所以在小數位末尾處需要判斷是否進位(就和十進位制的四捨五入一樣)。

所以 2^-4 * 1.10011...001 進位後就變成了 2^-4 * 1.10011(0011 * 12次)010 。那麼把這兩個二進位制加起來會得出 2^-2 * 1.0011(0011 * 11次)0100 , 這個值算成十進位制就是 0.30000000000000004,因此 0.1 + 0.2 != 0.3
解決辦法如下:

parseFloat((0.1 + 0.2).toFixed(10))

NaN

NaN,即非數值(Not a Number)。
NaN 本身有兩個特點: ①任何涉及 NaN 的操作都會返回 NaN;②NaN 與任何值都不相等,包括 NaN 本身,NaN != NaN。

alert(NaN == NaN) //false

針對NaN 的特點,ECMAScript 定義了 isNaN()方法。這個方法在判斷之前會嘗試將引數轉換為數值,若不能轉換成數值,則返回 true。

alert(isNaN(NaN)) //true
alert(isNaN(10)) //fasle
alert(isNaN('10')) //false
alert(isNaN('stirng')) //true
alert(isNaN(true)) //false
alert(isNaN(undefined)) //true
alert(isNaN(null)) //false

symbol

其他幾種型別都很熟悉,但是 symbol 是 ES6新引入的型別。首先,表示獨一無二的值,通過 Symbol 生成。

const foo = Symbol()

symlol 可以接受一個字串作為引數,但是隻是用來描述這個變數。一旦建立了,就是獨一無二的,建立相同描述的兩個 Symbol 是不相等的

const a = Symbol('description')
const a1 = Symbol('description')

console.log(a) // Symbol(description)
console.log(a == a1) // false

console.log(a.toString()) //'Symbol(description)'
console.log(a1.toString()) // 'Symbol(description)'

object

Object 的每個例項中都含有以下屬性和方法:

  • constructor() : 儲存這個用於建立當前物件的函式;
  • hasOwnProperty(propertyName):用於檢查給的的屬性是否存在於當前物件例項中;
  • isPrototypeof(Object): 用於檢查傳入的物件是否是當前物件的原型;
  • propertyIsEnumerable(propertyName): 用於檢查給定的屬性是否能夠用 for-in 語句來列舉;
  • toLocalString(): 返回物件的字串表示,與執行環境的地區同步;
  • toString(): 返回物件的字串表示;
  • valueof(): 返回物件的字串、數值或布林值表示;

相關文章