1、基本常識(shí)
瀏覽器的組成:1)shell部分
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?2)內(nèi)核部分:(1)渲染引擎(語(yǔ)法規(guī)則和渲染)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? (2)js引擎
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? (3)其他模塊
JS特點(diǎn):1)解釋性語(yǔ)言
? ? ? ? ? ? ? ? 2)單線程(同步、異步)
? ? ? ? ? ? ? ? 3)ECMA標(biāo)注
JS執(zhí)行隊(duì)列:輪轉(zhuǎn)時(shí)間片(類(lèi)似吃法)
主流瀏覽器? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 內(nèi)核
IE? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ????trident
Chrome? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? webkit/blink
firefox? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?Gecko
Opera? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? presto????
Safari? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?webkit
2、基本語(yǔ)法
1、數(shù)據(jù)類(lèi)型:1)原始值:Number? ? Boolean? ? String? ? undefined? ? null
? ? ? ? ? ? ? ? ? ? ? ? ? ?2)引用值:array? ? Object? ? function? ? ...date? ? RegExp
2、"+"的作用:1)數(shù)學(xué)運(yùn)算? ? 2)字符串鏈接:任何數(shù)據(jù)類(lèi)型加字符串都等于字符串
3、邏輯運(yùn)算符:? ? &&? ? ||? ? !
????????3.1? ? &&運(yùn)算符:只有前后兩個(gè)表達(dá)式的情況,如果第一個(gè)表達(dá)式的結(jié)果為true,那么直接返回第二個(gè)表達(dá)式的結(jié)果。如果第一個(gè)表達(dá)式的結(jié)果為false時(shí),直接返回第一個(gè)表達(dá)式的值(undefined、null、NaN、""、0、false的布爾值為false)。
? ?具體應(yīng)用:短路語(yǔ)句
? ? ? var data = ...;
? ? ? data????&&? ? function(data)
????????3.2? ? ||運(yùn)算符:只有前后兩個(gè)表達(dá)式的情況,如果第一個(gè)表達(dá)式的結(jié)果為true,那么直接返回第一個(gè)表達(dá)式的結(jié)果。遇見(jiàn)true就返回。
具體應(yīng)用:瀏覽器兼容問(wèn)題(IE瀏覽器和非IE瀏覽器的兼容)
div.onclick = function(e) {
var event = e || window.event;
}
????????3.3? ? !運(yùn)算符:轉(zhuǎn)換成布爾值再取反
4、if? ? ?else? ? for
通過(guò)幾個(gè)實(shí)例來(lái)了解。
計(jì)算2的N次冪
????var n = parseInt(window.prompt('輸入:'));
????var count = 1;
????if (n == 0) {????????console.log(count);????} else {? ? ? ??
? ? for (var i = 1; i <= n; i++) {????????????count *= 2;????????}????????
? ?console.log(count);????}
遞歸計(jì)算N的階乘
function factorial(number) {?
?if (number == 0 || number == 1) {????????????return 1;????????}
else {????????????return number * factorial(number - 1);????????}?
}
斐波那契額數(shù)列
var n = parseInt(window.prompt('輸入:'));????
var? ?first = 1,
????????second = 1,
????????third;????
if (n == 1 || n == 2) {????????console.log("1");????}
else if (n >= 3) {
????????for (var i = 0; i < n - 2; i++)
????????????????{third = first + second;???????????
?????????????????first = second;????????????
????????????????second = third;}????????
console.log(third);????}
反向輸出一個(gè)三位數(shù)
var num = window.prompt("輸入:");
var str = "";?
for (var i = num.length - 1; i >= 0; i--){
?str +=i;????????}
console.log(str);
條件語(yǔ)句補(bǔ)充
switch case
var date = window.prompt('input');
switch(date) {
case "monday":
case "tuesday":
case "wednesday":
case "thursday":
case "friday":
? ? ? ? console.log("working");
? ? ? ? break;
case "saturday":
case "sunday":
? ? ? ? console.log("relaxing");
? ? ? ? break;
}
break:終止循環(huán)
continue:終止本次循環(huán),進(jìn)行下一個(gè)循環(huán)
5、typeof操作符:返回?cái)?shù)據(jù)是什么類(lèi)型的????????類(lèi)型轉(zhuǎn)換
? ? ? ? 5.1????六種數(shù)據(jù)類(lèi)型:number、string、boolean、undefined、object、function
? ? ? ? 5.2????顯示類(lèi)型轉(zhuǎn)化
? ? ? ? ? ? ? ? 1)String(mix)、Boolean(mix)、Number(mix):把對(duì)象轉(zhuǎn)換成字符串/布爾/數(shù)字類(lèi)型
? ? ? ? ? ? ? ? 2)parseInt(string,radix):1)把對(duì)象轉(zhuǎn)換成整型數(shù)字
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?2)有兩個(gè)參數(shù)的時(shí)候,以目標(biāo)進(jìn)制(第二個(gè)參數(shù))為基底,轉(zhuǎn)化成10進(jìn)制
? ? ? ? ? ? ? ? 3)parseFloat(只有一個(gè)參數(shù)):把對(duì)象轉(zhuǎn)換成浮點(diǎn)類(lèi)型數(shù)字
? ? ? ? ? ? ? ?4)toString(radix):1)把對(duì)象轉(zhuǎn)換成字符串,用法與String不同? ? ? ? xxx.toString();
? ? ? ? ? ? ? ????????? ? ? ????????? ? ? ? ????????? ? undefined和null不能用toString方法
? ? ? ? ? ? ? ? ????????? ? ? ? ? ????????????? ????2)以10進(jìn)制為基底,轉(zhuǎn)化成目標(biāo)進(jìn)制(參數(shù))
? ? ? ? 5.3隱式類(lèi)型轉(zhuǎn)化(內(nèi)部都是調(diào)用顯示類(lèi)型轉(zhuǎn)化)
? ? ? ? ? ? ? ? 1)isNaN():判斷一個(gè)數(shù)是不是NaN,返回boolean值(調(diào)用Number轉(zhuǎn)化成數(shù)字再判斷)
? ? ? ? ? ? ? ? 2)++/--/+/-(一元正負(fù)):轉(zhuǎn)化成數(shù)字類(lèi)型(調(diào)用Number轉(zhuǎn)化成數(shù)字)
? ? ? ? ? ? ? ? 3)+號(hào):當(dāng)加號(hào)兩邊有一個(gè)是string類(lèi)型,就會(huì)調(diào)用String,把另一個(gè)也轉(zhuǎn)化成字符串類(lèi)型
? ? ? ? ? ? ? ? 4)+-*/:調(diào)用Number轉(zhuǎn)化成數(shù)字類(lèi)型
? ? ? ? ? ? ? ? 5)&&? ? ||? ? !:調(diào)用boolean進(jìn)行類(lèi)型轉(zhuǎn)化
? ? ? ? ? ? ? ? 6)== != < > <= >=:返回boolean值
? ? ? ? 5.4特殊:undefined == null? ? 返回true? ? ? ? ? ? ? ? NaN == NaN? ? 返回false(NaN跟誰(shuí)都不等)
? ? ? ? 5.5typeof返回的數(shù)據(jù)類(lèi)型的類(lèi)型是String類(lèi)型
6、函數(shù)
????????6.1函數(shù)聲明:function test() {}
????????6.2函數(shù)表達(dá)式(匿名函數(shù)表達(dá)式):var demo = function () {}
arguments是一個(gè)存放實(shí)參的數(shù)組
實(shí)現(xiàn)累加
function sum() {
????????var result = 0;
????????for (var i = 0; i < arguments.length; i++) {
? ? ? ? result += arguments[i];????????}
????????console.log(result);
????????return; //1、終止函數(shù) 2、返回值????}?
???????sum(1, 2, 3, 4, 5, 6, 7, 8, 9);
7、作用域
????????7.1????函數(shù)的屬性:[[scope]],里面存放的是函數(shù)的作用域,是一個(gè)隱式的屬性
? ? ? ? 7.2? ? 執(zhí)行期上下文(AO和GO):函數(shù)的每次執(zhí)行都會(huì)產(chǎn)生一個(gè)執(zhí)行期上下文,函數(shù)執(zhí)行完畢后,執(zhí)行期上下文銷(xiāo)毀
? ? ? ? 7.4????作用域鏈:[[scope]]中所儲(chǔ)存的執(zhí)行期上下文對(duì)象的集合,呈鏈?zhǔn)芥溄?/p>
舉例
function a() {
????????????function b()
????????} {?
???????????var b = 234;
????????}?
???????var a = 123;
????????b();?
???????var glob = 100;?
???????a();
a函數(shù)被定義:a.[[scope]] --> 0 : GO{}
a函數(shù)執(zhí)行:a.[[scope]] --> 0 : AO{}????????
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?1 : GO{}?
b函數(shù)被定義:b的[[scope]]就是a的[[scope]]
b函數(shù)執(zhí)行: b產(chǎn)生一個(gè)AO{} 放在作用域鏈的頂端? ? ? ?
? ? ? ? ? ????????????????????????????????? ? ? ? 0 : b.AO{}
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?1 : a.AO{}????????
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?2 : a.GO{}
function a() {
????????????function b() {
????????????????function c() {}?
???????????????c();
????????????}?
???????????b();?
???????}?
???????a();
a函數(shù)被定義:a.[[scope]] --> 0 : GO
a函數(shù)執(zhí)行: a.[[scope]] --> 0 : a.AO ????????a函數(shù)執(zhí)行完,銷(xiāo)毀a.AO,再次執(zhí)行a函數(shù),new a.AO
????????????????????????????????????????????????????1 : GO
b函數(shù)被定義:b.[[scope]] --> 0 : a.AO
????????????????????????????????????????????????????? 1 : GO
b函數(shù)執(zhí)行: b.[[scope]] --> 0 : b.AO????b函數(shù)執(zhí)行完,銷(xiāo)毀b.AO,再次執(zhí)行b函數(shù),new b.AO
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?1 : a.AO
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?2 : GO
c函數(shù)被定義: c[[scope]] --> 0 : b.AO
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 1 : a.AO
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 2 : GO
c函數(shù)執(zhí)行: c[[scope]] -->0 : c.AO???????c函數(shù)執(zhí)行完,銷(xiāo)毀c.AO,再次執(zhí)行c函數(shù),new c.AO
????????????????????????????????????????????????1 : b.AO
????????????????????????????????????????????????2 : a.AO
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 3 : GO
8、預(yù)編譯
? ? ? ? 8.1? ? 預(yù)編譯是發(fā)生在函數(shù)執(zhí)行的前一刻
? ??????函數(shù)聲明 ???????? 整體提升
????????變量? ? ? ? ? ? ? ? ? ?聲明提升(提升 = 優(yōu)先執(zhí)行)
? ? ? ? 8.2????任何變量未經(jīng)聲明,直接賦值,此變量就為全局對(duì)象所有
? ? ? ? 8.3????一切聲明的全局變量,都是window的屬性(window就是全局的域)
? ? ? ? 8.4? ? 預(yù)編譯的步驟
? ? ? ? ????????8.4.1? ?1)創(chuàng)建AO對(duì)象
? ? ? ? ? ? ? ? ? ? ? ? ? ? 2)找形參和變量聲明,將變量和參數(shù)名作為AO的屬性名,值為undefined
? ? ? ? ? ? ? ? ? ? ? ? ? ? 3)將實(shí)參值和形參統(tǒng)一
? ? ? ? ? ? ? ? ? ? ? ? ? ? 4)在函數(shù)體里面找函數(shù)聲明,值賦予函數(shù)體
舉例:
????function fn(a) {
????????console.log(a);
????????var a = 123;
????????console.log(a);
????????function a() {}
????????console.log(a);
????????var b = function() {}
????????console.log(b);?
???}
????????fn(1);
AO {
????????a : undefined, -->1-->function a (){}-->123?
???????b ; undefined -->function (){}
????}
function test(a, b) {
????????console.log(a);?
???????c = 0;
????????var c;
????????a = 3;
????????b = 2;
????????console.log(b);
????????function b() {}
????????function d() {}
????????console.log(b);
????}
????test(1);
AO {
???? ???a : undefined,-->1 --> 3?
???????b : undefined,-->function b () {}-->2
????????c : undefined,-->0
????????d : undefined-->function d () {}
????}
function test() {
????????console.log(a); //function a () {}
????????console.log(b); //undefined?
????????var b = 234;
????????console.log(b); //234
????????a = 123;
????????console.log(a); //123
????????function a() {}
????????var a;
????????b = 234;?
???????var b = function() {}?
???????console.log(a); //123
????????console.log(b); //function () {}
????}???? test(1);
console.log(test);?
????function test(test) {
????????console.log(test);?
????????var test = 234;?
???????console.log(test);?
????????function test() {}
????}?
???test(1);
????var test = 123;
????console.log(test);
GO {?
???????test: ????undefined-- > function test(test) {? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? ? ? console.log(test); //function test () {}?
? ? ? ? ? ? ? ? ? ? var test = 234;???????????????????????????????????????????????????????????????????????????????-- > 123???????????????????????????
????????????????????console.log(test); //234
????????????????????function test() {}
????????????????????}
????????????}
AO {
????????test: undefined-- > 1-- > function test() {}-- > 234
???? }
a = 100;?
???????console.log(a);//100?
???????function fn () {
????????????console.log(a);//undefined
????????????a = 200;
????????????console.log(a);//200
????????????var a = 300;
????????????console.log(a);//300
????????}?
???????fn();
????????var a;
GO {
????????????a : undefined--> 100?
???????}
AO {
????????????a : undefined --> 200 --> 300
????????}
百度面試題
function bar() {
????????return foo; //直接返回,后面的賦值語(yǔ)句不執(zhí)行
????????foo = 10;?
???????function foo() {}?
???????var foo = 11;
????}
????console.log(bar());
AO {
????????bar : undefined --> function foo () { ....}
????}
百度面試題
console.log(bar());
????function bar() {
????????foo = 10;
????????function foo() {}
????????var foo = 11;
????????return foo;?
???}
AO {
????????bar : undefined --> 10 --> function foo () {...} --> 11
????}
a = 100;
????function demo(e) {
????????function e () {}
????????arguments[0] = 2;
????????console.log(e);//2
????????if (a) {//a = undefined 不執(zhí)行 //if 里面不允許聲明function
? ? ? ? ?var b = 123;
? ? ? ? ?function c() {}
}
????????var c;
????????a = 10;?
???????var a;?
???????console.log(b);//undefined?
???????f = 123;
????????console.log(c);//undefined
????????console.log(a);//10
????}
????var a ;
????demo(1);
????console.log(a);//100 這里的a是全局變量
????console.log(f);//123
GO {
????????a : undefined --> 100
????????demo : undefined --> function () {}
????????f :undefined --> 123
????}
AO {
????????e : undefined --> 1 -->function e () {} --> 2?
???????c : undefined
????????b : undefined
????????a : undefined --> 10
????}
9、立即執(zhí)行函數(shù)
????????9.1? ? 目的:1)防止浪費(fèi)空間,執(zhí)行一次就立即釋放
? ? ? ? ? ? ? ? ? ? ? ????? ? 2)針對(duì)初始化功能的函數(shù)
? ? ? ? 9.2? ? 形式:建議用第一種形式
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 1)(function () {}())? ??
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 2)(function () {})()
幾點(diǎn)說(shuō)明:1.只有表達(dá)式才能被執(zhí)行符號(hào)執(zhí)行(函數(shù)表達(dá)式可以被執(zhí)行,但是函數(shù)聲明不可以)
? ? ? ? ? ? ? ? ? ? 2.被執(zhí)行符號(hào)執(zhí)行的表達(dá)式,會(huì)自動(dòng)忽略函數(shù)的名稱(chēng)
? ? ? ? ? ? ? ? ? ? 3.只要能變成表達(dá)式,就能被執(zhí)行符號(hào)執(zhí)行
可被執(zhí)行的例子:
var num = (function(a, b) {//返回的值給了num
????????var c = a + b;
????????return c;
????}(1, 2));
不可被執(zhí)行的例子:
function test() {?
???????var a = 123;
????????console.log(a);?
???} //函數(shù)聲明,所以它不能被執(zhí)行符號(hào)執(zhí)行
????test();
面試題
說(shuō)明:逗號(hào)(,)操作符,(2, 3)先看前面的表達(dá)式,如果前面的表達(dá)式需要計(jì)算的先計(jì)算,然后再計(jì)算后面的表達(dá)式,如果后面的表達(dá)式需要計(jì)算的話,就計(jì)算后面的表達(dá)式,都計(jì)算完之后,把后面的表達(dá)式的計(jì)算結(jié)果返回回去。
var f = (
???????? function f() {
???????? ????return "1";
???????? },?
??????? function g() {?
??????? ????return 2;
???????? }
????????)();
????????console.log(typeof f);
10、閉包
? ? ? ? 10.1? ? 閉包的形成:兩個(gè)或多個(gè)函數(shù)互相嵌套,把里面的函數(shù)保存到了外面函數(shù)的外部,形成閉包。
? ? ? ? 10.2? ? 閉包的效果:讓局部的函數(shù)保存到全局
? ? ? ? 10.3? ? 閉包的危害:閉包會(huì)導(dǎo)致原有的作用域鏈不被釋放,造成內(nèi)存泄漏
? ? ? ? 10.4? ? 閉包的作用:
? ? ? ? ? ? ? ? 1)? ? 實(shí)現(xiàn)公有變量(函數(shù)累加器)
function add() {?
???????var count = 0;?
???????function demo() {
????????????count++;
????????????console.log(count);
????????}
????????return demo;//將demo函數(shù)保存到add函數(shù)外部
????}
????var counter = add();
????counter();
????counter();
執(zhí)行幾次,就進(jìn)行幾次的累加。
? ? ? ? ? ? ? ? 2)可以做緩存(存儲(chǔ)結(jié)構(gòu))
function eater() {
????????var food = "";
????????var obj = {
????????????eat: function() {
????????????????console.log("i am eating " + food);
????????????????food = "";
????????????},
????????????push: function(myFood) {?
???????????????food = myFood;
????????????}
????????}
????????return obj; //返回了eat和push,都和eater形成了閉包
????}
????var eater1 = eater();
????eater1.push('banana');
????eater1.eat();
????????????????3)可以實(shí)現(xiàn)封裝,屬性私有化
????????????????4)模塊化開(kāi)發(fā),防止污染全局變量
閉包的例子:
按順序打印出0~9
function test() {
????????var arr = []; //arr數(shù)組里存儲(chǔ)了10個(gè)函數(shù)
????????for (var i = 0; i < 10; i++) {
????????????arr[i] = function() {
????????????????document.write(i + " "); //賦值語(yǔ)句,這個(gè)函數(shù)在這里不會(huì)執(zhí)行,只有在執(zhí)行函數(shù)的時(shí)候才會(huì)看函數(shù)內(nèi)部的內(nèi)容
????????????}
????????}
????????return arr;
????}
????var myArr = test();
????for (var j = 0; j < 10; j++) {
????????myArr[j](); //在這里執(zhí)行 arr[i] = function() { document.write (i + " ");},執(zhí)行的時(shí)候去判斷i的值
????}????
以上代碼的顯示結(jié)果不正確,通過(guò)立即執(zhí)行函數(shù)來(lái)解決
function test() {
????????var arr = [];
????????for (var i = 0; i < 10; i++) {
????????????(function(j) {
????????????????arr[j] = function() {
????????????????????document.write(j + " ");
????????????????}
????????????}(i));
????????}
????????return arr;
????}
????var myArr = test();
????for (var j = 0; j < 10; j++) {
????????myArr[j]();
????}
11、對(duì)象
var ZhangSan = {
????????????name: "ZhangSan",
????????????age: 22,
????????????sex: "male",
????????????health: 100,
????????????somke: function () {
????????????????console.log("i am somking!");
????????????????this.health--;
????????????},
????????????ball: function () {
????????????????console.log("i am playing ball");
????????????????this.health++;
????????????}
????????}
????????ZhangSan.apet = "計(jì)算機(jī)系"; //添加屬性
????????console.log(ZhangSan.sex); //查看屬性
????????ZhangSan.age = 21; //修改屬性
????????delete ZhangSan.sex; //刪除屬性
? ? ? ? 當(dāng)一個(gè)對(duì)象的屬性沒(méi)聲明就訪問(wèn),會(huì)返回undefined
? ? ? ? 11.1? ? 對(duì)象的創(chuàng)建方法
? ? ? ? ? ? ? ? 1)var obj = {}??????plainObject?????對(duì)象字面量/對(duì)象直接量
? ? ? ? ? ? ? ? 2)構(gòu)造函數(shù)創(chuàng)建方法:(1)系統(tǒng)自帶的構(gòu)造函數(shù)? ?
????????????????????????????????????????????????????????????????new Object();Arrary();Number();Boolean();String();Date();
? ??????????????????????????????????????????????????????????????var obj = new Object();<==>var obj = {};
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? (2)自定義
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ????? ? function Person() {}
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ????? ? var person = new Person();
? ? ? ? 11.2? ? 構(gòu)造函數(shù)命名規(guī)則:大駝峰式命名規(guī)則???TheFirstName
? ??????????????????函數(shù)命名規(guī)則??小駝峰式命名規(guī)則????theFirstName
? ? ? ? 11.3? ? 自定義構(gòu)造函數(shù)
? ?????????????????構(gòu)造函數(shù)內(nèi)部原理(new)
? ? ? ? ? ? ? ? ? ? (1)在函數(shù)體最前面隱式的加上this = {}
????????????????????(2)執(zhí)行 this.xxx = xxx;
????????????????????(3)隱式的返回this
function Car(color) {
? ? ? ? ? ? //var this = {
? ? ? ? ? ? ? ? ? ? name : "xxx";
? ? ? ? ? ? ? ? ? ? height : "xxx";
? ? ? ? ? ? ? ? ? ? ...
};??
????????????this.color = color;
????????????this.name = "BMW";
????????????this.height = "1400";?
???????????this.lang = "4900";
????????????this.weight = 1000;?
???????????this.health = 100;
????????????this.run = function () {
????????????this.health--;
????????????}
? ? ? ? ? ? //return this;
????????}
????????var car = new Car("red");
????????var car1 = new Car("yellow");
function Person(name, height) {
????????????//var this = {}?
???????????this.name = name;
????????????this.height = height;
????????????this.say = function () {
????????????????console.log(this.say);
???????????? }
???????????? return 123;//除了對(duì)象類(lèi)型,返回其他任何類(lèi)型的原始值都會(huì)轉(zhuǎn)化成對(duì)象類(lèi)型
???????????? //return this;
????????}
? ? ? ? console.log(new Person('xiaowang', 180).name);
????????var person1 = new Person('xiaoliu', 175);
? ? ? ? 幾點(diǎn)說(shuō)明:1)構(gòu)造函數(shù)特點(diǎn):命名大駝峰式
? ? ? ? ? ? ? ? ? ? ? ? ? ? 2)構(gòu)造函數(shù)創(chuàng)建對(duì)象必須通過(guò)new關(guān)鍵字
12、包裝類(lèi)
? ? ? ? 12.1? ? 原始值不可能有屬性和方法,對(duì)象才有屬性和方法(對(duì)象包括object、數(shù)組、function)
? ? ? ? 12.2? ? 原始值不能操作屬性,只能通過(guò)包裝類(lèi)操作
var num = 123;//這個(gè)num是原始值,是沒(méi)有屬性和方法的
var num = new Number(123);//數(shù)字對(duì)象可以操作屬性,也可以進(jìn)行運(yùn)算,但是在運(yùn)算之后就變成了數(shù)字類(lèi)型的了
同樣的還有String和Boolean
var str = new String('abcd');//字符串對(duì)象
var bol = new Boolean('true');//布爾對(duì)象
通過(guò)包裝類(lèi)操作之后,可以操作以上變量的方法
num.abc = "abc";
str.abcd = "abcd";
undefined和null不可以
? ? ? ? 12.3? ? 隱式的發(fā)生包裝類(lèi)
var num = 4;
num.len = 3;
//隱式發(fā)生? ? new Number(4).len = 3;? ? ? ? 在完成之后會(huì)自動(dòng)刪除len(delete)
console.log(num.len);
包裝類(lèi)的例子:
var str = "abc";
str += 1; //'abc1'
var test = typeof (str); //test = "String"
if (test.length == 6) {
test.sign = "typeof的返回結(jié)果可能為String";
//new String(test).sign = 'xxx' ???? 調(diào)用包裝類(lèi)賦值給原始值
}
//重新new String(test).sign? ? ? 但是沒(méi)有賦值
console.log(test.sign);//undefined