數據類型——基本數據類型和引用數據類型
一.分類
1,五種簡單數據類型(基本數據類型):number,string,boolean,null,undefined,symbol(ES6)
基本數據類型是指存放在棧中的簡單數據段,數據大小確定,內存空間大小可以分配,它們是直接按值存放的,所以可以直接按值訪問。
1)undefined:聲明的變量但沒有對齊初始化時,該變量的值就是undefined
var a; console.log(a == undefined,undefined==undefined); //true true a聲明了但未定義 console.log(typeof b); //undefined b未聲明 console.log(typeof a); //undefined console.log(b == undefiend); //報錯
2)null:null值表示一個空對象指針,使用typeof時,返回‘object’
undefiend的值是派生自null
console.log(null == undefined,1==‘1‘,1===‘1‘);//true true false ‘==‘:會類型轉換 console.log(null === undefined);//false
3)boolean:該類型只有兩個值true,false
其他類型可以使用Boolean()函數轉換為boolean 類型
console.log(‘iii‘ == true, ‘iii‘ === true, ‘‘ == true, ‘‘ === true);//false false false false console.log(Boolean(‘iii‘), Boolean(‘‘));//true false if (‘iii‘) { console.log(true); } //true console.log(1 == true, 1 === true, 0 == true, 0 === true);//true false false false 註意1==true是trueconsole.log(Boolean(1), Boolean(0));//true false if (1) { console.log(true); } //true var a = { i: 1 } console.log(a == true, {} == true);//false false console.log(Boolean(a), Boolean({}), Boolean(null));//true true false if (a) { console.log(true); } //true console.log(Boolean(undefined));//false
4)number類型:
console.log(NaN == NaN, NaN === NaN);//false false console.log(isNaN(NaN), isNaN(10), isNaN(‘10‘));//true false false console.log(isNaN(‘ooo‘), isNaN(true));//true false //不能轉化為數值就是true
數值轉換:
//boolean console.log(Number(true), Number(false)); // 1 0 //null console.log(Number(null)); //0 //undefined console.log(Number(undefined)); //NaN //字符串: console.log(Number(‘111‘), Number(‘00222‘), Number(‘0.1‘), Number(‘000.222‘));//111 222 0.1 0.222 console.log(Number(‘0xf‘), Number(‘‘), Number(‘ppp‘),Number(‘ppp123‘));//15 0 NaN NaN
//對象
var a = { value: 2 } var b = { value: 2, valueOf: function () { return 5 } } console.log(Number(a), Number(b));//NaN 5 調用對象valueOf
2.復雜數據類型(引用數據類型):存放在堆內存中的對象,每個空間大小不一樣,要根據情況進行特定的配置
引用類型的值是保存在堆內存中的對象,變量其實是保存的在棧內存中的一個指針(保存的是堆內存中的引用地址),這個指針指向堆內存。
引用類型數據在棧內存中保存的實際上是對象在堆內存中的引用地址。通過這個引用地址可以快速查找到保存中堆內存中的對象
二.檢測給定變量的數據類型——typeof
1.對一個值使用typeof操作符可能返回下列某個字符串:
‘undefined’:如果這個值未定義(未初始化);//未聲明的變量執行typeof也會返回‘undefined’ 本質上無論對於那種變量都不能進行任何操作
‘boolean’:如果這個值是布爾值;
‘string’:如果這個值是字符串;
‘number’:如果這個值是數值;
‘object’:如果這個值是對象,數組或者null;
‘function‘:如果這個值是函數
註意:對於正則表達式使用typeof :safari5之前,chrome7及之前,返回‘function’,後面的版本返回‘object’
三,兩種類型的區別:
1、聲明變量時內存分配不同
*原始類型:在棧中,因為占據空間是固定的,可以將他們存在較小的內存中-棧中,這樣便於迅速查詢變量的值
*引用類型:存在堆中,棧中存儲的變量,只是用來查找堆中的引用地址。
這是因為:引用值的大小會改變,所以不能把它放在棧中,否則會降低變量查尋的速度。相反,放在變量的棧空間中的值是該對象存儲在堆中的地址。地址的大小是固定的,所以把它存儲在棧中對變量性 能無任何負面影響
2.不同的內存分配帶來不同的訪問機制
在js中是不允許直接訪問保存在堆內存中的對象的,所有在訪問一個對象時,首先得到的是這個對象在堆內存中的地址,然後通過地址獲取該對象的值,即按引用訪問
而基礎數據類型是直接訪問到的
3,復制變量時的不同
1)原始值:在將一個保存著原始值的變量復制給另一個變量時,會將原始值的副本復制給新變量,此後這兩個變量是完全獨立的,他們只是擁有相同的value而已
2)引用值:在將一個保存著對象內存地址的變量復制給另外一個變量時,會將這個內存地址復制給新變量身上
也就是說這兩個變量都指向了堆內存中的同一對象,他們中任何一個做出改變都會反映到另一個身上。
(這裏要理解的一點就是,復制對象時並不會在堆內存中新生成一個一模一樣的對象,只是多了一個保存指向這個對象指針的變量罷了)。多了一個指針
4.參數傳遞的不同(把實參復制給形參的過程)
ECMAScript中所有函數的參數都是按值來傳遞的。為什麽涉及到原始類型與引用類型的值時仍然有區別呢?還不就是因為內存分配時的差別。
1)原始值:只是把變量裏的值傳遞給參數,之後參數和這個變量互不影響。 2)引用值:對象變量它裏面的值是這個對象在堆內存中的內存地址,這一點你要時刻銘記在心! 因此它傳遞的值也就是這個內存地址,這也就是為什麽函數內部對這個參數的修改會體現在外部的原因了,因為它們都指向同一個對象。
數據類型——基本數據類型和引用數據類型