JS類型
- 原始類型存儲的是值奔害,對象類型存儲的是地址(指針)
JS原始(Primitive)類型
- boolean
- null -- (typeof null會輸出object悯搔,但null不是對象蝉揍,歷史遺留問題)
- undefined
- number -- (浮點類型)
- string
- symbol
JS對象(Object)類型
pass
typeof vs instanceof
typeof 對于原始類型來說趋箩,除了 null 都可以顯示正確的類型啃炸,對于對象來說铆隘,除了函數(shù)都會顯示 object,
typeof true // 'boolean'
typeof null // 'object'
typeof undefined // 'undefined'
typeof 1 // 'number'
typeof '1' // 'string'
typeof Symbol() // 'symbol
typeof [] // 'object'
typeof {} // 'object'
typeof console.log // 'function'
instanceof內(nèi)部機制是通過原型鏈來判斷的南用,直接單純通過 instanceof 來判斷原始類型是不行的
const Person = function() {}
const p1 = new Person()
p1 instanceof Person // true
var str = 'hello world'
str instanceof String // false
var str1 = new String('hello world')
str1 instanceof String // true
類型轉(zhuǎn)換
原始值 | 轉(zhuǎn)換目標 | 結(jié)果 |
---|---|---|
number | 布爾值 | 除了0膀钠、-0、NaN都為true |
string | 布爾值 | 除了空串都為true |
undefined裹虫、null | 布爾值 | FALSE |
引用類型 | 布爾值 | TRUE |
number | 字符串 | 3 => '3' |
Boolean肿嘲、函數(shù)、Symbol | 字符串 | 'true' |
數(shù)組 | 字符串 | [1,2] => '1,2' |
對象 | 字符串 | '[object Object]' |
string | 數(shù)字 | '3' => 3 , 'a' =>NaN |
數(shù)組 | 數(shù)字 | 空數(shù)組為0筑公,存在一個元素且為數(shù)字轉(zhuǎn)數(shù)字雳窟,其他情況NaN |
null | 數(shù)字 | 0 |
除了數(shù)組的引用類型 | 數(shù)字 | NaN |
Symbol | 數(shù)字 | 拋錯 |
轉(zhuǎn)Boolean
在條件判斷時,除了 undefined匣屡, null封救, false拇涤, NaN, ''兴泥, 0工育, -0,其他所有值都轉(zhuǎn)為 true搓彻,包括所有對象如绸。對象轉(zhuǎn)原始類型
對象在轉(zhuǎn)換類型的時候,會調(diào)用內(nèi)置的 [[ToPrimitive]] 函數(shù)旭贬,對于該函數(shù)來說怔接,算法邏輯一般來說如下:
-- 如果已經(jīng)是原始類型了,那就不需要轉(zhuǎn)換了
-- 調(diào)用 x.valueOf()稀轨,如果轉(zhuǎn)換為基礎(chǔ)類型扼脐,就返回轉(zhuǎn)換的值
-- 調(diào)用 x.toString(),如果轉(zhuǎn)換為基礎(chǔ)類型奋刽,就返回轉(zhuǎn)換的值
-- 如果都沒有返回原始類型瓦侮,就會報錯
當然也可以重寫 Symbol.toPrimitive ,該方法在轉(zhuǎn)原始類型時調(diào)用優(yōu)先級最高
let a = {
valueOf() {
return 0
},
toString() {
return '1'
},
[Symbol.toPrimitive]() {
return 2
}
}
1 + a // => 3
類型判斷神器 -- Object.prototype.toString.call()
Object.prototype.toString.call({})
"[object Object]"
Object.prototype.toString.call(()=>{})
"[object Function]"
Object.prototype.toString.call([])
"[object Array]"
Object.prototype.toString.call(new RegExp())
"[object RegExp]"
Object.prototype.toString.call(null)
"[object Null]"
Object.prototype.toString.call(undefined)
"[object Undefined]"
Object.prototype.toString.call(false)
"[object Boolean]"
Object.prototype.toString.call('hello')
"[object String]"
Object.prototype.toString.call(666)
"[object Number]"
Object.prototype.toString.call(Symbol())
"[object Symbol]"
Object.prototype.toString.call(new Map())
"[object Map]"
Object.prototype.toString.call(new Set())
"[object Set]"