資料型別與typeof
阿新 • • 發佈:2020-10-07
個人學習筆記,如有錯誤請指出
資料型別
基本資料型別(原始值型別)
number
NaN
/Infinity
特殊string
單引號/雙引號/反引號``boolean
true
/false
null
undefined
symbol
建立唯一值bigint
引用資料型別:
object
{}
普通物件[]
陣列物件/^[+-]?(?:\d|(?:[1-9]\d+))(\.\d+)?$/
正則物件- 日期物件
function
(較為特殊,函式是一個附帶可被呼叫功能的常規的物件)- ...
一共8大資料型別
更加詳細和官方的解釋參考MDN: JavaScript 資料型別和資料結構
注意:
javascript中,set
和map
是一種資料結構,本質上還是Object
型別
typeof
typeof
操作符返回一個字串,表示未經計算的運算元的型別
//7個基本資料型別
typeof 10
//"number"
typeof '1'
//"string"
typeof null
//"object"
typeof undefined
//"undefined"
typeof Symbol()
//"symbol"
typeof 9007199254740991n
//"bigint"
typeof true
//"boolean"
//object型別 typeof {} //"object" typeof [] //"object" typeof /^$/ //"object" typeof new Date() //"object"
注意比較特殊的
//需要記住的特殊值
typeof NaN
//"number"
typeof function(){}
//"function"
typeof null
//"object"
typeof []//不要搞混,typeof 細分物件是不可以的
//"object"
注意三個包裝物件
所謂“包裝物件”,指的是與數值、字串、布林值分別相對應的
Number
、String
、Boolean
三個原生物件。這三個原生物件可以把原始型別的值變成(包裝成)物件。
var v1 = new Number(123); var v2 = new String('abc'); var v3 = new Boolean(true); typeof v1 // "object" typeof v2 // "object" typeof v3 // "object" v1 === 123 // false v2 === 'abc' // false v3 === true // false
typeof null === 'object'
原因
typeof
的原理:
- 所有的資料型別值在計算機中儲存的都是按照“二進位制”儲存的
null
-> 000000- 只要是物件都是以 000 開始的
- typeof`檢測的時候,是按照計算機儲存的二進位制的值來檢測的
MDN解釋:
總結:
因為在javascript當中值的型別由型別標籤+實際數值表示,物件的型別標籤是0,而null
指向空指標,用0x00的值來表示,所以null
的型別標籤也是0,因此typeof null
返回 "object"
。
NaN
NaN
:not a number 不是一個有效數字,但是它屬於number
資料型別的
console.log(typeof NaN); //=>"number"
console.log(NaN == NaN); //=>false
console.log(NaN === NaN); //=>false
let n = 10;
//如何檢測是NaN
if (isNaN(n)) {
// 條件成立:證明它真的是非有效數字
}
Object.is([val1],[val2])//檢測兩個值是否相等
console.log(Object.is(NaN, NaN)); //=>true
Object.is()
內部對NaN
的判斷做了特殊處理
Infinity
typeof Infinity//"number"
Infinity===Infinity//true
-Infinity===Infinity//false
symbol
簡單介紹
JS 中的 Symbol 是什麼?
ECMAScript 6入門-Symbol
Symbol 可以建立一個獨一無二的值。
console.log(new Symbol()); //Uncaught TypeError: Symbol is not a constructor
//無法使用new Sumbol(基本資料型別)
console.log(Symbol('AA') === Symbol('AA')); //false
//每次都會建立一個唯一值,括號中的字串可以看做標記,註釋,只是為了區分
let symb = Symbol('BB');
console.log(symb === symb); //true
bigint
最大安全數與最小安全數
Number.MAX_SAFE_INTEGER//9007199254740991
Number.MIN_SAFE_INTEGER//-9007199254740991
Math.pow(2,53)//9007199254740992
超過這個數計算會出現錯誤
bigint解決大數問題
如果伺服器儲存ID是長整型,int值非常大。當伺服器將其轉化為字串的時候,返回給客戶端就沒有問題,如果伺服器以Number型別返回,那麼這個返回的id在瀏覽器中和伺服器中值不一樣,會發生改變,出現錯誤
為了解決這個問題,在es6中引入新的資料型別bigint
,在數字後面加n
即為bigint
型別
9007199254740992123n+1n//9007199254740992124n
typeof 9007199254740992124n//"bigint"