js中有七種數(shù)據(jù)類型,包括流種基本數(shù)據(jù)類型(Number,String,Boolean,Undefined,Null贿衍,Symbols),和一種復(fù)雜數(shù)據(jù)類型(Object)。
三大引用類型
1.Object類型
我們看到的大多數(shù)類型值都是Object類型的實(shí)例,創(chuàng)建Object實(shí)例的方式有兩種肺然。
第一種是使用new操作符后跟Object構(gòu)造函數(shù),如下所示
var person = new Object(); person.name = "Micheal"; person.age = 24;
第二種方式是使用對象字面量表示法腿准,如下所示
var person = { name : "Micheal",age : 24};
2.Array類型
數(shù)組的每一項(xiàng)可以用來保存任何類型的數(shù)據(jù)际起,也就是說,可以用數(shù)組的第一個位置來保存字符串吐葱,第二個位置保存數(shù)值街望,第三個位置保存對象....另外,數(shù)組的大小是可以動態(tài)調(diào)整的弟跑。
創(chuàng)建數(shù)組的基本方式有兩種
第一種是使用Array構(gòu)造函數(shù)灾前,如下所示
var colors = new Array("red","blue","yellow");
第二種是使用數(shù)組字面量表示法,如下所示
var colors = ["red","blue","yellow"];
3 Function類型
每個函數(shù)都是Function類型的實(shí)例窖认,而且都與其他引用類型一樣具有屬性和方法豫柬。函數(shù)通常是使用函數(shù)聲明語法定義的,如下所示
function sum(num1,num2){return num1 + num2;};
這和使用函數(shù)表達(dá)式定義函數(shù)的方式相差無幾扑浸。
var sun = function (){return sum1 + sum2;};
基本數(shù)據(jù)類型
1:字符串
字符串類型中的單引號與雙引號的作用效果完全一樣烧给。
字符串有l(wèi)ength屬性『仍耄可以取得字符串的長度础嫡。var str = “hello”;console.log(str.length);//5
1:字符串的值是不可變的。要改變一個字符串的值酝惧,首先要銷毀原來的字符串榴鼎,再用另一個包含新值的字符串去填充該字符串。
var lang = “java”; lang += “script”;
上面這段代碼晚唇,先創(chuàng)建一個能容納10個字符的字符串巫财,然后在這個字符串中填充java和script字符串,最
后銷毀原來的字符串java和scrip字符串哩陕,因?yàn)檫@兩個字符串此時已經(jīng)沒用了平项。這個個過程是在后臺發(fā)生的。
2:字符串轉(zhuǎn)換:轉(zhuǎn)型函數(shù)String(),適用于任何數(shù)據(jù)類型(null,undefined 轉(zhuǎn)換后為null和undefined)悍及;toString()方法(null,undefined沒有toString()方法)闽瓢。
var bc = "lijinwen";
var bd = null;
var be = undefined;
console.log(bc.toString());
//console.log(bd.toString());//error 報(bào)錯
//console.log(be.toString());//error 報(bào)錯
console.log("------");
console.log(String(bc));
console.log(String(bd));
console.log(String(be));
2:數(shù)字 number
Number類型包含整數(shù)和浮點(diǎn)數(shù)(浮點(diǎn)數(shù)數(shù)值必須包含一個小數(shù)點(diǎn),且小數(shù)點(diǎn)后面至少有一位數(shù)字)兩種值心赶。
1:浮點(diǎn)數(shù)將會自動轉(zhuǎn)換為整數(shù)扣讼。
var num = 1.00; console.log(num);
//1,自動轉(zhuǎn)換為整數(shù)
2:浮點(diǎn)數(shù)的最高精度是17位缨叫,看下面的例子椭符,結(jié)果竟然不是0.3荔燎,至于其他編程語言,也會遇到這種情況(關(guān)于浮點(diǎn)數(shù)計(jì)算會產(chǎn)生舍入誤差問題艰山,其他有些編程語言也會出現(xiàn)類似情況湖雹。)
var num1 = 0.1; var num2 = 0.2; console.log(num1 + num2);//0.30000000000000004
3:NaN:非數(shù)字類型。特點(diǎn):① 涉及到的 任何關(guān)于NaN的操作曙搬,都會返回NaN ② NaN不等于自身。
var ab = "a1"; console.log(ab/10);// NaN console.log(NaN == NaN);// false;
4:isNaN()函數(shù)鸽嫂,用于判斷是否是一個非數(shù)字類型纵装。如果傳入的參數(shù)是一個非數(shù)字類型,那么返回true据某;否則返回false;
5:isNaN()函數(shù)橡娄,傳入一個參數(shù),函數(shù)會先將參數(shù)轉(zhuǎn)換為數(shù)值癣籽。
如果參數(shù)類型為對象類型挽唉,會先調(diào)用對象的valueOf()方法, 再確定該方法返回的值是否可以轉(zhuǎn)換為數(shù)值類型筷狼。如果不能瓶籽,再調(diào)用對象的toString()方法,再確定返回值埂材。
6:數(shù)值轉(zhuǎn)換:
Number()轉(zhuǎn)型函數(shù)塑顺,可以用于任何數(shù)據(jù)類型;
parseInt()俏险,將值轉(zhuǎn)換為整型严拒,用的比較多;
parseFloat()竖独;將值轉(zhuǎn)換為浮點(diǎn)型裤唠。
3:布爾 Boolean
該類型只有兩個值,true和false
轉(zhuǎn)換為boolean值: 轉(zhuǎn)型函數(shù)Boolean(),將某個值轉(zhuǎn)換為Boolean類型莹痢。詳細(xì)內(nèi)容种蘸,后面會慢慢的
補(bǔ)充。
4:對象object
對象由花括號分隔格二。在括號內(nèi)部劈彪,對象的屬性以名稱和值對的形式
(name : value) 來定義。屬性由逗號分隔
var person={firstname:"Bill", lastname:"Gates", id:5566};
對象屬性有兩種尋址方式:
person.key
person['key']
5:Undefined 和 Null
Undefined 這個值表示變量不含有值顶猜。
可以通過將變量的值設(shè)置為 null 來清空變量沧奴。
null類型被看做空對象指針,前文說到null類型也是空的對象引用长窄。只有一個值滔吠,即null值纲菌,所以,在你 用typeof 操作符去檢測null類型的值時疮绷,結(jié)果是object類型翰舌。
如果你定義了一個變量,但是想在以后把這個變量當(dāng)做一個對象來用冬骚,那么最好將該對象初始化為null值
只有一個值椅贱,即undefined值。使用var聲明了變量只冻,但未給變量初始化值庇麦,那么這個變量的值就是undefined。
var name = "lijinwen";
var age;
console.log(name);//lijinwen
console.log(age);//undefined
//console.log(height);//error喜德,變量height沒有聲明
console.log(typeof name);//string
console.log(typeof age);//undefined
console.log(typeof height);//undefined山橄,變量height沒有聲明
上面這段代碼中,age雖然聲明了舍悯,但是沒有初始化值航棱,所以,打印出來的是undefined.而變量height沒有聲明萌衬,故報(bào)錯饮醇。
但是用typeof操作符去檢測數(shù)據(jù)類型的時候,變量age沒有初始化奄薇,結(jié)果是undefined驳阎,沒有聲明變量的height檢測的類型也是undefined.
JavaScript中出現(xiàn)undefined的幾種情況。
訪問數(shù)組或?qū)ο蟛淮嬖诘某蓡T馁蒂。
定義的變量未賦值呵晚。
函數(shù)沒有返回值,或return后沒有數(shù)據(jù)
6:symbol
ES6引入了一種新的原始數(shù)據(jù)類型Symbol沫屡,表示獨(dú)一無二的值饵隙。
Symbol函數(shù)前不能使用new命令,否則會報(bào)錯沮脖。這是因?yàn)樯傻腟ymbol是一個原始類型的值金矛,不是對象
Symbol函數(shù)可以接受一個字符串作為參數(shù),表示對Symbol實(shí)例的描述勺届,主要是為了在控制臺顯示驶俊,或者轉(zhuǎn)為字符串時,比較容易區(qū)分免姿。
let name=Symbol('name'); let name2=Symbol('name'); console.log(name===name2) false
2:作為屬性名的Symbol
var mySymbol = Symbol();
第一種寫法
var a = {}; a[mySymbol] = 'Hello!';
第二種寫法
var a = {[mySymbol]: 'Hello!'};
第三種寫法
var a = {}; Object.defineProperty(a, mySymbol, { value: 'Hello!' });
// 以上寫法都得到同樣結(jié)果
a[mySymbol] // "Hello!"
Symbol值作為屬性名時饼酿,該屬性還是公開屬性,不是私有屬性。
注意故俐,Symbol值作為對象屬性名時想鹰,不能用點(diǎn)運(yùn)算符。
3:獲取屬性值
let name= Symbol('name');
let name1= Symbol('name1');
let obj={
age:22,
[name]:'Leo',
[name1]:'Leoasd'
};
/*不可以打印出Symbol屬性
console.log(Object.keys(obj));
for(let i in obj){
console.log(k)
}
console.log(Object.getOwnPropertyNames(obj))`*/
getOwnPropertySymbols返回對象的自有符號屬性药版。對象的自有符號屬性是指直接在此對象
上定義辑舷、而非從對象的原型繼承的屬性。
let key=Object.getOwnPropertySymbols(obj); //[Symbol(name),Sumbol (name1)]
console.log(obj[key[0]]);
4:Symbol.for()槽片,Symbol.keyFor()
Symbol.for機(jī)制有點(diǎn)類似于單例模式何缓,首先在全局中搜索有沒有以該參數(shù)作為名稱的Symbol值,如果有还栓,就返回這個Symbol值歌殃,否則就新建并返回一個以該字符串為名稱的Symbol值。和直接的Symbol就點(diǎn)不同了蝙云。
//for 根據(jù)for 后面的值去創(chuàng)建前面name
let name=Symbol.for('name');
let name1=Symbol.for('name');
console.log(name===name1); 返回結(jié)果true
Symbol.keyFor方法返回一個已登記的Symbol類型值的key。實(shí)質(zhì)就是檢測該Symbol是否已創(chuàng)建
var s1 = Symbol.for("foo");
Symbol.keyFor(s1) // "foo"
var s2 = Symbol("foo");
Symbol.keyFor(s2) // undefined
·