隨手記一記之【JS資料型別】
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(): 返回物件的字串、數值或布林值表示;
相關文章
- ClickHouse資料庫資料定義手記之資料型別資料庫資料型別
- Go 筆記之資料型別Go筆記資料型別
- JS資料型別轉換記錄JS資料型別
- js隨手記-1JS
- js資料型別之基本資料型別和引用資料型別JS資料型別
- c#之資料型別小測記C#資料型別
- Knockout.js隨手記(5)JS
- Knockout.js隨手記(4)JS
- Knockout.js隨手記(6)JS
- Knockout.js隨手記(7)JS
- Knockout.js隨手記(8)JS
- Knockout.js隨手記(1)JS
- Knockout.js隨手記(2)JS
- Knockout.js隨手記(3)JS
- MySQL資料型別筆記MySql資料型別筆記
- 《JavaScript 闖關記》之變數和資料型別JavaScript變數資料型別
- Python 3 學習筆記之——資料型別Python筆記資料型別
- MySQL學習筆記之資料型別詳解MySql筆記資料型別
- Python學習筆記(一) 資料型別Python筆記資料型別
- Redis 筆記(核心資料型別)Redis筆記資料型別
- python筆記--資料型別Python筆記資料型別
- JS專題之資料型別和型別檢測JS資料型別
- js基本語法之 值型別(資料型別)(變數型別)JS資料型別變數
- Git.Framework 框架隨手記--ORM查詢資料集合 一GitFramework框架ORM
- 型別-PHP手冊筆記型別PHP筆記
- 型別 - PHP手冊筆記型別PHP筆記
- 基本資料型別與引用資料型別,及記憶體分配資料型別記憶體
- 資料庫-隨記資料庫
- Redis In Action 筆記(一):基本資料型別及其操作Redis筆記資料型別
- hive學習筆記之一:基本資料型別Hive筆記資料型別
- js資料型別JS資料型別
- 重溫手冊(一):資料型別資料型別
- 資料型別 - Go 學習記錄資料型別Go
- MySQL學習筆記--資料型別MySql筆記資料型別
- JavaScript學習筆記---資料型別JavaScript筆記資料型別
- 前端基礎(一):js資料型別前端JS資料型別
- 前後端資料互動形式隨手筆記後端筆記
- JavaScript筆記5:計時器、物件、基本資料型別、引用資料型別JavaScript筆記物件資料型別