JS入門(mén)和ECMAScript

一枯夜、簡(jiǎn)介
1、什么是JavaScript
JavaScript是一種具有面向?qū)ο竽芰Φ募枭健⒔忉屝统绦蛟O(shè)計(jì)語(yǔ)言湖雹。更具體一點(diǎn),它是基于對(duì)象和事件驅(qū)動(dòng)曙搬、并具有相對(duì)安全性的客戶(hù)端腳本語(yǔ)言摔吏。它的主要目的是,驗(yàn)證發(fā)往服務(wù)器端的數(shù)據(jù)纵装、增加Web互動(dòng)征讲,加強(qiáng)用戶(hù)體驗(yàn)度等。
HTML標(biāo)記語(yǔ)言混合使用的腳本語(yǔ)言
編寫(xiě)的程序可以直接在瀏覽器中解釋執(zhí)行
Javascript的國(guó)際標(biāo)準(zhǔn)是ECMAScript
用來(lái)給HTML網(wǎng)頁(yè)添加動(dòng)態(tài)功能
網(wǎng)景公司的Brendan Eich設(shè)計(jì)
ECMAScript橡娄,文檔對(duì)象模型DOM,瀏覽器對(duì)象模型BOM
當(dāng)JS代碼運(yùn)行的時(shí)候诗箍,如果沒(méi)有出現(xiàn)效果,請(qǐng)打開(kāi)瀏覽器控制臺(tái): F12-->console
2挽唉、組成
ECMAScript------JS的基本語(yǔ)法
DOM----------------文檔對(duì)象模型滤祖,如何操作頁(yè)面
BOM----------------瀏覽器對(duì)象模型,如何操作瀏覽器
3瓶籽、學(xué)習(xí)流程:
變量
運(yùn)算符
流程控制
方法匠童、函數(shù)
對(duì)象/類(lèi)
4、使用方式:

--行內(nèi)JS 
寫(xiě)在html標(biāo)簽中的js代碼
--內(nèi)部JS
寫(xiě)在<script type="text/javascript"></script>標(biāo)簽之間
可以放在html中的任意位置棘劣,一般放在<head>標(biāo)簽中或<body>標(biāo)簽中或<body>標(biāo)簽后
--外部JS
引入外部的js文件
<script type="text/javascript" src="js文件的路徑" ></script>
注:如果<script>標(biāo)簽中設(shè)置了src屬性俏让,此時(shí)寫(xiě)在<script>雙標(biāo)簽中的js代碼無(wú)效

二、變量和注釋
1茬暇、語(yǔ)句

--語(yǔ)句(statement)是為了完成某種任務(wù)而進(jìn)行的操作
--語(yǔ)句以分號(hào)結(jié)尾首昔,一個(gè)分號(hào)即表示一個(gè)語(yǔ)句結(jié)束。
--多個(gè)語(yǔ)句可以寫(xiě)在一行內(nèi)(不建議這么寫(xiě)代碼)糙俗,但是一行寫(xiě)多條語(yǔ)句時(shí)勒奇,
語(yǔ)句必須以分號(hào)結(jié)尾。
--表達(dá)式不需要分號(hào)結(jié)尾巧骚。一旦在表達(dá)式后面添加分號(hào)赊颠,則JavaScript引擎
就將表達(dá)式視為語(yǔ)句格二,這樣會(huì)產(chǎn)生一些沒(méi)有任何意義的語(yǔ)句

2、變量名的命名規(guī)則和規(guī)范

變量名不能出現(xiàn)特殊字符 (字母數(shù)字_$之外的都屬于特殊字符)
變量名不能是系統(tǒng)關(guān)鍵字
數(shù)字不能用字變量名的開(kāi)頭,_和$命名一般也不放在開(kāi)頭(放在開(kāi)頭都有一些特殊含義)
變量的長(zhǎng)度理論上沒(méi)有限制,但是不要特別長(zhǎng)
注意駝峰原則  
見(jiàn)名知意

2竣蹦、變量類(lèi)型
2.1顶猜、特點(diǎn)
JS是一種弱類(lèi)型的語(yǔ)言
變量在聲明的時(shí)候統(tǒng)一使用var
但是在具體使用的時(shí)候要注意變量的類(lèi)型
2.2、分類(lèi)
雖說(shuō) JS 是弱類(lèi)型語(yǔ)言痘括,變量沒(méi)有類(lèi)型长窄,但數(shù)據(jù)本身是有類(lèi)型的。
* 原生類(lèi)型

1)纲菌、數(shù)字:number
    整數(shù)類(lèi)型
    浮點(diǎn)類(lèi)型:帶有小數(shù)點(diǎn)
    無(wú)限大或者無(wú)限小|infinity
    NAN:Not A Number
        與任意數(shù)字進(jìn)行+-*/%都會(huì)把對(duì)方同化成NAN
        自己不等于自己挠日,更不會(huì)等于別人  
2)、字符串:string
    js中修飾字符串單雙引號(hào)都可以
    如果一個(gè)字符串沒(méi)有加單雙引號(hào)翰舌,那他就是一個(gè)變量

3)嚣潜、布爾類(lèi)型 boolean
    只有兩個(gè)值  true和false
    *  非原生類(lèi)型object
--對(duì)象(object)(引用) : 各種值組成的集合     
1)、對(duì)象(object){name:”zhangsan”,age:”18”} 
2)椅贱、數(shù)組(array)[1,2,3]     
3)懂算、函數(shù)(function)function test() {} 
--非原生類(lèi)型基本上都是由原生類(lèi)型構(gòu)成
--null——屬于一種比較特殊的對(duì)象類(lèi)型,他沒(méi)有指向?qū)ο笠固椋彩菍?duì)象類(lèi)型
--undefined——變量只聲明犯犁,未賦值

2.3、聲明
變量的聲明使用var

--先聲明再賦值
--聲明并賦值 
注:如果聲明變量時(shí)不使用var修飾符女器,則該變量是全局變量
--變量的注意點(diǎn):
1)若只聲明而沒(méi)有賦值酸役,則該變量的值為 undefined
2)變量要有定義才能使用,若變量未聲明就使用驾胆,JavaScript 會(huì)報(bào)錯(cuò)涣澡,告訴你變量未定義
3)可以在同一條 var 命令中聲明多個(gè)變量。
4)若使用 var 重新聲明一個(gè)已經(jīng)存在的變量丧诺,是無(wú)效的入桂。
5)若使用 var 重新聲明一個(gè)已經(jīng)存在的變量且賦值,則會(huì)覆蓋掉前面的值
6)JavaScript 是一種動(dòng)態(tài)類(lèi)型驳阎、弱類(lèi)型語(yǔ)言抗愁,也就是說(shuō),變量的類(lèi)型沒(méi)有限制呵晚,
可以賦予各種類(lèi)型的值

2.4蜘腌、數(shù)據(jù)類(lèi)型的比較和變量提升

變量提升:
JavaScript 引擎的工作方式是,先解析代碼饵隙,獲取所有被聲明的變量撮珠,然后再一行一行
地運(yùn)行。這造成的結(jié)果金矛,就是所有的變量的聲明語(yǔ)句芯急,都會(huì)被提升到代碼的頭部勺届,這就叫
做變量提升。只有通過(guò)var聲明的變量才會(huì)有變量提升

--比較
1)娶耍、==
如果比較的雙方為相同類(lèi)型免姿,直接進(jìn)行比較
如果比較的雙方為不同類(lèi)型,就要開(kāi)始轉(zhuǎn)型
同時(shí)向數(shù)字類(lèi)型靠攏
他們會(huì)默認(rèn)調(diào)用Number(var)的函數(shù)
undefinde也會(huì)被轉(zhuǎn)換成NAN  
2)伺绽、===
如果比較的雙方為相同類(lèi)型养泡,直接進(jìn)行比較
如果比較的雙方為不同類(lèi)型嗜湃,直接返回false

tips: 對(duì)象比較的時(shí)候比較的是內(nèi)存中的地址

2.5奈应、typeof
typeof 操作符是用來(lái)檢測(cè)數(shù)據(jù)類(lèi)型。對(duì)于值或變量使用 typeof 操作符會(huì)返回如下字符串:

字符串       描述 
undefined   未定義 
boolean     布爾值 
string      字符串 
number      數(shù)值 
object      對(duì)象或 null 
function    函數(shù)

2.6购披、變量類(lèi)型轉(zhuǎn)換
在 JS 數(shù)據(jù)類(lèi)型轉(zhuǎn)方法主要有三種:利用 js 變量弱類(lèi)型自動(dòng)轉(zhuǎn)換杖挣、轉(zhuǎn)換函數(shù)、強(qiáng)制類(lèi)型轉(zhuǎn)換刚陡。
* 自動(dòng)轉(zhuǎn)換

值                 字符串           數(shù)字           布爾值
undefined     "undefined"    NAN           false
null                "null"            0                  false
true               "true"            1                   true
false              "false"          0                  false
""(空字符串)  “”                  0                   false
“1.5”             "1.5"             1.5                true
"one"           "one"             NAN             true
0或-0           "0"                 0                  false
NAN            “NAN”           NAN              false
(-)Infinity    "(-)Infinity"     (-)Infinity        true
1                "1"               1                     true
    *  函數(shù)轉(zhuǎn)換
1)惩妇、parseInt()
--parseInt()在轉(zhuǎn)換之前,首先會(huì)分析該字符串筐乳,判斷位置為 0 處的字符歌殃,
判斷它是否 是個(gè)有效數(shù)字,如果不是蝙云,則直接返回 NaN氓皱,不再繼續(xù),如果是則繼續(xù)勃刨,
直到找到非字符 
--parseInt()方法還有基模式波材,可以把二進(jìn)制、八進(jìn)制身隐、十六進(jìn)制或其他任何進(jìn)制的字符串轉(zhuǎn)
換成整數(shù)廷区。基是由 parseInt()方法的第二個(gè)參數(shù)指定的 
--如果十進(jìn)制數(shù)包含前導(dǎo) 0贾铝,那么最好采用基數(shù) 10隙轻,這樣才不會(huì)意外地得到八進(jìn)制的值 
2)、parseFloat()方法與 parseInt()方法的處理方式相似垢揩,從位置 0 開(kāi)始查看每個(gè)字符玖绿,
 直到找到第一個(gè)非有效的字符為止,然后把該字 符之前的字符串轉(zhuǎn)換成數(shù)字水孩。不過(guò)镰矿,對(duì)于這
 個(gè) 方法來(lái)說(shuō),第一個(gè)出現(xiàn)的小數(shù)點(diǎn)是有效字符俘种。如果有兩個(gè)小數(shù)點(diǎn)秤标,第二個(gè)小數(shù)點(diǎn)將被看作
 無(wú)效 的绝淡,parseFloat()方法會(huì)把這個(gè)小數(shù)點(diǎn)之前的字符串轉(zhuǎn)換成數(shù)字。  
    *  顯式轉(zhuǎn)換
toString()函數(shù)將內(nèi)容轉(zhuǎn)換為字符串形式苍姜,其中 Number 提供的
toString()函數(shù)可以將數(shù)字以指定的進(jìn)制轉(zhuǎn)換為字符串牢酵,默認(rèn)為十進(jìn)制。
Number 還提供了 toFixed()函數(shù)將根據(jù)小數(shù)點(diǎn)后指定位數(shù)將數(shù)字轉(zhuǎn)為字符串衙猪,四舍五入
    *  強(qiáng)制轉(zhuǎn)換
--JS 為 Number馍乙、Boolean、String 對(duì)象提供了構(gòu)造方法垫释,用于強(qiáng)制轉(zhuǎn)換其他類(lèi)型的數(shù)據(jù)丝格。
此時(shí)操作的是整個(gè)數(shù)據(jù),而不是部分
Number(false)        0 
Number(true)         1 
Number(undefined)   NaN 
Number(null)         0 
Number( "5.5 ")     5.5 
Number( "56 ")      56 
Number( "5.6.7 ")   NaN 
Number(new Object())NaN 
Number(100)         100
Boolean(""); //false – empty string 
Boolean("hi"); //true – non-empty string 
Boolean(100); //true – non-zero number 
Boolean(null); //false - null 
Boolean(0); //false - zero 
Boolean(new Object()); //true – object 

--使用String強(qiáng)制轉(zhuǎn)換成字符串和調(diào)用 toString()方法的唯一不同之處在于棵譬,
對(duì) null 或 undefined 值強(qiáng)制類(lèi)型轉(zhuǎn)換可以生成字符串而不 引 發(fā)錯(cuò)誤:  
var s1 = String(null); //"null" var oNull = null; 
var s2 = oNull.toString(); //won’t work, causes anerro 

--最為簡(jiǎn)單的一種轉(zhuǎn)換為字符串的方式显蝌,直接在任意數(shù)據(jù)后面+ ""即可 

3、注釋
單行注釋?zhuān)河?/起頭订咸;
多行注釋?zhuān)悍旁?* 和 */之間曼尊。
兼容 html 注釋方式:
三、運(yùn)算符
1脏嚷、算術(shù)運(yùn)算符
+ - * /(整型/整型=?浮點(diǎn)型) %
++ --
++a 先+再用
a++ 先用再+
2骆撇、條件運(yùn)算符
> < >= <= !=
3、邏輯運(yùn)算符
&&:判斷的左右兩邊都需要為true
||:判斷的左右兩邊有一個(gè)為true即為true
4父叙、賦值運(yùn)算符
= += -= /= *= %=
5神郊、字符串運(yùn)算符 +
任意對(duì)象和字符串連接都會(huì)被同化成字符串
6、三目運(yùn)算符
表達(dá)式1?表達(dá)式2:表達(dá)式3
true:2
false:3
四高每、邏輯控制語(yǔ)句
1屿岂、if & switch
if —— 一般情況下優(yōu)先選擇if, 較適用于變值的情況
switch —— 一般很少使用鲸匿,較適用于定值的情況,而且有很多的限制
2爷怀、for循環(huán)
1)、循環(huán)執(zhí)行固定的代碼塊

for(語(yǔ)句1;語(yǔ)句2;語(yǔ)句3){
循環(huán)體4
}
1:初始值
2:判斷
3:迭代
循環(huán)順序:1243 243 243 243 243... 2--結(jié)束

2)带欢、中斷循環(huán)

continue;
中斷本次循環(huán)
break;
中斷當(dāng)前循環(huán)
當(dāng)多個(gè)循環(huán)嵌套使用的時(shí)候运授,也是中斷當(dāng)前循環(huán)

五、數(shù)組
1乔煞、概念
數(shù)組(array)是按次序排列的一組數(shù)據(jù)
數(shù)組內(nèi)部都是被整齊的分割吁朦,所以我們可以對(duì)他進(jìn)行隨機(jī)訪問(wèn)
通過(guò)他的下標(biāo)(index)進(jìn)行訪問(wèn),index的值從0開(kāi)始
在JS中只有一個(gè)Var類(lèi)型的數(shù)據(jù),所以數(shù)組可以存放任意數(shù)據(jù)渡贾,但是不推薦逗宜,會(huì)提高將來(lái)操作數(shù)據(jù)的難度
特點(diǎn):
數(shù)組的長(zhǎng)度是可變的
數(shù)組的類(lèi)型可以不一樣
不存在下標(biāo)越界
2、定義

--隱式創(chuàng)建
var 變量名 = [值1,值2,...];
--直接實(shí)例化
var 變量名 = new Array(值1,值2,...);
--實(shí)例化并指定長(zhǎng)度
var 變量名 = new Array(size);
--獲取數(shù)組的長(zhǎng)度
數(shù)組.length
--例
var a1 = new Array();
var a2 = new Array(10);
var a3 = new Array("lili", "nana", "huahua", "fangfang");
var a4 = [1, 2, 3, 4, 5, "aa", "bb", "cc", [1, 2, 3, 4, 5]];
--推薦使用 [ ]  

3、訪問(wèn)數(shù)組

1)纺讲、獲取值
數(shù)組[下標(biāo)],下標(biāo)從0開(kāi)始
如果下標(biāo)越界擂仍,返回undefined
遍歷數(shù)組的時(shí)候,從index=0 開(kāi)始 到index&lt;數(shù)組.length結(jié)束

2)熬甚、修改值
數(shù)組[下標(biāo)]=xxxx

3)逢渔、刪除值
底層的思想也是做數(shù)據(jù)遷移
a.splice(3, 2);

4)、新增值
添加到最后
a[a.length] = "ii";
a.push("LL");                   

5)乡括、插入到中間
for(var i = a.length; i > 3; i--) {
    a[i] = a[i - 1];
 }
a[3] = "zz";
*JS的數(shù)組長(zhǎng)度是可變的肃廓,可以通過(guò)改變長(zhǎng)度初始化數(shù)組中的值。

4诲泌、遍歷

數(shù)組的遍歷即依次訪問(wèn)數(shù)組的每一個(gè)元素 盲赊,JS 提供三種遍歷數(shù)組的方式:
--普通 for 循環(huán)遍歷
for(var i = 0; i < 數(shù)組名.length; i++) {
    
}
注:可以拿到undefinded的值,無(wú)法獲取數(shù)組中屬性對(duì)應(yīng)的值
--for ... in
for(var i in 數(shù)組) {
    // i是下標(biāo)或?qū)傩悦?}
注:無(wú)法拿到undefinded的值档礁,可以獲取數(shù)組中屬性對(duì)應(yīng)的值        
--foreach
數(shù)組.foreach(function(element,index){
    // element:元素角钩;index:下標(biāo)
});
注:無(wú)法獲取屬性對(duì)應(yīng)的值與undefinded的值
* for --  不遍歷屬性
* foreach -- 不遍歷屬性和索引中的 undefined
* for in -- 不遍歷索引中的 undefined

5、數(shù)組的方法

push 添加元素到最后
unshift 添加元素到最前
pop 刪除最后一項(xiàng)
shift 刪除第一項(xiàng)
reverse 數(shù)組翻轉(zhuǎn)
join 數(shù)組轉(zhuǎn)成字符串
indexOf 數(shù)組元素索引
slice 截壬肜健(切片)數(shù)組,原數(shù)組不發(fā)生變化
splice 剪接數(shù)組惨险,原數(shù)組變化羹幸,可以實(shí)現(xiàn)前后刪除效果
concat 數(shù)組合并

六、函數(shù)
1辫愉、函數(shù)也是對(duì)象
所以他的值可以被覆蓋栅受、修改
所以很多時(shí)候有可能會(huì)覆蓋到別人的函數(shù)
可以使用JSON來(lái)保護(hù)自己的函數(shù)
如果出現(xiàn)同名函數(shù),后面的函數(shù)會(huì)把前面的函數(shù)給覆蓋掉恭朗,類(lèi)似于對(duì)象的賦值
函數(shù)也是對(duì)象屏镊,函數(shù)可以被當(dāng)做實(shí)參在方法中進(jìn)行傳遞和調(diào)用
就是把實(shí)現(xiàn)某一功能的代碼放到一起,方便以后的調(diào)用和維護(hù)

2痰腮、定義和調(diào)用
* 函數(shù)的聲明

--函數(shù)聲明語(yǔ)句
function 函數(shù)名字(形參){
    方法體
    返回值
}
調(diào)用:函數(shù)名([實(shí)參]);

--函數(shù)定義表達(dá)式
var 變量名/函數(shù)名 = function([形參]){
    
}
調(diào)用:變量名([實(shí)參])/函數(shù)名([實(shí)參]);

--Function構(gòu)造函數(shù)
var 函數(shù)名 = new Function('參數(shù)1','參數(shù)2','函數(shù)的主體內(nèi)容');
調(diào)用:函數(shù)名([實(shí)參]);
注:構(gòu)造韓束的最后一個(gè)參數(shù)是函數(shù)體而芥。
                        
注意:
    js 中的函數(shù)沒(méi)有重載,同名的函數(shù)膀值,會(huì)被后面的函數(shù)覆蓋棍丐。
    js 中允許有不定數(shù)目的參數(shù),后面介紹 arguments 對(duì)象
    *  參數(shù)
函數(shù)運(yùn)行的時(shí)候沧踏,有時(shí)需要提供外部數(shù)據(jù)歌逢,不同的外部數(shù)據(jù)會(huì)得到不同的結(jié)果,這種外部
數(shù)據(jù)就叫參數(shù)翘狱,定義時(shí)的參數(shù)稱(chēng)為形參秘案,調(diào)用時(shí)的參數(shù)稱(chēng)為實(shí)參
--實(shí)參可以省略,那么對(duì)應(yīng)形參為 undefined
--若函數(shù)形參同名(一般不會(huì)這么干):在使用時(shí)以最后一個(gè)值為準(zhǔn)。
--可以給參數(shù)默認(rèn)值:當(dāng)參數(shù)為特殊值時(shí),可以賦予默認(rèn)值。
--參數(shù)為值傳遞于樟,傳遞副本 寝受;引用傳遞時(shí)傳遞地址,操作的是同一個(gè)對(duì)象
    *  函數(shù)的四種調(diào)用方式
--常用調(diào)用方式:
函數(shù)名([實(shí)參]);
存在返回值可以變量接收派歌,若接收無(wú)返回值函數(shù)則為 undefined
--函數(shù)調(diào)用模式
--方法調(diào)用模式
--call()和apply()
注:誰(shuí)調(diào)用函數(shù),this就指向誰(shuí)
                
匿名函數(shù)立即調(diào)用
(1)匿名函數(shù):function ([參數(shù)]){}
(2)調(diào)用:(function ([形參]) {})([實(shí)參]);
在函數(shù)只被使用一次的情況下可以使用這種方式,簡(jiǎn)便省事
    *  return
函數(shù)的執(zhí)行可能會(huì)有返回值黍少,需要使用 return 語(yǔ)句將結(jié)果返回。
return 語(yǔ)句不是必需的处面,如果沒(méi)有的話厂置,該函數(shù)就不返回任何值,或者說(shuō)返回 undefined魂角。
作用:在沒(méi)有返回值的方法中昵济,用來(lái)結(jié)束方法。
有返回值的方法中野揪,一個(gè)是用來(lái)結(jié)束方法访忿,一個(gè)是將值帶給調(diào)用者。

3斯稳、調(diào)用函數(shù)注意:

1)海铆、形參和實(shí)參數(shù)量不匹配的情況(JS)
不會(huì)報(bào)錯(cuò)
形參>實(shí)參 : 實(shí)參按照形參的數(shù)量依次賦值,不夠的相當(dāng)于未賦值 undefined
實(shí)參>形參: 實(shí)參按照形參的數(shù)量依次賦值,多余的就被舍棄掉了
如果形參過(guò)多挣惰,傳遞值給指定形參將會(huì)不方便
更好的策略——JSON

2)卧斟、函數(shù)的返回值問(wèn)題
一個(gè)函數(shù)可以有顯示的返回值也可以沒(méi)有顯示返回值
但是如果不寫(xiě)返回值,默認(rèn)返回undefined
可以強(qiáng)制結(jié)束當(dāng)前函數(shù)的執(zhí)行

3)憎茂、函數(shù)名的提升(了解)
JavaScript 引擎將函數(shù)名視同變量名珍语,所以采用 function 命令聲明函數(shù)時(shí),
整個(gè)函數(shù)會(huì)像變量聲明一樣竖幔,被提升到代碼頭部板乙。所以,下面的代碼不會(huì)報(bào)錯(cuò)
但是赏枚,如果采用賦值語(yǔ)句定義函數(shù)亡驰,JavaScript 就會(huì)報(bào)錯(cuò)。

4饿幅、arguments 對(duì)象和函數(shù)的方法及屬性
arguments對(duì)象可以得到函數(shù)的實(shí)參數(shù)量
函數(shù)名.name 得到函數(shù)名稱(chēng)
函數(shù)名.length 得到函數(shù)的形參數(shù)量
函數(shù)名.toString() 得到函數(shù)的源碼

function fn1 (a,b,c) {
    // arguments對(duì)象可以得到函數(shù)的實(shí)參數(shù)量
    console.log(arguments.length);
    console.log("函數(shù)....");
    console.log(arguments);
}
        
fn1(1,2);
    
console.log(fn1.name);
console.log(fn1.length);
console.log(fn1.toString());

5凡辱、函數(shù)的作用域
函數(shù)作用域:全局(global variable)和局部(local variable)
1)全局變量與局部變量同名問(wèn)題
2)在函數(shù)中定義變量時(shí),若沒(méi)有加 var 關(guān)鍵字栗恩,使用之后自動(dòng)變?yōu)槿肿兞?br> 3)變量作用域提升

var num = 1;
        
function fn() {
    var num = 10; // 這是個(gè)局部變量透乾,與全部變量毫無(wú)關(guān)系
    console.log(num); // 就近原則
    var b = 2; // 局部變量
    c = 3; // 不用var修飾符聲明的變量時(shí)全局變量
}

6、閉包
閉包的形成:
外部函數(shù)內(nèi)部嵌套內(nèi)部函數(shù)
內(nèi)部函數(shù)中使用外部函數(shù)的環(huán)境
3、外部函數(shù)返回內(nèi)部函數(shù)

閉包的作用:
獲取函數(shù)內(nèi)部的變量
保存變量的值在內(nèi)存中
避免變量名重復(fù)

// 1乳乌、外部函數(shù)內(nèi)部嵌套內(nèi)部函數(shù) 
function fn1() {
    var a = "Hello!";
    function fn2() {
    // 2捧韵、內(nèi)部函數(shù)中使用外部函數(shù)的環(huán)境
    console.log(a);
    }
    // 3、外部函數(shù)返回內(nèi)部函數(shù)
    return fn2;
}
        
var f = fn1();
console.log(f);
f();

七汉操、塊
JavaScript 使用大括號(hào)再来,將多個(gè)相關(guān)的語(yǔ)句組合在一起,稱(chēng)為“區(qū)塊”磷瘤。 與大多數(shù)編程語(yǔ)言不一樣芒篷,JavaScript 的區(qū)塊不構(gòu)成單獨(dú)的作用域。也就是說(shuō)采缚,區(qū)塊中的 變量與區(qū)塊外的變量针炉,屬于同一個(gè)作用域。

 { 
      var a = 10;
  } 
 console.log("a------>" + a);

上面的代碼扳抽,在區(qū)塊內(nèi)部聲明并賦值了變量 a篡帕,然后在區(qū)塊外部,變量 a 依然有效贸呢,這說(shuō) 明區(qū)塊不構(gòu)成單獨(dú)的作用域镰烧,與不使用區(qū)塊的情況沒(méi)有任何區(qū)別。所以贮尉,單獨(dú)使用的區(qū)塊在 JavaScript 中意義不大拌滋,很少出現(xiàn)。 區(qū)塊往往用來(lái)構(gòu)成其他更復(fù)雜的語(yǔ)法結(jié)構(gòu)猜谚,比如 for、if赌渣、while 等
八魏铅、對(duì)象
1、創(chuàng)建對(duì)象
對(duì)象的方法
對(duì)象的屬性

function factory(username, password, realname) {
    var obj = new Object();
    obj.username = username;
    obj.password = password;
    obj.realname = realname;
    return obj;
}

2坚芜、原型繼承
每創(chuàng)建一個(gè)函數(shù)览芳,該函數(shù)就會(huì)自動(dòng)帶有一個(gè) prototype 屬性。該屬性是個(gè)指針鸿竖,指向了一個(gè)對(duì)象沧竟,我們稱(chēng)之為 原型對(duì)象。
  原型對(duì)象上默認(rèn)有一個(gè)屬性 constructor缚忧,該屬性也是一個(gè)指針悟泵,指向其相關(guān)聯(lián)的構(gòu)造函數(shù)。
  通過(guò)調(diào)用構(gòu)造函數(shù)產(chǎn)生的實(shí)例闪水,都有一個(gè)內(nèi)部屬性糕非,指向了原型對(duì)象。所以實(shí)例能夠訪問(wèn)原型對(duì)象上的所有屬性和方法⌒喾剩 
  三者的關(guān)系是禁筏,每個(gè)構(gòu)造函數(shù)都有一個(gè)原型對(duì)象,原型對(duì)象都包含一個(gè)指向構(gòu)造函數(shù)的指針衡招,而實(shí)例都包含一個(gè)指向原型對(duì)象的內(nèi)部指針篱昔。實(shí)例通過(guò)內(nèi)部指針可以訪問(wèn)到原型對(duì)象,原型對(duì)象通過(guò)constructor指針始腾,又可以找到構(gòu)造函數(shù)州刽。

//人類(lèi)構(gòu)造函數(shù)
function Person(color, hair) {
    this.color = color;
    this.hair = hair;
    this.fav = ["范冰冰", "楊冪", "李毅"];
    
    this.eat = function() {
        alert("吃飯...");
        }
}
//學(xué)生類(lèi)
function Student(sno, name, gender, grade) {
    this.grade = grade;
    this.sno = sno;
    this.name = name;
    this.gender = gender;
    this.grade = grade;
    
    this.study = function() {
        alert(this.name + ":好好學(xué)習(xí),天天向上");
}

    this.toString = function() {
        return "[object Student]";
    }
}
//學(xué)生類(lèi)就繼承類(lèi)黃種人對(duì)象(原型繼承)
Student.prototype = new Person("yellow", "black");

function testObject() {
var stu1 = new Student(1, 'zs', 'm', 3);
var stu2 = new Student(2, 'ls', 'w', 2);

// 測(cè)試原型屬性的修改
// 如果直接修改原型屬性的值是允許的窘茁,但是修改地址不影響原型屬性的值

//  stu1.fav.push("韓紅");
// alert(stu1.fav + "----" + stu2.fav);  
// 輸出:"范冰冰", "楊冪", "李毅","韓紅----"范冰冰", "楊冪", "李毅","韓紅

// stu1.fav = ["王菲", "劉亦菲", "胡一菲"];
// alert(stu1.fav + "----" + stu2.fav); 
// 輸出:"王菲", "劉亦菲", "胡一菲"----"范冰冰", "楊冪", "李毅"
}
testObject();

九怀伦、內(nèi)置對(duì)象

Date:
//獲取
 getFullYear()年, getMonth()月, getDate()日,
 getHours()時(shí),getMinutes()分,getSeconds()秒
//設(shè)置
 setYear(), setMonth(), …
 toLoacaleString()
說(shuō)明:
    getMonth():得到的值:0~11(1 月~12 月)
   setMonth():設(shè)置值時(shí) 0~11
   toLocaleString():可根據(jù)本地時(shí)間把 Date 對(duì)象轉(zhuǎn)換為字符串,并返回結(jié)果山林。

十房待、JSON
定義
JSON(JavaScript Object Notation,JS 對(duì)象簡(jiǎn)譜)驼抹,是一種輕量級(jí)的數(shù)據(jù)交換格式桑孩。
JavaScript 標(biāo)記對(duì)象,json是一個(gè)對(duì)象

JS中一切數(shù)據(jù)皆對(duì)象框冀。
1流椒、定義對(duì)象
    JS 創(chuàng)建自定義對(duì)象,主要通過(guò)三種方式:
        字面量形式創(chuàng)建對(duì)象
            var 變量名 = {}; // 空對(duì)象
            var 變量名 = {鍵:值,....};
        通過(guò) new Object 對(duì)象創(chuàng)建 
            var 變量名 = new Object();
        通過(guò) Object 對(duì)象的 create 方法創(chuàng)建對(duì)象
            var 變量名 = Object.create(null或?qū)ο?;
2明也、對(duì)象的序列化和反序列化
    序列化即將 JS 對(duì)象序列化為字符串宣虾,反序列化即將字符串反序列化為 JS 對(duì)象。
JS 中通過(guò)調(diào)用 JSON 方法温数,可以將對(duì)象序列化成字符串绣硝,也可以將字符串反序列化成對(duì)
象 。
    序列化對(duì)象撑刺,將對(duì)象轉(zhuǎn)為字符串
        JSON.stringify(object)
    反序列化鹉胖,將一個(gè) Json 字符串轉(zhuǎn)換為對(duì)象。
        JSON.parse(jsonStr)                 
3够傍、eval()
    可借助 eval()動(dòng)態(tài)函數(shù)甫菠,將參數(shù)字符串解析成 js 代碼來(lái)執(zhí)行
    可將 json 串轉(zhuǎn)為 json 對(duì)象
        1)第一種解析方式:得到的 json 對(duì)象名就是 jsonObj
            eval("var jsonObj = " + jsonStr);
        2)第二種解析方式:對(duì)象中有多個(gè)屬性
            var jsonObj = eval("(" + jsonStr + ")");
        由于 json 是以{ }的方式來(lái)開(kāi)始以及結(jié)束的,在 eval 中會(huì)被當(dāng)成一個(gè)語(yǔ)句塊來(lái)處理冕屯,故必 須強(qiáng)制將它轉(zhuǎn)換成一種表達(dá)式寂诱。加上圓括號(hào)是使 eval 函數(shù)在處理時(shí)強(qiáng)制將括號(hào)內(nèi)的表達(dá)式轉(zhuǎn)化為對(duì)象而不作為語(yǔ)句來(lái)執(zhí)行。
        3)第二種解析方式:對(duì)象中只有一個(gè)屬性
            eval(jsonStr);
    典型應(yīng)用

傳參(參數(shù)比較多時(shí)愕撰,用json比較方便)
命名空間

// 1刹衫、字面量形式創(chuàng)建對(duì)象
var obj = {}; // 空對(duì)象
var obj2 = {
    uname:"zhangsan",
    uage:18
};
obj2.usex=true;
        
console.log(obj);
console.log(obj2);
        
// 2醋寝、通過(guò) new Object 對(duì)象創(chuàng)建 
var obj3 = new Object();
obj3.name = "Tom";
console.log(obj3);
        
// 3、通過(guò) Object 對(duì)象的 create 方法創(chuàng)建對(duì)象
var obj4 = Object.create(null);
console.log(obj4.uname);
        
var obj5 = Object.create(obj2);
console.log(obj5.uname);
        
console.log('============序列化和反序列化============');
var str = '{"uname":"zhangsan", "uage":18 }';
// 反序列化:將字符串轉(zhuǎn)換成對(duì)象
var object1 = JSON.parse(str);
console.log(object1);
console.log(object1.uname);
        
// 序列化带迟,將對(duì)象轉(zhuǎn)換成字符串
var json1 = JSON.stringify(object1)
console.log(json1);
console.log(json1.uname);
        
console.log("=============eval()============");
console.log('你好');
eval("console.log('你好')");//控制臺(tái)輸出你好
        
// 1)第一種解析方式:得到的 json 對(duì)象名就是 jsonObj
var ab = '{"uname":"zhangsan", "uage":18 }';
eval("var jsonObj = " + ab);
console.log(jsonObj);
        
// 2)第二種解析方式:對(duì)象中有多個(gè)屬性
var jsonObj2 = eval("(" +ab + ")");
console.log(jsonObj2);
        
var arrStr = "[1,'1a','fg']";
// 第一種解析方式eval("var arrObj = " + arrStr);
eval("var arr=" + arrStr);
console.log(arr);
// 第二種解析方式:eval(arrStr);
        
console.log(arrStr);
console.log(eval(arrStr));      
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末音羞,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子仓犬,更是在濱河造成了極大的恐慌嗅绰,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,718評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件搀继,死亡現(xiàn)場(chǎng)離奇詭異窘面,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)叽躯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)财边,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人点骑,你說(shuō)我怎么就攤上這事酣难。” “怎么了黑滴?”我有些...
    開(kāi)封第一講書(shū)人閱讀 158,207評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵憨募,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我袁辈,道長(zhǎng)菜谣,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,755評(píng)論 1 284
  • 正文 為了忘掉前任晚缩,我火速辦了婚禮尾膊,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘荞彼。我一直安慰自己眯停,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,862評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布卿泽。 她就那樣靜靜地躺著,像睡著了一般滋觉。 火紅的嫁衣襯著肌膚如雪签夭。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 50,050評(píng)論 1 291
  • 那天椎侠,我揣著相機(jī)與錄音第租,去河邊找鬼。 笑死我纪,一個(gè)胖子當(dāng)著我的面吹牛慎宾,可吹牛的內(nèi)容都是我干的丐吓。 我是一名探鬼主播,決...
    沈念sama閱讀 39,136評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼趟据,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼券犁!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起汹碱,我...
    開(kāi)封第一講書(shū)人閱讀 37,882評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤粘衬,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后咳促,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體稚新,經(jīng)...
    沈念sama閱讀 44,330評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,651評(píng)論 2 327
  • 正文 我和宋清朗相戀三年跪腹,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了褂删。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,789評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡冲茸,死狀恐怖屯阀,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情噪裕,我是刑警寧澤蹲盘,帶...
    沈念sama閱讀 34,477評(píng)論 4 333
  • 正文 年R本政府宣布,位于F島的核電站膳音,受9級(jí)特大地震影響召衔,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜祭陷,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,135評(píng)論 3 317
  • 文/蒙蒙 一苍凛、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧兵志,春花似錦醇蝴、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,864評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至按价,卻和暖如春惭适,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背楼镐。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,099評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工癞志, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人框产。 一個(gè)月前我還...
    沈念sama閱讀 46,598評(píng)論 2 362
  • 正文 我出身青樓凄杯,卻偏偏與公主長(zhǎng)得像错洁,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子戒突,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,697評(píng)論 2 351

推薦閱讀更多精彩內(nèi)容