對(duì)象
在JavaScript里幾乎所有東西都是對(duì)象或者用起來像對(duì)象傻谁,理解了對(duì)象就能夠理解JavaScript瓷们。對(duì)象是一組有命名值(也稱為屬性)集合的容器。
- user
property | property value |
---|---|
living | true |
age | 20 |
gender | male |
以上“user”一詞是一組屬性名和對(duì)應(yīng)值得標(biāo)簽,這些屬性和值構(gòu)成了user申眼。然而,JavaScript不會(huì)用表格表達(dá)蝉衣,它是用對(duì)象來表達(dá)的括尸,將上述表格轉(zhuǎn)換成實(shí)際的JavaScript對(duì)象:
//方法一
var user = new Object();
user.living = true;
user.age = 20;
user.gender = 'male';
//方法二
var user = function user(living,age,gender) {
this.living = living;
this.age = age;
this.gender = gender;
}
對(duì)象只是屬性的容器,每個(gè)屬性都有一個(gè)名稱和一個(gè)值病毡。JavaScript采用具有具有命名值屬性的容器(即對(duì)象)濒翻;方法是包含F(xiàn)unction()對(duì)象的屬性,其目的是對(duì)函數(shù)內(nèi)部的對(duì)象進(jìn)行操作。
數(shù)組也是對(duì)象:
var myArray = new Array();
console.log(typeof myArray); //Object
JavaScript內(nèi)置對(duì)象構(gòu)造函數(shù)
JavaScript語言包含9個(gè)原生(或內(nèi)置)對(duì)象構(gòu)造函數(shù)肴焊,使用這些對(duì)象來構(gòu)建JavaScript語言前联。原生對(duì)象構(gòu)造函數(shù)是多方面表達(dá)的,即它們可以生成對(duì)象娶眷,也可以被用于促進(jìn)語言的編程約定的形成似嗤。如,函數(shù)是Function()構(gòu)造函數(shù)創(chuàng)建的對(duì)象届宠,作為構(gòu)造函數(shù)烁落,使用new關(guān)鍵字調(diào)用后,它們也可以用于創(chuàng)建其他對(duì)象豌注。
- Number()
- String()
- Boolean
- Object()
- Array()
- Function()
- Data()
- RegExp()
- Error()
Math對(duì)象是一個(gè)靜態(tài)對(duì)象伤塌,而不是構(gòu)造函數(shù)。Math只是一個(gè)由JavaScript設(shè)置的對(duì)象命名空間轧铁,用于存儲(chǔ)數(shù)學(xué)函數(shù)每聪。
原生對(duì)象也被成為“全局對(duì)象”。
JavaScript提供了叫做“字面量”的快捷方式——用于創(chuàng)建大多數(shù)原生對(duì)象齿风,而不必使用new這樣的方式药薯。大多數(shù)情況下,字面量語法與使用new操作符的效果相同救斑。但是也有例外:Number()童本、String()和Boolean()。
在針對(duì)字符串脸候、數(shù)字和布爾值使用字面量值時(shí)穷娱,只有在該值被視為對(duì)象的情況下才會(huì)創(chuàng)建實(shí)際的對(duì)象,如(var str = 'foo'.length)之前一直在使用原始數(shù)據(jù)類型。
原始值
"foo"运沦、true泵额、false,以及null和underfind等都被視為原始值茶袒,因?yàn)樗鼈兪遣豢杉?xì)化的梯刚。也就是說,它們就是它們薪寓,不可能像對(duì)象更為復(fù)雜亡资。與使用字面量語法創(chuàng)建值相反,使用new創(chuàng)建的String()向叉、Number()或Boolean() 創(chuàng)建的對(duì)象實(shí)際上是一個(gè)復(fù)雜的對(duì)象锥腻。
var str1 = 'hello';
var str2 = new String('hello');
console.log(str1===str2); //false
原始值不是對(duì)象。原始值的特殊之處在于它們是用于表示簡(jiǎn)單值母谎。原始值是按值存儲(chǔ)的瘦黑,而復(fù)雜值是按引用來存儲(chǔ)的。
復(fù)雜對(duì)象
復(fù)雜對(duì)象里存儲(chǔ)的并不是簡(jiǎn)單的值,而是該對(duì)象的引用幸斥,所以匹摇,試圖復(fù)制一個(gè)復(fù)雜對(duì)象的時(shí)候并不是真正的復(fù)制了這個(gè)對(duì)象的值,而是獲取了該對(duì)象的引用甲葬。
let user1 = {
name : 'wcry',
age : 20,
gender : 'male'
};
let user2 = user1;
console.log(user1,user2); //name = 'wcry'
user2.name = 'wsmile';
console.log(user1,user2); //name = 'wsmile'
typeof操作符
typeof操作符返回變量的類型廊勃,但是有的時(shí)候比較特殊,需要注意经窖。以下為特例:
let myNull = null;
let myUnderfined = undefined;
let myFunction = new Function('x','y','return x+y');
let myRegExp = new RegExp('\\bt[a-z]+\\b');
console.log(typeof myNull); //object
console.log(typeof myUnderfined); //undefined
console.log(typeof myFunction); //function
console.log(typeof myRegExp); //Object