JS類型
- 原始類型存儲的是值,對象類型存儲的是地址(指針)
JS原始(Primitive)類型
- boolean
- null -- (typeof null會輸出object,但null不是對象,歷史遺留問題)
- undefined
- number -- (浮點類型)
- string
- symbol
JS對象(Object)類型
pass
typeof vs instanceof
typeof 對于原始類型來說,除了 null 都可以顯示正確的類型,對于對象來說,除了函數都會顯示 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內部機制是通過原型鏈來判斷的,直接單純通過 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
類型轉換
原始值 | 轉換目標 | 結果 |
---|---|---|
number | 布爾值 | 除了0、-0、NaN都為true |
string | 布爾值 | 除了空串都為true |
undefined、null | 布爾值 | FALSE |
引用類型 | 布爾值 | TRUE |
number | 字符串 | 3 => '3' |
Boolean、函數、Symbol | 字符串 | 'true' |
數組 | 字符串 | [1,2] => '1,2' |
對象 | 字符串 | '[object Object]' |
string | 數字 | '3' => 3 , 'a' =>NaN |
數組 | 數字 | 空數組為0,存在一個元素且為數字轉數字,其他情況NaN |
null | 數字 | 0 |
除了數組的引用類型 | 數字 | NaN |
Symbol | 數字 | 拋錯 |
轉Boolean
在條件判斷時,除了 undefined, null, false, NaN, '', 0, -0,其他所有值都轉為 true,包括所有對象。對象轉原始類型
對象在轉換類型的時候,會調用內置的 [[ToPrimitive]] 函數,對于該函數來說,算法邏輯一般來說如下:
-- 如果已經是原始類型了,那就不需要轉換了
-- 調用 x.valueOf(),如果轉換為基礎類型,就返回轉換的值
-- 調用 x.toString(),如果轉換為基礎類型,就返回轉換的值
-- 如果都沒有返回原始類型,就會報錯
當然也可以重寫 Symbol.toPrimitive ,該方法在轉原始類型時調用優先級最高
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]"