一、對象
<!DOCTYPE html>
<html><head><meta charset="UTF-8"><title></title><script type="text/javascript">/** JS中數據類型* String 字符串* Number 數值* Boolean 布爾值* Null 空值* Undefined 未定義* 以上這五種類型屬于基本數據類型,以后看到的值只要不是上邊的5種,全都是對象* * Object 對象* * 基本數據類型都是單一的值"hello" 123 true,* 值和值之間沒有任何的聯系。* * 在JS中來表示一個人的信息(name gender age):* var name = "孫悟空";* var gender = "男";* var age = 18;* 使用基本數據類型所創建的變量都是獨立,不能成為一個整體。* * 對象屬于一種復合的數據類型,在對象中可以保存多個不同數據類型的屬性。* * 對象的分類:* 1.內建對象* 由ES標準中定義的對象,在任何的ES的實現中都可以使用* 比如:Math String Number Boolean Function Object....* * 2.宿主對象* 由JS的運行環境提供的對象,目前來講主要指由瀏覽器提供的對象* 比如 BOM DOM* * 3.自定義對象* 由開發人員自己創建的對象*///創建對象/** 使用new關鍵字調用的函數,是構造函數constructor* 構造函數是專門用來創建對象的函數* 使用typeof檢查一個對象時,會返回object*/var obj = new Object();/** 在對象中保存的值稱為屬性* 向對象添加屬性* 語法:對象.屬性名 = 屬性值;*///向obj中添加一個name屬性obj.name = "孫悟空";//向obj中添加一個gender屬性obj.gender = "男";//向obj中添加一個age屬性obj.age = 18;/** 讀取對象中的屬性* 語法:對象.屬性名* 如果讀取對象中沒有的屬性,不會報錯而是會返回undefined*/console.log(obj.gender);console.log(obj.hello);/** 修改對象的屬性值* 語法:對象.屬性名 = 新值*/obj.name = "tom";/** 刪除對象的屬性* 語法:delete 對象.屬性名*/delete obj.name;console.log(obj.age);</script></head><body></body>
</html>
二、對象的屬性名和屬性值
<!DOCTYPE html>
<html><head><meta charset="UTF-8"><title></title><script type="text/javascript"> var obj = new Object();/** 向對象中添加屬性* 屬性名:* 對象的屬性名不強制要求遵守標識符的規范,什么亂七八糟的名字都可以使用* 但是使用是還是盡量按照標識符的規范去做*/obj.name = "孫悟空";obj.var = "hello";console.log(obj.name)console.log(obj.var)/** 如果要使用特殊的屬性名,不能采用.的方式來操作* 需要使用另一種方式:* 語法:對象["屬性名"] = 屬性值* 讀取時也需要采用這種方式* * 使用[]這種形式去操作屬性,更加的靈活,* 在[]中可以直接傳遞一個變量,這樣變量值是多少就會讀取那個屬性*/obj["123"] = 789;obj["nihao"] = "你好";var n = "nihao";console.log(obj["123"]);console.log("-------->"+obj[n])/** 屬性值* JS對象的屬性值,可以是任意的數據類型,甚至也可以是一個對象*/ obj.test = true;obj.test = null;obj.test = undefined;//創建一個對象var obj2 = new Object();obj2.name = "豬八戒";//將obj2設置為obj的屬性obj.test = obj2;console.log(obj.test)console.log(obj.test.name);/** in 運算符* 通過該運算符可以檢查一個對象中是否含有指定的屬性,如果有則返回true,沒有則返回false* 語法:* "屬性名" in 對象*/console.log(obj.test2);//檢查obj中是否含有test2屬性console.log("test2" in obj);console.log("test" in obj);console.log("name" in obj);</script></head><body></body>
</html>
三、基本數據類型和引用數據類型
<!DOCTYPE html>
<html><head><meta charset="UTF-8"><title></title><script type="text/javascript"> /** 基本數據類型* String Number Boolean Null Undefined* * 引用數據類型* Object* * JS中的變量都是保存到棧內存中的,* 基本數據類型的值直接在棧內存中存儲,* 值與值之間是獨立存在,修改一個變量不會影響其他的變量* * 對象是保存到堆內存中的,每創建一個新的對象,就會在堆內存中開辟出一個新的空間,* 而變量保存的是對象的內存地址(對象的引用),如果兩個變量保存的是同一個對象引用,* 當一個通過一個變量修改屬性時,另一個也會受到影響*/var a = 123;var b = a;a++;console.log("a = "+a);console.log("b = "+b);var obj = new Object();obj.name = "孫悟空";var obj2 = obj;//修改obj的name屬性obj.name = "豬八戒";console.log(obj.name);console.log(obj2.name);//設置obj2為nullobj2 = null;console.log(obj);console.log(obj2);var c = 10;var d = 10;console.log(c == d);var obj3 = new Object();var obj4 = new Object();obj3.name = "沙和尚";obj4.name = "沙和尚";console.log(obj3);console.log(obj4);/** 當比較兩個基本數據類型的值時,就是比較值。* 而比較兩個引用數據類型時,它是比較的對象的內存地址,* 如果兩個對象是一摸一樣的,但是地址不同,它也會返回false*/console.log(obj3 == obj4);</script></head><body></body>
</html>
四、對象的字面量
<!DOCTYPE html>
<html><head><meta charset="UTF-8"><title></title><script type="text/javascript">//創建一個對象//var obj = new Object();/* 使用對象字面量來創建一個對象 */var obj = {};console.log(typeof obj);obj.name = "孫悟空";console.log(obj.name);/** 使用對象字面量,可以在創建對象時,直接指定對象中的屬性* 語法:{屬性名:屬性值,屬性名:屬性值....}* 對象字面量的屬性名可以加引號也可以不加,建議不加,* 如果要使用一些特殊的名字,則必須加引號* * 屬性名和屬性值是一組一組的名值對結構,* 名和值之間使用:連接,多個名值對之間使用,隔開* 如果一個屬性之后沒有其他的屬性了,就不要寫,*/var obj2 = {name:"豬八戒",age:13,gender:"男",test:{name:"沙僧"}};console.log(obj2);console.log(obj2.test);</script></head><body></body>
</html>
五、函數作為對象的屬性
<!DOCTYPE html>
<html><head><meta charset="UTF-8"><title></title><script type="text/javascript"> /** 創建一個對象* 向對象中添加屬性*/var obj = new Object();obj.name = "孫悟空";obj.age = 18;//對象的屬性值可以是任何的數據類型,也可以是個函數obj.sayName = function(){console.log(obj.name);};function fun(){console.log(obj.name);};console.log(obj.sayName);//調方法obj.sayName();//調函數fun();/** 函數也可以稱為對象的屬性,* 如果一個函數作為一個對象的屬性保存,* 那么稱這個函數是這個對象的方法* 調用這個函數就說調用對象的方法(method)* * 但是它只是名稱上的區別沒有其他的區別* */var obj2 = {name:"豬八戒",age:18,sayName:function(){console.log(obj2.name);}};obj2.sayName(); </script></head><body></body>
</html>
六、工廠方法創建對象
<!DOCTYPE html>
<html><head><meta charset="UTF-8"><title></title><script type="text/javascript">/** 創建一個對象*/var obj = {name:"孫悟空",age:18,gender:"男",sayName:function(){alert(this.name);}};/** 使用工廠方法創建對象,通過該方法可以大批量的創建對象*/function createPerson(name , age ,gender){//創建一個新的對象 var obj = new Object();//向對象中添加屬性obj.name = name;obj.age = age;obj.gender = gender;obj.sayName = function(){alert(this.name);};//將新的對象返回return obj;}/** 用來創建狗的對象*/function createDog(name , age){var obj = new Object();obj.name = name;obj.age = age;obj.sayHello = function(){alert("汪汪~~");};return obj;}var obj2 = createPerson("豬八戒",28,"男");var obj3 = createPerson("白骨精",16,"女");var obj4 = createPerson("蜘蛛精",18,"女");/** 使用工廠方法創建的對象,使用的構造函數都是Object* 所以創建的對象都是Object這個類型,* 就導致無法區分出多種不同類型的對象*///創建一個狗的對象var dog = createDog("旺財",3);console.log(dog);console.log(obj4); </script></head><body></body>
</html>
?