1.數據類型:
原始數據類型:undefined、null、Boolean、Number、String、Symbol(ES6)、BigInt(ES10)
引用數據類型:Object
Symbol:獨一無二的值,最大的用法是用來定義對象的唯一屬性名。
BigInt:任意精度的整數,可以安全地存儲和操作數值大的整數。
2.數據存儲:
原始數據類型:存儲在棧(stack)中,占據空間小、大小固定、屬于被頻繁使用數據。
引用數據類型:同時存儲在棧(stack)和堆(heap)中,在棧中存儲了指針,該指針指向堆中該實體的起始地址。占據空間大,大小不固定,當解釋器尋找引用值時,會首先檢索其棧中的地址,然后在堆中獲得對應的值。
3.堆和棧:
在數據結構中,棧的存取方式為先進后出,而堆是一個優先隊列,按優先級排序。
在操作系統中,內存被分為棧區和堆區。棧區內存由編譯器自動分配釋放,堆區內存一般由程序員分配釋放,如果程序員不分配釋放,程序結束時可能會被垃圾回收機制回收。
4.數據類型轉換
轉換為布爾值:Boolean()
number:除了±0和NaN,其他都為true
string:除了空字符串都為true
undefined和null:false
引用類型:true
轉換為字符串:.toString()、String()(null和undefined沒有toString()方法)
number:0 => '0'
Boolean:String(false) => 'false'
function:var a = function(){} => 'function(){}'
Symbol:let a = Symbol() => 'Symbol()'
數組:[1,2] => 1,2
對象:[object,object]
轉換為數字:Number()、parseInt()、parseFloat()
string:'1' => 1, a => NaN
數組:[] => 0,如果數組中有元素為數字則轉為數字,其他情況為NaN
null:0
除了數組的引用類型:NaN
Symbol:報錯
5.數據類型判斷:
typeOf
對于原始數據類型來說,除了null都可以顯示正確的類型。
對于對象來說,除了函數都會顯示object,所以typeof不能準確的判斷變量類型。
typeof 1 // number
typeof true // boolean
typeof 'str' // string
typeof [] // object
typeof function(){} // function
typeof {} // object
typeof undefined // undefined
typeof null // object
instanceof
可以準確的判斷數據類型,因為內部機制是通過判斷對象的原型鏈中是不是能找到prototype。但是不能精準判斷原始數據類型。
instanceof:instanceof運算符用來測試一個對象在其原型鏈中是否存在一個構造函數的prototype屬性。其意思是判斷對象是否是某一數據類型(如Array)的實例,請重點關注是判斷一個對象是否是數據類型的實例。而1,true,'str'這些字面量不是實例,所以為false。
1 instanceof Number // false
true instanceof Boolean // false
'str' instanceof String // false
[] instanceof Array // true
function(){} instanceof Function // true
{} instanceof object // true
// undefined instanceof Undefined
// null instanceof Null
constructor
(1).constructor === Number // true
(true).constructor === Boolean // true
('str').constructor === String // true
([]).constructor === Array // true
(function(){}).constructor === Function // true
({}).constructor === Object // true
需要注意的是,存在一種情況,如果創建一個對象,然后更改它的原型,這時constructor會變得不可靠。
function fn(){}
fn.prototype = new Array()
var f = new fn()
console.log(f.constructor === fn) // false
console.log(f.constructor === Array) // true
Object.prototype.toString.call()
使用Object對象的原型方法toString,返回一個 "[object XXX]" 的字符串
var a = Object.prototype.toString
a.call(1) // [object Number]
a.call(true) // [object Boolean]
a.call('str') // [object String]
a.call([]) // [object Array]
a.call(function(){}) // [object Function]
a.call({}) // [object Object]
a.call(undefined) // [object Undefined]
a.call(null) // [object Null]
所有typeof返回值為object的對象都包含一個內部屬性[[class]],這個屬性無法直接訪問,一般通過Object.prototype.toString來訪問。