原始類型:
原始類型 | Undefined | Null | String | Boolean | Number | Symbol |
---|---|---|---|---|---|---|
值 | undefined | null | 所有字符串 | true / false | 所有數(shù)字/NaN | symbol |
function show (){
console.log( typeof undefined) // undefined
console.log( typeof 2) //Number
console.log( typeof "asd") // String
console.log( typeof true)
console.log( typeof null)
/**
也許有人會問蹦漠,在typeOf 的時候,為什么null车海,會是Object笛园?
這其中是有歷史原因的存在的,這實際上是JavaScript當(dāng)時實現(xiàn)時的一個錯誤
但是被ECMAScript沿用了侍芝。
現(xiàn)在null研铆,被認為是對象的占位符,從而解釋了這一個矛盾
但是州叠,從技術(shù)的角度出發(fā)棵红,它依舊是一個原始值。
*/
console.log( typeof new Number("2"))
console.log( typeof new String(2))
console.log( typeof new Boolean(2))
}
show()
"symbol" 是ES6咧栗,新擴展的原始類型逆甜;
Symbol,表示獨一無二的值。Symbol 值通過Symbol函數(shù)生成致板。
let s = Symbol();
typeOf s
// "symbol"
特性和使用:
1.每個symbol都是獨一無二的值交煞。
2.不能使用new關(guān)鍵字。
3.Symbol函數(shù)可以接受一個字符串作為參數(shù)斟或,表示對Symbol的描述错敢。
let s1 = Symbol('a');
let s2 = Symbol('b');
s1 // Symbol(a)
s2 // Symbol(b)
s1.toString() // "Symbol(a)"
s2.toString() // "Symbol(b)"
4.Symbol函數(shù)如果傳入一個對象,會被調(diào)用toString方法缕粹,將對象轉(zhuǎn)為字符串稚茅,然后才生成Symbol值。
const obj = {
toString() {
return 'a';
}
};
const sym = Symbol(obj);
sym // Symbol(a)
5.永不相等平斩,多個Symbol函數(shù)傳入的字符串亚享,即使是一樣的,也不會相等绘面。
// 沒有參數(shù)的情況
let s1 = Symbol();
let s2 = Symbol();
s1 === s2 // false
// 有參數(shù)的情況
let s1 = Symbol('a');
let s2 = Symbol('a');
s1 === s2 // false
6.不能與其他類型的值進行運算欺税,會報錯。
let sym = Symbol('My Symbol');
" Your and" + sym
// TypeError: can't convert symbol to string
` Your and ${sym}`
// TypeError: can't convert symbol to string
Number(sym) // TypeError
sym + 2 // TypeError
//Symbol值可以轉(zhuǎn)為String揭璃。
Srting(sym) // 'Symbol(My Symbol)'
sym.toSrting() // 'Symbol(My Symbol)'
//Symbol可以轉(zhuǎn)Boolean值
Boolean(sym) //true;
!sym //false;
if(sym){
// ....
}
引用數(shù)據(jù)類型:
Object的成員叫做對象晚凿,包括Array,Date瘦馍,RegExp歼秽,Math,JSON情组,F(xiàn)unction燥筷,等除了原始值外的所有成員箩祥。
基本包裝類型
JavaScript 提供了三個特殊的引用類型:Boolean,Number肆氓,String袍祖。
在W3C文檔中的解釋是,Boolean谢揪,Number蕉陋,String,是各自原始類型的引用類型拨扶。
也就是說寺滚,包裝類型也是引用類型的一種,是對原始類型的封裝屈雄,封裝之后村视,既會擁有原始類型的功能,也有各自的特殊行為(方法)酒奶。
思考一下蚁孔,我們能不能操作這種封裝過實例?
var s1 = 'some text';
s1.color = 'red';
alert(s1.color);//undefined
似乎惋嚎,行不通杠氢。為什么呢? 原來另伍,這種特殊的包裝類型鼻百,也是有分隱式和顯式創(chuàng)建的。
在我們平時操作字符串的時候摆尝,所調(diào)用的方法
var s1 = 'some text';
var s2 = s1.substring(2);
//可以將以下三個步驟想象成是執(zhí)行了下列ECMAScript代碼温艇。
var s1 = new String('some text'); //(1)創(chuàng)建String類型的一個實例
var s2 = s1.substring(2); //(2)在實例上調(diào)用指定的方法
s1 = null; //(3)銷毀這個實例
每當(dāng)讀取到一個基本類型值的時候,后臺就會自動創(chuàng)建一個相對應(yīng)的堕汞,基本包裝類型的對象勺爱,從而可以合理的調(diào)用某些方法。
這種自動創(chuàng)建的基本包裝類型的對象讯检,只存在于執(zhí)行該代碼的那一瞬間琐鲁,然后即刻被銷毀掉。這就是為什么人灼,我們不能直接操作基本包裝類型的實例了围段。
如果想要操作包裝類型的實例,當(dāng)然也是可以的投放。就是顯示的創(chuàng)建奈泪,使用new關(guān)鍵字。
var s1 = new String('some text');
s1.color = 'red';
alert(s1.color);//red
在這種情況下的包裝類型,就會顯得更加接近普通的引用類型了段磨。
valueOf / toString (隱式轉(zhuǎn)換)
Objec調(diào)用所得:
String調(diào)用所得:
Array調(diào)用所得:
Number調(diào)用所得:
Date調(diào)用所得:
Boolean 調(diào)用所得:
Function 調(diào)用所得:
Object | String | Array | Number | Date | Boolean | Function | |
---|---|---|---|---|---|---|---|
valueOf | 原始值 | 原始值 | 原始值 | 原始值 | 時間毫秒戳 | 原始值 | 函數(shù)類型字符輸出 |
toString | [object object] | 原始值 | join方法返回值 | 數(shù)字的字符串 | 本地時間字符串 | true/false 字符串 | 字符串函數(shù) |