一.分類
1,五種簡單資料型別(基本資料型別):number,string,boolean,null,undefined,(新增symbol(es6))
基本資料型別是指存放在棧中的簡單資料段,資料大小確定,記憶體空間大小可以分配,它們是直接按值存放的,所以可以直接按值訪問。
1)undefined:宣告的變數但沒有初始化時,該變數的值就是undefined
vara; 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的值是派生自nullconsole.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') //
true
console.log(1 == true, 1 === true, 0 == true, 0 === true);//
true false false false 注意1==true是true
console.log(boolean(1), boolean(0));//
true false
if (1) //
true
var a =
console.log(a == true, {} == true);//
false false
console.log(boolean(a), boolean({}), boolean(null));//
true true false
if (a) //
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 =
var b = }
console.log(number(a), number(b));
//nan 5 呼叫物件valueof
注意:nan
1、nan屬於資料型別中的資料;
2、nan在布林值中是false;
3、nan 與自己不相等。
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)引用值:物件變數它裡面的值是這個物件在堆記憶體中的記憶體位址,這一點你要時刻銘記在心!
因此它傳遞的值也就是這個記憶體位址,這也就是為什麼函式內部對這個引數的修改會體現在外部的原因了,因為它們都指向同乙個物件。
基本資料型別和引用資料型別
資料型別 基本資料類 1.數值型 整數 byte short int long 浮點 float double 2.字元型 char 3.布林型 boolean 引用資料型別 1.類 class 2.介面 inte ce 3.陣列 array 基本資料型別 它的值是乙個數字 字元或布林值,變數指向具...
基本資料型別 引用資料型別
一 基本資料型別 基本資料型別 number string boolean null undefined symbol es6 基本資料型別是指存放在棧中的簡單資料段,資料大小確定,記憶體空間大小可以分配,它們是直接按值存放的,所以可以直接按值訪問。二 引用資料型別 引用資料型別 object 在j...
js 基本資料型別和引用資料型別
1 資料型別 js分兩種資料型別 基本資料型別 number string boolean null undefined symbol es6 這些型別可以直接操作儲存在變數中的實際值。引用資料型別 object 在js中除了基本資料型別以外的都是物件,資料是物件,函式是物件,正規表示式是物件 2 ...