JS CORE

第一章

錯誤處理:

錯誤: 程序運(yùn)行過程中志鹃,導(dǎo)致程序無法正常執(zhí)行的現(xiàn)象(即bug)

現(xiàn)象: 程序一旦出錯,默認(rèn)會報(bào)錯悍缠,并強(qiáng)行退出

錯誤處理: 即使程序出錯雁乡,也保證程序不會強(qiáng)行退出的一種機(jī)制

為什么: 避免程序強(qiáng)行中斷,導(dǎo)致極差的用戶體驗(yàn)

何時(shí): 只要希望即使程序發(fā)生錯誤街望,也保證不強(qiáng)行退出

如何(用于調(diào)用函數(shù)時(shí)):

try{

? 可能出錯的語句(執(zhí)行語句)

}catch(err){ ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?/*只有發(fā)生錯誤時(shí)校翔,才執(zhí)行*/

? 錯誤處理代碼: 1.保存數(shù)據(jù);2. 提示用戶灾前;3. 記錄日志 ? ? ? ? /*console.log(String(err))*/

}

其中:err是錯誤對象:?錯誤發(fā)生時(shí)防症,自動創(chuàng)建的,記錄錯誤信息的對象

性能問題: 1. 放入try catch中的代碼哎甲,即使不出錯告希,效率也比正常代碼略低

? ? ? ? ? 2. 程序出錯都會創(chuàng)建錯誤對象(error),占用更多內(nèi)存

解決: 如果可提前預(yù)知錯誤的原因烧给,建議用if...else...(沒有err)來代替try catch

優(yōu)點(diǎn): 1. 不影響程序執(zhí)行效率燕偶;2. 節(jié)約內(nèi)存

主動拋出錯誤:

什么是: 在本來程序不出錯的情況下,為了以防萬一础嫡,主動新建一個錯誤指么,并拋出

何時(shí): 在協(xié)作開發(fā)中,函數(shù)的定義者向函數(shù)的使用者拋出錯誤榴鼎,用以告知對方錯誤的使用了函數(shù)

如何:throw new Error("錯誤提示");/*放在 函數(shù)/catch 中*/

筆試:js中錯誤的類型: 6種

SyntaxError:語法錯誤

ReferenceError:引用錯誤: 要找的變量不存在

TypeError:類型錯誤: 錯誤的調(diào)用了API或錯誤的使用了()或[]

RangeError:范圍錯誤: 參數(shù)的取值超范圍

URIError伯诬,EvalError;

Uncaught SyntaxError: Unexpected identifier

ReferenceError: 變量名 is not defined ? ? ? ? ?? //可能是因?yàn)樵趪?yán)格模式下,沒有聲明變量

Block-scoped declarations (let, const, function, class) not yet supported outside strict mode

/*塊范圍聲明(let巫财、const盗似、function、class)還不支持外部嚴(yán)格模式平项,必須啟用嚴(yán)格模式*/

var,let,const的區(qū)別:

var 定義的變量可以修改赫舒,如果不初始化會輸出undefined,不會報(bào)錯

let 制造一個'塊級作用域'(if/else/for/while/單獨(dú)一個{}闽瓢,必須寫{})(JavaScript中沒有塊級作用域)

? ? 在 {} 中用let定義的變量僅能在塊內(nèi)使用接癌,對函數(shù)外部無影響

const 定義的變量值無法修改,而且必須初始化扣讼,范圍限于聲明它的塊中缺猛,IE11及以上才支持

(非)嚴(yán)格模式:輸出從未聲明的變量時(shí)會返回:?ReferenceError//沒有找到對象,在全局輸出局部變量時(shí)

函數(shù)必須調(diào)用,才會改變函數(shù)外的變量。注意局部變量和全局變量(調(diào)用全局變量時(shí)荔燎,改變的是全局變量)耻姥、原始類型和引用類型

函數(shù)(不論全局還是局部)若無return a;則返回undefined有咨,即函數(shù)的值為undefined咏闪。有return a,函數(shù)(一般要接住)才有值(a也能是函數(shù))

return的作用: 返回函數(shù)外摔吏,返回函數(shù)的值

如果一個函數(shù)沒有用new鸽嫂,也沒有用.調(diào),它的this只能指向window

_______________________________________________________________________________________________

1.Function創(chuàng)建函數(shù): 3種:

定義好的函數(shù)只要加()征讲,就會調(diào)用,如 y=fn();

① 聲明:

function 函數(shù)名(參數(shù)列表){函數(shù)體;return 返回值}

特點(diǎn): 會被聲明提前(沒有賦值据某,函數(shù)體提前)

② 直接量:

var 函數(shù)名=function(參數(shù)列表){函數(shù)體;return 返回值}

特點(diǎn): 不會被聲明提前(聲明提前,但賦值不會提前)

揭示:函數(shù)名其實(shí)是變量诗箍,函數(shù)定義是一個引用類型的對象癣籽,函數(shù)名通過函數(shù)對象的地址引用著函數(shù)

③ 用new(用的很少):

var 函數(shù)名=new Function("參數(shù)1", "參數(shù)2", ..., "函數(shù)體;return 返回值")

強(qiáng)調(diào): 無論是參數(shù)名還是函數(shù)體,都必須放在""中滤祖,變量放在外面

2.重(chong)載(overload):

什么是: 相同函數(shù)名筷狼,不同參數(shù)列表的多個函數(shù),在調(diào)用時(shí)匠童,可根據(jù)參數(shù)的不同埂材,自動選擇對應(yīng)的函數(shù)執(zhí)行

為什么: 減少API的數(shù)量,減輕調(diào)用者的負(fù)擔(dān)

何時(shí): 一項(xiàng)任務(wù)汤求,如果根據(jù)不同的參數(shù)俏险,執(zhí)行不同的操作流程時(shí)

問題:js默認(rèn)不允許多個同名函數(shù)同時(shí)存在筐钟,即不支持重載語法

后果: 最后一個函數(shù)會覆蓋之前所有函數(shù)

解決(3步):

① 僅定義一個函數(shù)逆粹,不要寫參數(shù)列表

②arguments: 函數(shù)內(nèi)自動創(chuàng)建的,接收所有傳入函數(shù)的參數(shù)值的類數(shù)組對象/*argument: 參數(shù)*/

函數(shù)名.length表示函數(shù)定義時(shí)參數(shù)的個數(shù)(可寫在函數(shù)外)砂客,arguments.length指外部調(diào)用時(shí)傳參的個數(shù)

? 類數(shù)組對象: 長的像數(shù)組的對象

? VS 數(shù)組: 相同:1. 下標(biāo)挤牛, 2. .length莹痢, 3.for遍歷

? ? ? ? ? ?不同: 類型不同 ——— API不通用

③ 函數(shù)內(nèi),根據(jù)arguments中參數(shù)的個數(shù)或類型墓赴,動態(tài)決定執(zhí)行不同操作

if(arguments.length==n)...竞膳;else ? ? ? /*參數(shù)的.length(個數(shù))為n時(shí),執(zhí)行if后的語句*/

問題: 是否還需要參數(shù)

答:需要:?1. 參數(shù)用于提示調(diào)用者如何正確使用函數(shù)

? ? ? ?? 2. 參數(shù)名一般都比arguments簡潔且見名知義

3.匿名函數(shù):

匿名函數(shù)竣蹦,若不改變this的指向(call顶猜、apply、bind)痘括,則this都指向window

什么是:定義函數(shù)時(shí),沒有指定函數(shù)名的函數(shù)

何時(shí):2種:?只用一次的函數(shù),都不要寫名

為什么:

①節(jié)約內(nèi)存纲菌,及時(shí)釋放:

? 垃圾回收: 垃圾回收器程序會自動釋放不被任何變量引用的對象

? 垃圾回收器: 專門檢查并回收不再被使用的對象的小程序

②劃分臨時(shí)作用域挠日,避免產(chǎn)生全局變量污染

如何: 2種

① 回調(diào): 自己創(chuàng)建函數(shù)后,不調(diào)用翰舌,傳遞給其它函數(shù)嚣潜,讓其它函數(shù)使用

比如:?arr.sort(function(a,b){ return a-b })

? ? ? ? str.replace(reg,function(kw){return 替換值})

? ? ? ? btn.addEventListener("事件名",function(){...})

注:回調(diào)函數(shù)可以單獨(dú)拿出來定義,在調(diào)用時(shí)不要加括號

② 自調(diào): 定義函數(shù)后椅贱,立刻調(diào)用自己懂算,調(diào)用后立刻釋放

如何:(function(){...})()

? ? ? ? ?? 包圍函數(shù)的一對括號將其轉(zhuǎn)換為一個表達(dá)式,緊跟其后的一對括號調(diào)用了這個函數(shù)

? ? ? ? ? ?可以不加一元運(yùn)算符庇麦,但前面的js語句需加分號(;)

若前面剛好有個函數(shù)沒有以;結(jié)尾计技,那么在匿名函數(shù)自調(diào)時(shí)會發(fā)生錯誤(可在前面加個;)

? ? ?? +function(){...}() ? ? ? ? ? ? /*不常用,+易與運(yùn)算符混淆*/

? ? ? ?其它: 在匿名函數(shù)附近使用括號或一些一元運(yùn)算符山橄,用來引導(dǎo)解析器

何時(shí):不希望產(chǎn)生任何全局變量污染時(shí)垮媒,都可將代碼封裝在匿名函數(shù)中,自調(diào)執(zhí)行

優(yōu)點(diǎn): 劃分臨時(shí)作用域航棱,避免創(chuàng)建全局變量

_______________________________________________________________________________________________

4.作用域(scope)和作用域鏈(scope chain)

什么是作用域: 變量的使用范圍睡雇,也是一個變量的實(shí)際存儲位置

包括2種作用域:

1. 全局作用域: window

? 保存: 全局變量

? 優(yōu)點(diǎn): 隨處可用,可重復(fù)使用

? 缺點(diǎn): 易造成全局污染

2. 函數(shù)作用域(AO):

? 保存: 局部變量

? 優(yōu)點(diǎn): 僅函數(shù)內(nèi)可用饮醇,不會被污染

? 缺點(diǎn): 不可重用

函數(shù)的生命周期:

① 程序開始執(zhí)行前: 調(diào)用瀏覽器主程序它抱,創(chuàng)建全局作用域?qū)ο體indow

② 定義函數(shù):

? 在全局創(chuàng)建函數(shù)名變量

? 在window外創(chuàng)建函數(shù)對象保存函數(shù)定義

? 函數(shù)名變量使用地址引用函數(shù)對象

? 函數(shù)對象的隱藏屬性scope指回函數(shù)誕生的作用域window

③ 調(diào)用函數(shù):

? 在ECS中添加本次函數(shù)調(diào)用的記錄

創(chuàng)建本地函數(shù)調(diào)用所需的函數(shù)作用域?qū)ο驛O(活動對象)

? 在AO中創(chuàng)建局部變量(var 聲明的和參數(shù)變量)

? AO的隱藏屬性parent指向父級作用域?qū)ο?/p>

? 變量使用順序: 優(yōu)先使用函數(shù)作用域AO中的局部變量

? ? ? ? ? ? ? ? 局部沒有,才去父級作用域找

④ 調(diào)用后:

? ECS中的本函數(shù)調(diào)用的記錄出棧

? 導(dǎo)致函數(shù)作用域AO沒人引用朴艰,被釋放

? 導(dǎo)致AO中的局部變量一起釋放

作用域鏈(scope chain):由多級作用域?qū)ο罂钩睿鸺壱眯纬傻逆準(zhǔn)浇Y(jié)構(gòu)

2個職責(zé): 1. 保存所有變量: 全局變量都保存在window中,局部變量都保存在AO中

? ? ? ? ?2. 控制變量的使用順序: 先局部呵晚,再全局

_______________________________________________________________________________________________

5.閉包(closure):

什么是: 既重用變量蜘腌,又保護(hù)變量不被污染的一種機(jī)制

為什么: 全局變量和局部變量都有優(yōu)缺點(diǎn):

全局變量: 優(yōu): 可反復(fù)使用,隨處可用

? ? ? ? ? 缺: 易被污染

局部變量: 優(yōu): 僅函數(shù)內(nèi)可用饵隙,不會被污染

? ? ? ? ? 缺: 不可重用

何時(shí):只要希望既重用變量撮珠,又保護(hù)變量不被污染,就只能用閉包

如何: 3步:

① 外層函數(shù)金矛,包裹受保護(hù)的變量和操作變量的內(nèi)層函數(shù)

? ?每次執(zhí)行函數(shù)都將受保護(hù)的變量的值保存在閉包中(這個變量是局部變量)

② 外層函數(shù)將內(nèi)層函數(shù)返回 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? /*return function(){...}*/

③ 使用者調(diào)用外層函數(shù)芯急,獲得返回的內(nèi)層函數(shù)對象

筆試:閉包如何形成: 外層函數(shù)的函數(shù)作用域?qū)ο?AO)無法釋放

缺點(diǎn): 比普通函數(shù)占用更多內(nèi)存空間———多的是外層函數(shù)的作用域?qū)ο驛O

解決: 如果閉包不再使用,就要及時(shí)釋放

將引用內(nèi)層函數(shù)的變量賦值為null驶俊,導(dǎo)致內(nèi)層函數(shù)對象先釋放娶耍,使外層函數(shù)的AO一并釋放

筆試(畫簡圖):2步:

1.先找受保護(hù)的局部變量(避免被污染),并確定最終保存的值

外層函數(shù)的局部變量(var的或參數(shù)變量),受保護(hù): 不會被全局的操作修改

就算局部變量循環(huán),也只會有一個最終的值

2.再找操作變量的內(nèi)層函數(shù)對象:3種情況:

① 直接return function

② 給全局變量賦值:全局變量=function

? ③ 將內(nèi)層函數(shù)保存在數(shù)組/對象內(nèi)饼酿,整體返回

特點(diǎn):

外層函數(shù)聲明局部變量并返回內(nèi)層函數(shù)

內(nèi)層函數(shù)操控(使用)局部變量

全局變量引用外層函數(shù)

一次外層函數(shù)調(diào)用榕酒,返回的多個內(nèi)層函數(shù)胚膊,共用同一個受保護(hù)的變量

第二章*****************************************************************************************

1.面向?qū)ο驩OP

事物的屬性會成為對象中的屬性: 屬性就是保存在對象中的變量,用法和普通變量完全一樣

事物的功能會成為對象中的方法: 方法就是保存在對象中的函數(shù)想鹰,用法和普通函數(shù)完全一樣

? 屬性和方法統(tǒng)稱為對象的成員

定義屬性紊婉、定義方法{}用逗號,結(jié)尾 ? ?創(chuàng)建新對象、調(diào)用方法用分號;結(jié)尾

方法和函數(shù)的唯一不同之處: 方法始終與特定對象關(guān)聯(lián)并與其配合使用

delete Obj[key]//刪除對象成員key辑舷,無法刪除變量喻犁、函數(shù)(無法刪除數(shù)組元素,會變?yōu)閡ndefined)

'name' in obj? ? ? ?//判斷對象中是否擁有某個屬性(包括繼承屬性)何缓,返回Boolean

obj.hasOwnProperty("a")? ? //判斷對象是否有某個自有屬性(不包括繼承屬性)

什么是面向?qū)ο缶幊? 程序中都是用對象結(jié)構(gòu)來描述現(xiàn)實(shí)中一個具體事物

? 對象: 內(nèi)存中集中存儲一個事物的屬性和功能的程序結(jié)構(gòu)

為什么: 便于維護(hù)和使用數(shù)據(jù)

何時(shí): 今后只要維護(hù)的數(shù)據(jù)量或種類多時(shí)肢础,都要用對象的方式,集中管理每個事物的屬性和功能

如何:三大特點(diǎn): 封裝碌廓,繼承传轰,多態(tài)

封裝:創(chuàng)建一個對象

什么是封裝: 將一個事物的屬性和功能集中保存在一個對象中,再起一個統(tǒng)一的名字

為什么封裝: 讓每個數(shù)據(jù)都有其專門的歸屬氓皱,便于維護(hù)和查找事物的屬性和功能

何時(shí)封裝: 只要使用面向?qū)ο舐氛伲家葘⑹挛锏膶傩院凸δ芗卸x在在對象中,再使用

如何封裝: 3種:

只創(chuàng)建一個單獨(dú)的對象: 2種

1.對象直接量:

var obj={/*創(chuàng)建一個新對象*/

屬性名:屬性值,

... : ...,

? 方法名:function(參數(shù)列表){ },? ? ? ? ?? //舊寫法

? 方法名(參數(shù)列表){this.屬性名...},? ? ?? //ES6新寫法

? 方法名(...){...}

}

何時(shí)使用直接量: 如果創(chuàng)建對象時(shí)就已經(jīng)知道對象的成員

對象自己的方法如何訪問對象自己的屬性:

錯誤: 對象名.屬性名, 一旦對象名修改波材,方法內(nèi)的對象名要同時(shí)修改股淡,不便于維護(hù)(但語法無誤)

正確: 在方法內(nèi)使用關(guān)鍵詞this自動指代當(dāng)前對象本身:?this.屬性名

this: 能夠自動獲得正在調(diào)用的 當(dāng)前函數(shù).前 的對象的關(guān)鍵詞

為什么: 不帶this的普通變量,無法進(jìn)入當(dāng)前對象內(nèi)查找屬性廷区,默認(rèn)在作用域鏈中找

何時(shí):只要對象的方法唯灵,想訪問自己的屬性,都必須加this

this可翻譯為: 當(dāng)前對象的屬性 ? ? ? ? ? ? ? ? ?.讀作的

如何訪問對象的成員:

如何訪問對象的屬性: 對象.屬性名或?qū)ο骩"屬性名"]

如何調(diào)用對象的方法: 對象.方法名()或?qū)ο骩"方法名()"]

2.用new:2步:

①先創(chuàng)建空對象: var obj=new Object(); ?? //可以不加括號/new隙轻,也可把Object換成其它構(gòu)造函數(shù)

②向空對象中添加新屬性和方法:

?obj.屬性名=值埠帕;//修改: 對象.自有屬性名=新值

?obj.方法名=function(){...this.屬性名...}

何時(shí)使用: 創(chuàng)建對象時(shí),暫時(shí)不知道對象中的成員

強(qiáng)調(diào):js中的對象創(chuàng)建后玖绿,可在任何時(shí)候敛瓷,添加任何新屬性和方法

如何: 只要嘗試給不存在的屬性和方法賦值,對象會自動創(chuàng)建該屬性

js中對象的本質(zhì): 對象其實(shí)就是關(guān)聯(lián)數(shù)組斑匪,只不過用法更簡單

VS 關(guān)聯(lián)數(shù)組:① 下標(biāo): obj["成員名"] <=> obj.成員名(若成員名是變量呐籽,可寫為obj[變量])

? ? ? ? ? ? ② 都可隨時(shí)添加新屬性

③遍歷: for(var key in obj){ obj[key] }

3.用構(gòu)造函數(shù)(constructor)反復(fù)創(chuàng)建多個相同結(jié)構(gòu)的對象:

構(gòu)造函數(shù): 描述一類對象統(tǒng)一結(jié)構(gòu)的函數(shù),還用于將一個新的空對象裝修成想要的結(jié)構(gòu)并存入數(shù)據(jù)

何時(shí): 只要反復(fù)創(chuàng)建多個相同結(jié)構(gòu)的對象時(shí)蚀瘸,都要先用構(gòu)造函數(shù)定義一類對象的統(tǒng)一結(jié)構(gòu)

如何:2步:

①定義構(gòu)造函數(shù): ?創(chuàng)建函數(shù)的3種方法都可以定義構(gòu)造函數(shù)(在函數(shù)內(nèi)定義屬性和方法要用this)

function 類型名(屬性參數(shù)列表){ ? ?? /*在構(gòu)造函數(shù)中狡蝶,所有的屬性名和方法名前都要加this.*/

?this.屬性名=屬性參數(shù);? ? ? ? ? ? /*從屬性參數(shù)列表 傳值給屬性名*/

? ... = ...贮勃;? ? ? ? ? ? ? ? ? ? ? ? /*this指new的新對象*/

?this.方法名=function(){ ? ? ? ? ? //需要返回的方法不要傳參數(shù)贪惹,參數(shù)從this.*獲取

? ? ...this.屬性名...

}?}

②用new調(diào)用構(gòu)造函數(shù)創(chuàng)建新對象:

var obj=new 類型名(屬性值列表);?//創(chuàng)建"類型名"這種類型的對象 (同時(shí)也會執(zhí)行這個構(gòu)造函數(shù))

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?()前的都是'類型名'寂嘉,()后的.后面的是'類型名'的成員

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//定義好的函數(shù)只要加()奏瞬,就會調(diào)用,如 y=fn();

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//所有函數(shù)都可以用 new 實(shí)例化

new做了4件事:

1. 創(chuàng)建一個新的空對象

2. 讓新的空對象繼承構(gòu)造函數(shù)的原型對象

3. 調(diào)用構(gòu)造函數(shù)

? ?① 設(shè)置構(gòu)造函數(shù)中的this指向新的空對象

? ?② 通過強(qiáng)行賦值的方式枫绅,為新對象添加新屬性和方法

4. 返回新對象的地址保存在變量中

總結(jié): 構(gòu)造函數(shù)擔(dān)當(dāng)著兩個角色

1. 圖紙: 描述一類對象的統(tǒng)一結(jié)構(gòu)

2. 裝修隊(duì): 在空對象中添加固定的屬性和方法

問題: 方法定義在構(gòu)造函數(shù)內(nèi),每個新對象實(shí)例丝格,都重復(fù)創(chuàng)建了一個完全相同的函數(shù)對象 ——— 浪費(fèi)內(nèi)存

總結(jié): 構(gòu)造函數(shù): 優(yōu)點(diǎn): 代碼重用 ? ? ?? 缺點(diǎn): 無法節(jié)約內(nèi)存

解決: 繼承

_______________________________________________________________________________________________

繼承:

什么是: 父對象的成員撑瞧,子對象無需重復(fù)創(chuàng)建就可直接使用(子對象繼承父對象的共有成員)

為什么: 代碼重用棵譬,節(jié)約內(nèi)存

何時(shí): 如果多個子對象显蝌,擁有相同的屬性值或方法定義時(shí),只需要將相同的屬性和方法定義集中定義在父元素中一份即可订咸,所有子對象共用

如何: js中的繼承都是繼承原型對象

原型對象(prototype): 集中存儲同一類型的子對象'共有屬性和方法'的父對象

如何獲得原型對象:

買一贈一: 創(chuàng)建構(gòu)造函數(shù)同時(shí)曼尊,已經(jīng)自動創(chuàng)建了該類型的原型對象。構(gòu)造函數(shù)的prototype屬性引用著所有子對象的父對象(即原型對象)

如何向原型對象中添加共有屬性和方法:

構(gòu)造函數(shù).prototype.屬性名=值

構(gòu)造函數(shù).prototype.方法名=function(){...}

強(qiáng)調(diào): 原型對象中的方法脏嚷,要想訪問對象自己的屬性骆撇,也必須加this.

總結(jié):

每個子對象,值不同的屬性父叙,都要定義在構(gòu)造函數(shù)中

所有子對象共有的相同方法和屬性值神郊,都要集中定義在原型對象中

共有屬性和自有屬性:?自有屬性: 直接保存在對象本地的屬性

? ? ? ? ? ? ? ? ? ? 共有屬性: 保存在原型對象中,所有子對象共用的屬性

相同: 獲取屬性值:對象.屬性名

不同: 修改屬性值:自有屬性可直接通過子對象修改:子對象.自有屬性名=值

共有屬性只能通過構(gòu)造函數(shù)的原型對象:構(gòu)造函數(shù).prototype.共有屬性名=值

任何對象都有__proto__屬性指向其父對象

任何函數(shù)都有prototype屬性指向其原型對象

原型鏈:由多級父對象逐級繼承形成的鏈?zhǔn)浇Y(jié)構(gòu)

保存著: 所有對象的屬性和方法

控制著: 對象成員的使用順序:?優(yōu)先在對象本地找自有屬性使用趾唱,自己沒有才沿原型鏈向父對象查找

VS 作用域鏈: 由多級作用域?qū)ο笾鸺壱眯纬傻逆準(zhǔn)浇Y(jié)構(gòu)

保存著: 所有的變量

控制著: 變量的使用順序: 優(yōu)先在函數(shù)作用域?qū)ο驛O中查找使用涌乳,局部沒有,才沿作用域鏈向父級作用域找

凡是不加.的變量甜癞,都在作用域鏈中找

凡是用.才能訪問的屬性夕晓,都在原型鏈中找

內(nèi)置對象的原型對象:

每種內(nèi)置類型都有一對兒構(gòu)造函數(shù)和原型對象:

創(chuàng)建對象: 自動調(diào)用內(nèi)置對象的構(gòu)造函數(shù)

? 比如: var arr=new Array();

? ? ? ? var now=new Date();

? ? ? ? var reg=new RegExp();

原型對象: 負(fù)責(zé)集中存儲該類型可用的所有API

? 比如: Array.prototype中的: .sort()? .push()? .slice()

? 因?yàn)? Array.prototype:{

? ? ? ? ? sort(){...},

? ? ? ? ? push(){...},

? ? ? ? ? slice(){...},

? ? ? ? ? ...

? ? ? ? }

_______________________________________________________________________________________________

11個內(nèi)置對象除Window(NodeJS中的Global)和Math(這兩個對象屬于對象類型,不是函數(shù)類型)均為構(gòu)造函數(shù)

Number悠咱、String蒸辆、Boolean、Function析既、Array躬贡、Date、RegExp眼坏、Error拂玻、Object

所有的構(gòu)造函數(shù)均繼承于Function.prototype(手動創(chuàng)建的構(gòu)造函數(shù)一樣,與內(nèi)置對象在原型鏈上平級)

Function.prototype繼承于Object.prototype(Window空骚、Math纺讲、手動創(chuàng)建的對象也繼承于Object.prototype。雖然Object.prototype是所有構(gòu)造函數(shù)的父級對象囤屹,但Object仍然是函數(shù))

所有的原型對象均繼承于父級原型對象熬甚,最終繼承于Object.prototype

所以可以強(qiáng)行調(diào)用: Object.prototype的toString方法來判斷類型:

console.log(Object.prototype.toString.call(類型名))

修改繼承的方式:

① call、apply肋坚、bind

② child.__proto__=father,不推薦乡括,要使用 Object.setPrototypeOf(child, father)

③ 構(gòu)造函數(shù).prototype.屬性名=值 ? ? ? ?構(gòu)造函數(shù).prototype.方法名=function(){...}

深度復(fù)制對象(引用不同的地址,互不影響)

newObj = JSON.parse(JSON.stringify(sourceObj))? ? //不能復(fù)制對象中的方法

newObj = Object.assign({}, obj1, obj2)? ? //淺拷貝(對象中的對象是直接引用的)

Object.create(null);? ? ? ? ? ? ? ? ? ? ? //創(chuàng)建一個沒有任何成員肃廓,且沒有父對象的空對象

JSON.parse(obj, (key, value) => { return value })? ? //第二個參數(shù)可以在返回之前轉(zhuǎn)換屬性的值

JSON.stringify(obj, null, 2);? ? ? ? //將對象格式化JSON輸出

? 第一個參數(shù):?①?是函數(shù)時(shí),可以改變對象序列化中的行為

? ? ? ? ? ? ? ② 是包含String和Number的數(shù)組诲泌,可作為白名單盲赊,對對象過濾后再生成字符串

? ? ? ? ? ? ? ③?是null或被省略,則所有的鍵值都被包含在生成的JSON字符串

? 第二個參數(shù):?① 若是Number(1-10)敷扫,表示空格的數(shù)量

? ? ? ? ? ? ? ②?是String哀蘑,則空格會替換為該字符串

? ? ? ? ? ? ? ③?是null或被省略,不會顯示空白符

_______________________________________________________________________________________________

解決瀏覽器兼容性問題: 舊瀏覽器無法使用新API

2步:

1. 判斷當(dāng)前類型的原型對象中是否包含想用的API

? 比如: if(!"indexOf" in Array.prototype)

? ? ? ? 其中in用于檢查左邊的成員名是否在右邊的對象中或?qū)ο蟮脑玩溕?/p>

if(typeof 類型.prototype.API!=="function")

? 比如: if(typeof Array.prototype.indexOf!=="function")

2. 如果沒有葵第,就向當(dāng)前類型的原型對象中添加一個自定義的同名API

類型.prototype.API=function(){

this./*this: 代表當(dāng)前類型(比如數(shù)組)對象*/

}

一绘迁、JavaScript繼承是類繼承還是原型繼承

? 是原型繼承,盡管使用了new關(guān)鍵字卒密,但只是一個語法糖缀台,與類無關(guān)。JavaScript中沒有類

二哮奇、prototype用來做什么

? prototype是個對象膛腐,只有函數(shù)有,用來存儲對象的成員(屬性和方法)的地方鼎俘,是實(shí)現(xiàn)JavaScript原型繼承的基礎(chǔ)

三哲身、__proto__用來做什么

? __proto__是個指向prototype的引用,用以輔助原型繼承中向上查找的實(shí)現(xiàn)而芥,是一個指向[[Prototype]]的引用

四律罢、constructor用來做什么

? 是對象上一個指向構(gòu)造函數(shù)的引用,用來輔助instanceof等關(guān)鍵字的實(shí)現(xiàn)

_______________________________________________________________________________________________

多態(tài):同一個函數(shù)在不同情況下棍丐,表現(xiàn)出不同的狀態(tài)

包括:重載(overload)和重寫(override)

重寫(override): 如果子對象覺得從父對象繼承的成員不好用误辑,可在子對象本地定義同名自有成員,覆蓋父對象的成員

為什么: 父對象繼承來的成員歌逢,不一定都是想要的

何時(shí): 只要父對象不是想要的巾钉,就可以修改繼承關(guān)系,繼承另一個對象

如何: 3種:

1.僅修改一個對象的__proto__屬性指向新父對象:

? child.__proto__=father

問題: __proto__是內(nèi)部屬性秘案,不推薦使用

解決: 使用Object.setPrototypeOf(child,father)

2.通過修改構(gòu)造函數(shù)的原型對象砰苍,批量修改所有子對象的父對象:

構(gòu)造函數(shù).prototype=father

時(shí)機(jī): 在開始創(chuàng)建子對象之前,就要換

3.兩種類型間的繼承:

何時(shí): 如果多個類型之間存在部分相同的屬性結(jié)構(gòu)和方法定義時(shí)阱高,就可抽象出一個公共的父類型

如何:

①抽象出公共父類型:

? 父類型的構(gòu)造函數(shù)中定義相同的屬性結(jié)構(gòu)

? 父類型的原型對象中定義相同的方法

②讓子類型繼承父類型:

讓子類型的原型對象繼承父類型的原型對象

Object.setPrototypeOf(子類型.prototype赚导,父類型.prototype);

③在子類型的構(gòu)造函數(shù)中借用父類型的構(gòu)造函數(shù)

? 錯誤: 直接調(diào)用: 父類型構(gòu)造函數(shù)(參數(shù)值...)

? ? 原因: 直接調(diào)用函數(shù)時(shí)赤惊,函數(shù)中的this默認(rèn)指向window吼旧,而不是當(dāng)前新對象

? 正確: 用call強(qiáng)行調(diào)用,并替換this為指定對象:

父類型構(gòu)造函數(shù).call((正確的)this,其它參數(shù)...)未舟;

call:專門用于強(qiáng)行替換函數(shù)內(nèi)不正確的this為想要的對象

? 何時(shí): 只要函數(shù)中的this不是想要的圈暗,就可用call換成任意對象

? ? 比如: fun.call(obj,參數(shù)值...) ? ?調(diào)用fun掂为,替換fun中的this為obj

第三章*****************************************************************************************

1.ES5:

ECMAScript: ECMA組織制定的JavaScript語言的國際標(biāo)準(zhǔn),規(guī)定了JS語言的核心語法

ES5是ECMAScript的第五個版本(第四版過于復(fù)雜廢棄了)员串,IE8部分此版本

保護(hù)對象:

什么是:① 保護(hù)對象的屬性和屬性值始終有意義

? ? ? ?② 防止篡改對象的結(jié)構(gòu)

為什么:① 對象的屬性勇哗,默認(rèn)可隨意賦值

? ? ? ?② 對象可隨意添加、刪除屬性

何時(shí): 嚴(yán)格來說寸齐,今后所有對象欲诺,都要有自我保護(hù)的抵抗力

如何: 分為保護(hù)屬性和防篡改

保護(hù)屬性: 保護(hù)對屬性值的修改

對象屬性分為:

命名屬性: 可通過.直接訪問的屬性

? ? 分為:?數(shù)據(jù)屬性: 直接保存屬性值的屬性

? ? ? ? ? 訪問器屬性:?不直接存儲屬性值,僅提供對其他數(shù)據(jù)屬性的保護(hù)

內(nèi)部屬性: 無法通過.直接訪問的屬性

數(shù)據(jù)屬性的四大特性:

value:實(shí)際存儲屬性值

writable:true/false控制屬性是否可修改屬性值

enumerable:true/false控制屬性是否可被for in遍歷(false會跳過)访忿,僅控制遍歷瞧栗,無法控制用.訪問

configurable:true/false控制是否可刪除該屬性斯稳,控制是否可修改其它兩個特性

強(qiáng)調(diào): configurable經(jīng)常作為前兩個屬性的雙保險(xiǎn)海铆,且一旦設(shè)為false,不可逆

獲取四大特性:

Object.getOwnPropertyDescriptor(obj,"屬性名")

設(shè)置1個屬性的四大特性:

Object.defineProperty(obj,"屬性名",{

? 要修改的特性:特性值,

? 要修改的特性:特性值,

? ... ...

})

問題: defineProperty一次只能修改一個屬性

解決: 同時(shí)修改多個屬性的特性:

Object.defineProperties(obj,{

? 屬性名:{ 要修改的特性 },

? 屬性名:{ 要修改的特性 },

? ... : ...

})

添加屬性: 可用defineProperty添加新屬性

? ? ? ? ? 只要defineProperty要修改的屬性不存在挣惰,就會自動添加

強(qiáng)調(diào): 用defineProperty添加的新屬性卧斟,四大特性默認(rèn)值都為false

而用.添加的新屬性,四大特性默認(rèn)值都為true

問題: 無法使用自定義邏輯保護(hù)屬性

解決:?訪問器屬性

_______________________________________________________________________________________________

訪問器屬性: 不直接存儲屬性值憎茂,僅提供對其他數(shù)據(jù)屬性的保護(hù)

何時(shí): 只要使用自定義的規(guī)則保護(hù)屬性值

為什么: 數(shù)據(jù)屬性的四大特性珍语,保護(hù)規(guī)則是固定的,無法自定義

如何定義: 2步:

①定義一個隱藏的數(shù)據(jù)屬性竖幔,用于實(shí)際存儲屬性值

②再定義一個訪問器屬性板乙,保護(hù)隱藏的數(shù)據(jù)屬性:

Object.defineProperty(obj,"屬性名",{/*或用defineProperties,不能通過直接量或.創(chuàng)建*/

?get(){? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? /*在試圖獲取屬性值時(shí)自動調(diào)用*/ ? ?

? ? return this.隱藏的數(shù)據(jù)屬性拳氢; ? ? ? ? ? /*返回受保護(hù)的數(shù)據(jù)屬性值*/

?},

?set(val){? ? ? ? ? /*在試圖修改屬性值時(shí)自動調(diào)用募逞,參數(shù)val會自動獲得要修改的新值*/

? ? if(...) ? ? ? ? ? ? ? ?/*驗(yàn)證val是否符合規(guī)則*/

? ? ? ... ? ? ? ? ? ? ? ? ?/*將val賦值給受保護(hù)的屬性*/

? ? else ... ? ? ? ? ? ? ? /*否則*/

? ? ? throw new Error ? ?? /*主動拋出錯誤*/

?},

enumerable:true, ? ? ? ? ?/*設(shè)置四大屬性*/

configurable:false

})

如何使用: 只要定義了訪問器屬性,就優(yōu)先使用訪問器屬性馋评,而不用受保護(hù)的數(shù)據(jù)屬性

? ? ? ? ? 訪問器屬性的用法和普通屬性用法完全一樣

? ? ? ? ? 但是: 在取值時(shí)放接,自動調(diào)用get()

? ? ? ? ? ? ? ? 在賦值時(shí),自動調(diào)用set()留特,val會自動獲得要賦的新值

內(nèi)部屬性: 無法通過.直接訪問的隱藏屬性

? ? ? ? ? 比如: __proto__

_______________________________________________________________________________________________

防篡改: 阻止對對象結(jié)構(gòu)的修改

3個級別:

①防擴(kuò)展: 禁止添加新屬性

Object.preventExtensions(obj)

? 原理: 每個obj內(nèi)部都有一個隱藏屬性:?Extensible纠脾,默認(rèn)為true

? ? ? ? preventExtensions將obj的Extensible改為false

②密封: 在防擴(kuò)展的基礎(chǔ)上,進(jìn)一步禁止刪除現(xiàn)有屬性(兩個不要一起用)

Object.seal(obj)

? 原理: 將obj的Extensible改為false

? ? ? ? 將所有屬性的configurable都自動改為false

③ 凍結(jié): 在密封基礎(chǔ)上禁止修改一切屬性值(過于嚴(yán)格)

Object.freeze(obj)

? 原理: 修改obj的Extensible為false

? ? ? ? 將所有屬性的configurable都改為false

? ? ? ? 還將所有屬性的writable都改為false

_______________________________________________________________________________________________

Object.create(): 本質(zhì)上是創(chuàng)建一個新的子對象

什么是: 基于一個現(xiàn)有父對象蜕青,創(chuàng)建一個新的子對象繼承當(dāng)前父對象苟蹈,并擴(kuò)展新屬性

何時(shí): 今后如果沒有構(gòu)造函數(shù)的情況下,也想創(chuàng)建子對象

如何:

var child=Object.create(father,{ ? ?? /*若不用擴(kuò)展自有屬性右核,father后的內(nèi)容不必寫*/

? 自有屬性:{

? ? value:值,

? ? writable:true,

? ? enumerable:true,

? ? configurable:true,

? },

? ... : {

? ? ...

? }

});

強(qiáng)調(diào): 只要添加到對象中的屬性慧脱,四大特性默認(rèn)為false,必須顯式寫為true

原理:① 創(chuàng)建一個空對象

? ? ?② 讓新對象自動繼承father

? ? ?③ 為新對象擴(kuò)展新的自有屬性

_______________________________________________________________________________________________

call/apply/bind:

共同:為了替換函數(shù)中不想要的this

何時(shí): 只要函數(shù)中的this不是想要的 (函數(shù)不加括號蒙兰,只在call/apply/bind右邊加括號)

call和apply:

什么是:強(qiáng)行調(diào)用一個函數(shù)并臨時(shí)替換函數(shù)中的this為指定的新對象

call: ?要求傳入函數(shù)的參數(shù)必須單獨(dú)傳入磷瘤,逗號分隔

第1個參數(shù)是要指定的this芒篷,第2,3...個是要替換的參數(shù)

apply: 要求傳入函數(shù)的參數(shù),必須放入數(shù)組中整體傳入

? ? ?? apply可自動打散數(shù)組類型的參數(shù)采缚,單個傳入

第1個參數(shù)是要指定的this针炉,第2個參數(shù)是一個數(shù)組

bind: ?基于一個現(xiàn)有函數(shù)創(chuàng)建一個功能完全相同的新函數(shù),并永久綁定this為指定對象

? ? ? ?還可永久綁定部分固定的參數(shù)值

替換回調(diào)函數(shù)中的this時(shí)扳抽,都用bind

比如:?var newFun=fun.bind(obj) ? ?//接收新參數(shù)篡帕,函數(shù)后添加

? ? ? ? ? ? ?newFun(參數(shù)1,...); ? ? ? ?? //調(diào)用函數(shù)

強(qiáng)調(diào): 被bind永久綁定的this,不能再被call/apply臨時(shí)替換

_______________________________________________________________________________________________

數(shù)組API:

判斷: 判斷數(shù)組中的元素是否符合要求

返回值:bool(可判斷是否滿足條件)

①every: 判斷數(shù)組中所有元素是否都滿足要求

var?bool = arr.every(function(val,i,arr){? //回調(diào)函數(shù): 當(dāng)前元素值:val贸呢;當(dāng)前元素位置:i镰烧;arr:當(dāng)前數(shù)組

? return 判斷條件

});

②some: 判斷數(shù)組中是否包含滿足條件的元素

var bool = arr.some(function(val,i,arr){

? return 判斷條件

});

強(qiáng)調(diào):數(shù)組API的回調(diào)函數(shù)中this默認(rèn)->window,所以,不能用this指代當(dāng)前元素值楞陷,但可用如arr[i]或val

遍歷: 對數(shù)組中每個元素執(zhí)行相同的操作:

①forEach: 對原數(shù)組中每個元素執(zhí)行相同的操作

arr.forEach(function(val,i,arr){? ? //沒有返回值

? arr[i]=新值;? ? ? ? ? ? ? ? ? ? ? //對當(dāng)前元素執(zhí)行的操作怔鳖,直接修改原數(shù)組,只能使用arr[i]

})

②map: 取出原數(shù)組中每個元素固蛾,執(zhí)行相同操作后结执,再放入新數(shù)組返回

var arr2 = arr1.map(function(val,i,arr){? ? ? ? //返回一個新數(shù)組

? return 對當(dāng)前元素操作后的新值(放入新數(shù)組中)? ? ? ? //不修改原數(shù)組,使用arr[i]=..可修改原數(shù)組

})

過濾和匯總:

過濾: filter: 復(fù)制原數(shù)組中符合條件的元素艾凯,組成新數(shù)組

var subArr=arr.filter(function(val,i,arr){

? return 判斷條件? ? ? ? //篩選出arr中符合判斷條件(為true)的元素值献幔,放入新數(shù)組返回

})

匯總: reduce: 將數(shù)組中所有元素,統(tǒng)計(jì)出一個匯總結(jié)果

var r=arr.reduce(function(prev,val,i,arr){? ? ? ?//prev: 截止目前的臨時(shí)匯總值

? return prev+val

},startVal);? ? ? ? ? ? ? ? ? ? ? ? ? ?//startVal: 表示匯總開始的基數(shù)趾诗,可不寫(默認(rèn)為0)

將arr數(shù)組中每個值累加后蜡感,求和

強(qiáng)調(diào): reduce不一定非要從0開始累加,可從任意startVal(也可以是其它數(shù)組)開始累加

_______________________________________________________________________________________________

嚴(yán)格模式:

什么是: 比普通js運(yùn)行模式要求更嚴(yán)格的運(yùn)行機(jī)制

為什么: 解決普通js運(yùn)行模式中廣受詬病的缺陷

何時(shí): 今后都要在嚴(yán)格模式下開發(fā)

① 新項(xiàng)目, 必須全部啟用嚴(yán)格模式

② 舊項(xiàng)目, 逐個函數(shù)向嚴(yán)格模式遷移

如何: 2種:

① 整個代碼段啟用嚴(yán)格模式:

在<script>標(biāo)簽或js文件的開頭加入:"use strict"恃泪;

② 僅對單個函數(shù)啟用嚴(yán)格模式

僅在function內(nèi)郑兴,函數(shù)體的頂部加入:"use strict";

要求:

1. 不允許對未聲明的變量賦值

2. 靜默失敗升級為錯誤

3. 不推薦使用arguments.callee來實(shí)現(xiàn)遞歸

_______________________________________________________________________________________________

2.ES6(框架廣泛采用悟泵,又稱為ECMAScript 2015):

模板字符串: 對字符串拼接的簡化(2015年首次發(fā)布杈笔,IE Edge不支持)

何時(shí): 如果字符串中包含需要動態(tài)執(zhí)行的表達(dá)式或回車換行時(shí)

如何:3件事

① 用``反引號(ESC鍵的正下方)包裹字符串

② 字符串中的變量和表達(dá)式都要放在${...}中

③ 模板字符串中支持: ?換行,變量糕非,表達(dá)式()蒙具,注釋也會被解析

let:

1. 專門聲明僅在當(dāng)前塊中有效的局部變量

? 塊: js中只要一個{}就是一個代碼塊

? ? ? let聲明的變量,僅在{}內(nèi)有效朽肥,不會被提前到{}外

2. 防止聲明提前現(xiàn)象

聲明提前: 在開始執(zhí)行程序前禁筏,引擎會將var聲明的變量和function聲明的函數(shù),提前到"當(dāng)前作用域"頂部集中優(yōu)先創(chuàng)建衡招,再開始執(zhí)行程序 ? ? ? ? ?? /*但是賦值留在原地*/

何時(shí):今后強(qiáng)烈建議用let代替var

強(qiáng)調(diào):let必須配套嚴(yán)格模式使用

_______________________________________________________________________________________________

箭頭函數(shù): 對所有回調(diào)函數(shù)的終極簡寫

何時(shí): 今后篱昔,幾乎所有的回調(diào)函數(shù),都要用箭頭函數(shù)簡化

如何:

1.所有回調(diào)函數(shù)都可:去 function(參數(shù)) 改為 (參數(shù))=>

2.如果函數(shù)體只有一句話: 可省略{}

如果這一句話還是return,可省略return

3.如果只有一個參數(shù):可省略()

但是,如果沒有參數(shù)州刽,必須保留空()

特點(diǎn):箭頭函數(shù)可讓內(nèi)外this共用同一個對象————不再需要bind替換

特殊: 如果不希望內(nèi)外共用this空执,就不能用箭頭函數(shù)(或者用e.target -> 當(dāng)前單擊的元素對象)

比如事件處理函數(shù):

? elem.addEventListener("click",function(){ this -> 當(dāng)前單擊的元素對象,不共用 })

? elem.addEventListener("click",()=>{ 致使this -> 不是elem })

變通解決:

elem.addEventListener("click",e=>{ e.target->elem })? ? /*利用冒泡*/

特點(diǎn):

① 箭頭函數(shù)沒有this

② 箭頭函數(shù)沒有arguments

③ 不能通過 new 關(guān)鍵字調(diào)用

④ 沒有 new.target

⑤ 沒有原型

⑥ 沒有 super

_______________________________________________________________________________________________

for of: 簡化for循環(huán)遍歷:

何時(shí): 直接獲得每個元素值時(shí)

如何:

for(var i=0;i<arr.length;i++){ arr[i] } ? ? ? /*arr[i]: 當(dāng)前元素*/

簡寫為:

for(var val of arr){ val } ? ? ? ? ? ?/*val: of會依次取出arr中每個元素的值,保存到val*/

局限:

①只能遍歷索引數(shù)組和類數(shù)組對象穗椅,不能遍歷關(guān)聯(lián)數(shù)組和對象(只能用for in循環(huán)遍歷)

② 無法獲得下標(biāo)

③ 只能逐個遍歷所有辨绊,不能控制循環(huán)的開始和結(jié)束以及步調(diào)

④按值傳遞: 如果數(shù)組中保存的是原始類型的值,修改val匹表,不會影響數(shù)組元素(val是數(shù)組元素值的副本)

何時(shí):僅遍歷元素值门坷,不關(guān)心下標(biāo)時(shí),才可用for of簡寫

_______________________________________________________________________________________________

class: 對 面向?qū)ο?的簡化

如何定義類型:

①用一個?class 類型名{}結(jié)構(gòu)包裹原來的 構(gòu)造函數(shù)和原型對象方法

②修改構(gòu)造函數(shù)的'function'為'constructor'袍镀,其余保持不變

③可省略開頭的'類型.prototype'與方法名后的'=function'

直接定義在class中的函數(shù)直接量默蚌,會自動保存在當(dāng)前類型的原型對象中

定義父類:

class Flyer{

? constructor(fname,speed){

? ? this.fname=fname;

? ? this.speed=speed;

? }

? fly(){?}? ? ? ? //fly <=> Flyer.prototype.fly

? get 訪問器屬性名(){?return this.受保護(hù)的其他屬性?} ?? //添加訪問器屬性,在構(gòu)造函數(shù)的平級

? set 訪問器屬性名(val){

? ? if(條件) this.受保護(hù)的屬性=val

? ? else?報(bào)錯

? }

}

繼承: 不再設(shè)置Object.setPrototypeOf

①在'class 類型名'后添加'extends 父類型'名

② 在子類型構(gòu)造函數(shù)中不允許直接用call調(diào)用父類型構(gòu)造函數(shù),可使用super(屬性參數(shù)值列表),不加this

子類:

class Plane extends Flyer{? ? ? ? ? ? ?//讓Plane繼承Flyer

? constructor(fname,speed,score){

? ? super(fname,speed);? //super:關(guān)鍵字苇羡,指父類型的構(gòu)造函數(shù)绸吸,自動將子類型的this傳入父類構(gòu)造函數(shù)中,不允許用call

? ? this.score=score;

? }

? getScore(){ }

}

使用:

var obj = new Plane('fname',10,30)? ? //也可以new父類: var obj = new Flyer('fname',10)

obj.getScore()? ? ? ? //子類的方法

obj.fly()? ? ? ? ? ? ?//父類的方法

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末宣虾,一起剝皮案震驚了整個濱河市惯裕,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌绣硝,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件撑刺,死亡現(xiàn)場離奇詭異鹉胖,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)够傍,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進(jìn)店門甫菠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人冕屯,你說我怎么就攤上這事寂诱。” “怎么了安聘?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵痰洒,是天一觀的道長。 經(jīng)常有香客問我浴韭,道長丘喻,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任念颈,我火速辦了婚禮泉粉,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己嗡靡,他們只是感情好跺撼,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著讨彼,像睡著了一般财边。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上点骑,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天酣难,我揣著相機(jī)與錄音,去河邊找鬼黑滴。 笑死憨募,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的袁辈。 我是一名探鬼主播菜谣,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼晚缩!你這毒婦竟也來了尾膊?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤荞彼,失蹤者是張志新(化名)和其女友劉穎冈敛,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體鸣皂,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡抓谴,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了寞缝。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片癌压。...
    茶點(diǎn)故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖荆陆,靈堂內(nèi)的尸體忽然破棺而出滩届,到底是詐尸還是另有隱情,我是刑警寧澤被啼,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布帜消,位于F島的核電站,受9級特大地震影響趟据,放射性物質(zhì)發(fā)生泄漏券犁。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一汹碱、第九天 我趴在偏房一處隱蔽的房頂上張望粘衬。 院中可真熱鬧,春花似錦、人聲如沸稚新。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽褂删。三九已至飞醉,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間屯阀,已是汗流浹背缅帘。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留难衰,地道東北人钦无。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像盖袭,于是被迫代替她去往敵國和親失暂。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評論 2 345

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

  • 第2章 基本語法 2.1 概述 基本句法和變量 語句 JavaScript程序的執(zhí)行單位為行(line)鳄虱,也就是一...
    悟名先生閱讀 4,118評論 0 13
  • 工廠模式類似于現(xiàn)實(shí)生活中的工廠可以產(chǎn)生大量相似的商品弟塞,去做同樣的事情,實(shí)現(xiàn)同樣的效果;這時(shí)候需要使用工廠模式拙已。簡單...
    舟漁行舟閱讀 7,718評論 2 17
  • 概要 64學(xué)時(shí) 3.5學(xué)分 章節(jié)安排 電子商務(wù)網(wǎng)站概況 HTML5+CSS3 JavaScript Node 電子...
    阿啊阿吖丁閱讀 9,095評論 0 3
  • 自打五月份轉(zhuǎn)了新的崗位后决记,工作突然沒有了那么大壓力。 之前的工作就是努力干業(yè)績悠栓,是那種一個月三十天休一天就是滿足了...
    呼呼姑涼閱讀 672評論 2 2
  • 白居易《楊柳枝》原詩霉涨、注釋、翻譯惭适、賞析 【原文】:樂府?楊柳枝白居易依依裊裊復(fù)青青,勾引春風(fēng)無限情楼镐。白雪花繁空撲地...
    xcy無名閱讀 477評論 0 0