日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

JS 語(yǔ)言核心(JavaScript權(quán)威指南第六版)(閱讀筆記)

 SecondChoice 2018-06-29

前言:

  對(duì)于程序員,學(xué)習(xí)是無(wú)止境的,知識(shí)淘換非???能夠快速穩(wěn)固掌握一門(mén)新技術(shù),是一個(gè)程序員應(yīng)該具備的素質(zhì).這里將分享本人一點(diǎn)點(diǎn)不成熟的心得.

  了解一門(mén)語(yǔ)言,了解它的概念非常重要,但是一些優(yōu)秀的設(shè)計(jì)思想需要細(xì)心和大量實(shí)踐才能慢慢參悟,在這之前需要做的是能夠運(yùn)用它來(lái)開(kāi)發(fā),那么了解一些基礎(chǔ)特性非常有必要,通常這些特性是需要經(jīng)驗(yàn)積累,從各種坑中累計(jì)出來(lái),但是還有一種看似很笨卻很有效的學(xué)習(xí)方法.那就是將別人的經(jīng)驗(yàn)記錄下來(lái),有事沒(méi)事都拿出來(lái)看看,集合開(kāi)發(fā)中的經(jīng)驗(yàn),這會(huì)非常有效.

調(diào)試工具 firebug
需要升級(jí)的知識(shí)點(diǎn)     《ECMAScript 6 入門(mén)》
詞法結(jié)構(gòu)
  • 編程語(yǔ)言的詞法結(jié)構(gòu)是一套基礎(chǔ)性規(guī)則,用來(lái)描述如何使用這門(mén)語(yǔ)言的編寫(xiě)程序。
  • 字符集:
    • JavaScript程序是用Unicode字符集編寫(xiě)的。Unicode是ASCII和Latin-1的超集,并支持地球上幾乎所有在用的語(yǔ)言
  • 區(qū)分大小寫(xiě)
  • 空格、換行符和格式控制符
    • JavaScript會(huì)忽略程序中標(biāo)識(shí)之間的空格
  • 注釋
    • 第一種注釋?zhuān)谛形病?/”之后的文本都會(huì)被JavaScript當(dāng)作注釋忽略掉的
    • 第二種注釋?zhuān)?/"和"/"之間的本文都會(huì)被當(dāng)作注釋
  • 直接量
    • 就是程序中直接使用的數(shù)據(jù)值“12”//數(shù)字true//布爾值等等
  • 標(biāo)識(shí)符和保留字
    • 標(biāo)識(shí)符就是一個(gè)名字。在JS中,標(biāo)識(shí)符用來(lái)對(duì)變量和函數(shù)名進(jìn)行命名,或用作JS代碼中某些循環(huán)語(yǔ)句中的跳轉(zhuǎn)位置的標(biāo)記。
    • 標(biāo)識(shí)符必須以字母、下劃線、美元符開(kāi)始
    • 保留字就是JS把一些標(biāo)識(shí)符拿出來(lái)用作自己的關(guān)鍵字,因此,就不能再程序中把這些關(guān)鍵字用作標(biāo)識(shí)符了
  • 可選的分號(hào)
    • 缺少分隔符,一條語(yǔ)句結(jié)束就成了下一條語(yǔ)句的開(kāi)始
    • 在JS中,如果語(yǔ)句各自獨(dú)占一行,通??梢允÷哉Z(yǔ)句之間的分號(hào)(“}”也可以省略),JS會(huì)在換行處自動(dòng)填補(bǔ)分號(hào),但并不是所有換行出都會(huì)自動(dòng)填補(bǔ),只有在可以解析的情況下才會(huì)填補(bǔ)
類(lèi)型、值和變量
  • 在編程語(yǔ)言中,能夠表示并操作的值的類(lèi)型稱做數(shù)據(jù)類(lèi)型,編程語(yǔ)言最基本的特性就是能夠支持多種數(shù)據(jù)類(lèi)型。
  • 當(dāng)程序需要將值保存起來(lái)以備將來(lái)使用時(shí),便將其賦值給一個(gè)變量
  • 變量是一個(gè)值的符號(hào)名稱,可以通過(guò)名稱來(lái)獲得對(duì)值的引用。變量的工作機(jī)制是編程語(yǔ)言的另一個(gè)基本特性
  • JS的數(shù)據(jù)類(lèi)型分為兩類(lèi)
    • 原始數(shù)據(jù)(primitive type)類(lèi)型,包括數(shù)字、字符串和布爾值
    • 對(duì)象(object type)類(lèi)型,JS中除了數(shù)字、字符串、布爾值、Null、Undefined之外的就是對(duì)象了
      • 對(duì)象(object)是屬性(property)的集合,每個(gè)屬性都由“名/值對(duì)”
      • JS定義了一種特殊的對(duì)象——數(shù)組(array)
      • JS定義了一種特殊的對(duì)象——函數(shù)
  • 數(shù)字
    • JS不區(qū)分整數(shù)值和浮點(diǎn)數(shù)值,JS中所有數(shù)字均用浮點(diǎn)數(shù)值表示
    • 當(dāng)一個(gè)數(shù)字直接出現(xiàn)在程序中,我們稱之為數(shù)字直接量
    • JS支持多種格式的數(shù)字直接量
      • 十進(jìn)制
      • 十六進(jìn)制
      • 數(shù)組下標(biāo)的32位整數(shù)
    • 浮點(diǎn)型直接量
    • JS中的算術(shù)運(yùn)算
      • JS中的算術(shù)運(yùn)算在溢出、下溢或被零整除時(shí)不會(huì)報(bào)錯(cuò)。當(dāng)數(shù)字運(yùn)算結(jié)果超過(guò)了JS所能表示的數(shù)字上限,結(jié)果為一個(gè)特殊的無(wú)窮大值,JS中以Infinity表示
      • 下溢是當(dāng)運(yùn)算結(jié)果無(wú)限接近于零并比JS能表達(dá)的最小值還小的時(shí)候,JS將返回0
  • 從技術(shù)上講,只有JS對(duì)象才能擁有方法。然而數(shù)字、字符串和布爾值也可以擁有自己的方法(3.6節(jié)進(jìn)行講解)
  • 原始類(lèi)型/對(duì)象類(lèi)型
  • 可變類(lèi)型/不可變類(lèi)型
    • 可變類(lèi)型:值是可以修改的,數(shù)組與對(duì)象就是可變類(lèi)型
    • 不可變類(lèi)型:數(shù)字、字符串、布爾值、NULL和Undefined——比如,修改一個(gè)數(shù)值的內(nèi)容本身就說(shuō)不通
  • JS可以自由地進(jìn)行數(shù)據(jù)類(lèi)型轉(zhuǎn)換。比如,程序期望使用字符串的地方使用了數(shù)字,JS會(huì)自動(dòng)將數(shù)字轉(zhuǎn)換為字符串,使用布爾值的地方使用非布爾值,也會(huì)進(jìn)行自動(dòng)轉(zhuǎn)換
  • JS中靈活的類(lèi)型轉(zhuǎn)換規(guī)則對(duì)“判斷相等”的定義有影響。等號(hào)運(yùn)算符“==”
  • JS變量是無(wú)類(lèi)型的,變量可被賦值任何類(lèi)型,同樣一個(gè)變量也可重新賦予不同類(lèi)型的值
  • 詞法作用域
  • 日期和時(shí)間
  • 字符串
    • 字符串是一組由16位值組成的不可變的有序序列,每個(gè)字符串通常來(lái)自于Unicode字符集
    • JS定義的各式字符串操作方法均作用于16位值
    • JS中字符串是不可變類(lèi)型,JS中的字符串是固定不變的,類(lèi)似replace()的方法都返回新的字符串,原始字符串本身并沒(méi)發(fā)生改變
  • 字符串直接量
  • 轉(zhuǎn)義字符
    • JS字符串中反斜線(\)有著特殊的用途,反斜線符號(hào)后加一個(gè)字符,就不再表示它們字面含義了,比如,\n就是一個(gè)轉(zhuǎn)義字符,它表示換行符
    • \'轉(zhuǎn)義符,表示單引號(hào)
  • 字符串的使用
    • JS的內(nèi)置功能之一就是字符串連接。字符串使用加(+)號(hào)連接,表示兩數(shù)相連
  • 匹配模式(正則表達(dá)式)
  • 布爾值
    • 布爾值指代真或假、開(kāi)或關(guān)、是或否。這個(gè)類(lèi)型只有兩個(gè)值,保留字true和false
    • 程序中的比較語(yǔ)句的結(jié)果通常都是布爾值
    • 布爾值通常用于JS中的控制結(jié)構(gòu)中
    • 任意JS的值都可以轉(zhuǎn)換為布爾值。(undefined、null、0、-0、NaN、“”//空字符串)這些值都會(huì)被轉(zhuǎn)換成false。所有其他的值,包括所有對(duì)象(數(shù)組)都會(huì)轉(zhuǎn)換成true??梢赞D(zhuǎn)換為false的值有時(shí)稱做“假值”,反之稱為“真值”
    • 布爾值包含toString()方法,這個(gè)不重要的API可以將布爾值轉(zhuǎn)換為字符串
    • “&&”運(yùn)算符執(zhí)行了邏輯與(AND)操作。當(dāng)且僅當(dāng)兩個(gè)操作數(shù)都是真值時(shí)才返回true
    • “||”運(yùn)算符是布爾或(OR)操作
    • “!”一元操作符執(zhí)行了布爾非(NOT)操作
  • null和undefined
    • null是JS語(yǔ)言的關(guān)鍵字,表示一個(gè)特殊值,用來(lái)描述“空值”。對(duì)null執(zhí)行typeof預(yù)算,結(jié)果返回字符串“object”,也就是說(shuō),可以將null認(rèn)為是一個(gè)特殊的對(duì)象值,含義是“非對(duì)象”。通常認(rèn)為null是它自有類(lèi)型的唯一一個(gè)成員,它可以表示數(shù)字、字符串和對(duì)象是“無(wú)值”的。
    • undefined不是JS語(yǔ)言的關(guān)鍵字,它與null一樣表示空缺。用未定義的值表示更深層次的“空值”。它是變量的一種取值,表明變量沒(méi)有初始化。typeof運(yùn)算符得到undefined的類(lèi)型,則返回“undefined”,表明這個(gè)值是這個(gè)類(lèi)型的唯一成員
    • null與undefined是不同的,但是它們都是表示“值的空缺”,兩者往往可以互換。判斷相等運(yùn)算符“==”認(rèn)為兩者是相等的(喲啊使用嚴(yán)格相等運(yùn)算符“===”來(lái)區(qū)分它們)。它們都不包括任何屬性和方法。使用”.“和”[]“來(lái)存取這兩個(gè)值的成員或方法都會(huì)產(chǎn)生一個(gè)類(lèi)型錯(cuò)誤
    • 或許可以認(rèn)為undefined是系統(tǒng)級(jí)的,出乎意料的或類(lèi)似錯(cuò)誤的值的空缺,而null是表示程序集的、正常的或在意料之中的值的空缺。如果對(duì)他們進(jìn)行操作,賦值給變量或者屬性,或作為參數(shù)傳入函數(shù),最佳選擇是使用null
  • 全局對(duì)象
    • 當(dāng)JS解釋器啟動(dòng)時(shí)或者在任何Web瀏覽器加載新頁(yè)面的時(shí)候,它將創(chuàng)建一個(gè)新的全局對(duì)象,并給它一組定義的初始屬性
      • 全局屬性,比如undefined、Infinity和NaN
      • 全局函數(shù),比如isNaN()、parseInt()
      • 構(gòu)造函數(shù),比如Date()、RegExp()、String()、Object()和Array()
      • 全局對(duì)象,比如Math和JSON
    • 全局對(duì)象的初始屬性并不是保留字,但它們應(yīng)該當(dāng)作保留字來(lái)對(duì)待
    • 客戶端JS來(lái)講,Windows對(duì)象定義了一些額外的全局屬性
    • 在代碼的最頂級(jí)——不再任何函數(shù)內(nèi)的JS代碼——可以使用JS關(guān)鍵字this來(lái)引用全局對(duì)象
    • 在客戶端JS中,在其表示的瀏覽器窗口中的所有JS代碼中,Window對(duì)象充當(dāng)了全局對(duì)象。
  • 包裝對(duì)象
    • JS對(duì)象是一種復(fù)合值,它是屬性或已命名值的集合。通過(guò)”.”符號(hào)來(lái)引用屬性值。當(dāng)屬性值是一個(gè)函數(shù)的時(shí)候,稱其為方法。通過(guò)o.m()來(lái)調(diào)用對(duì)象o中的方法
    • 字符串也同樣具有屬性和方法,字符串不是對(duì)象,但是有屬性。只要引用了字符串的屬性,JS就會(huì)將字符串s值通過(guò)調(diào)用new String(s)的方式轉(zhuǎn)換成對(duì)象,這個(gè)對(duì)象繼承了字符串的方法,并被用來(lái)處理屬性的引用。一旦屬性引用結(jié)束,這個(gè)新創(chuàng)建的對(duì)象就會(huì)銷(xiāo)毀。
    • 同字符串一樣,數(shù)字和布爾值也具有各自的方法:通過(guò)Number()和Boolean()構(gòu)造函數(shù)創(chuàng)建一個(gè)臨時(shí)對(duì)象。null和undefined沒(méi)有包裝對(duì)象,訪問(wèn)它們的屬性會(huì)造成一個(gè)類(lèi)型錯(cuò)誤
    • “==”等于運(yùn)算符將原始值和其包裝對(duì)象視為相等,當(dāng)“===”全等運(yùn)算符將它們視為不相等,使用typeof運(yùn)算符可以看到原始值和其包裝對(duì)象的不同
  • 不可變的原始值和可變的對(duì)象引用
    • JS中的原始值(undefined、null、布爾值、數(shù)字和字符串)與對(duì)象(包括數(shù)組和函數(shù))有著本質(zhì)的區(qū)別。
    • 原始值是不可更改的,任何方法都無(wú)法更改一個(gè)原始值
    • 對(duì)數(shù)字和布爾值來(lái)說(shuō)改變數(shù)字的值本身就說(shuō)不通,對(duì)字符串來(lái)說(shuō),不那么明顯,看起來(lái)字符串組成像是對(duì)各字符的數(shù)組,我們期望通過(guò)制定索引下標(biāo)來(lái)修改字符串中的字符。實(shí)際上JS是禁止這樣做的,字符串所有方法看上去返回了一個(gè)修改后的字符串,實(shí)際上返回的是一個(gè)新的字符串值
    • 原始值的比較是值的比較,只有在它們的值相等時(shí)它們才會(huì)相等
    • 如果比較兩個(gè)單獨(dú)的字符串,當(dāng)且僅當(dāng)它們的長(zhǎng)度相等且每個(gè)索引的字符都相等時(shí),JS才認(rèn)為他們相等
    • 對(duì)象和原始值不同,它們是可變的——它們的值也是可修改的
    • 對(duì)象的比較并非值的比較,即使兩個(gè)對(duì)象包含同樣的屬性及相同的值,它們也是不相等的,各個(gè)索引元素完全相等的兩個(gè)數(shù)組也不相等
    • 通常稱對(duì)象為引用類(lèi)型,以此來(lái)和JS基本類(lèi)型區(qū)分開(kāi)
    • 對(duì)象值都是引用,對(duì)象的比較是引用的比較
    • 當(dāng)且僅當(dāng)它們引用同一個(gè)基對(duì)象時(shí),它們才相等
    • 將數(shù)組或?qū)ο筚x值給一個(gè)變量,僅僅是賦值的引用,對(duì)象本身并沒(méi)有復(fù)制一次
  • 類(lèi)型轉(zhuǎn)換
    • JS取值非常靈活,從布爾值可以看出,當(dāng)JS期望使用一個(gè)布爾值的時(shí)候,可以提供任意類(lèi)型值,JS將根據(jù)需要自行轉(zhuǎn)換類(lèi)型
  • 顯示類(lèi)型轉(zhuǎn)換
    • JS可以自動(dòng)做許多類(lèi)型轉(zhuǎn)換,但為了代碼變得清晰易讀而做的顯示轉(zhuǎn)換
    • 顯示類(lèi)轉(zhuǎn)換最簡(jiǎn)單的方法使用Boolean()、Number()、String()或Object()函數(shù)
  • 對(duì)象轉(zhuǎn)換為原始值
    • 所有對(duì)象繼承了兩個(gè)轉(zhuǎn)換方法。
    • toString()
      • 第一個(gè)是toString(),它的作用是返回一個(gè)反映這個(gè)對(duì)象的字符串
      • 很多類(lèi)定義了更多特定版本的toString()
      • 數(shù)組類(lèi)的toString()方法,將每個(gè)數(shù)組元素轉(zhuǎn)換為一個(gè)字符串,并在元素之間添加都好后合并成結(jié)果字符串
      • 函數(shù)類(lèi)的toString()方法,返回這個(gè)函數(shù)的實(shí)現(xiàn)定義的表示方式,通常是將用戶定義的函數(shù)轉(zhuǎn)換為JS源代碼字符串
      • 日期類(lèi)的toString()方法,返回一個(gè)可讀的日期和時(shí)間字符串
      • RegExp類(lèi)的toString()方法,將RegExp對(duì)象轉(zhuǎn)換為表示正則表達(dá)式直接量的字符串
    • valueOf()
      • 這個(gè)方法任務(wù)并未詳細(xì)定義,如果存在任意原始值,它就默認(rèn)將對(duì)象轉(zhuǎn)換為表示它的原始值
      • 對(duì)象是復(fù)合值,而且大多數(shù)對(duì)象無(wú)法真正表示為一個(gè)原始值,因此簡(jiǎn)單的valueOf()方法簡(jiǎn)單的返回對(duì)象本身,而不是返回一個(gè)原始值
  • 重復(fù)聲明與遺漏聲明
    • 使用var語(yǔ)句重復(fù)聲明變量是合法且無(wú)害的。如果重復(fù)聲明帶有初始化器,那么這就跟一條簡(jiǎn)單的賦值語(yǔ)句沒(méi)什么兩樣
    • 如果試圖讀取一個(gè)沒(méi)有聲明的變量值JS會(huì)報(bào)錯(cuò)
    • 給一個(gè)沒(méi)有聲明的變量賦值也會(huì)報(bào)錯(cuò)
  • 變量作用域
    • 變量的作用域是程序源代碼中定義這個(gè)變量的區(qū)域
    • 全局變量擁有全局作用域
    • 函數(shù)體內(nèi)聲明的變量作用域是局部性的,它們只在函數(shù)體內(nèi)有定義
  • 函數(shù)作用域和聲明提前
    • JS沒(méi)有塊級(jí)作用域,JS取而代之的使用了函數(shù)作用域
    • JS的函數(shù)作用域是指在函數(shù)內(nèi)聲明的所有變量在函數(shù)體內(nèi)始終可見(jiàn),意味著變量在聲明之前已經(jīng)可用,JS的這個(gè)特性被非正式的成為聲明提前,即JS函數(shù)里聲明的所有變量(但不涉及賦值)都被“提前”至函數(shù)體的頂部
  • 作為屬性的變量
    • 當(dāng)聲明一個(gè)JS全局變量時(shí),實(shí)際上是定義了全局對(duì)象的一個(gè)屬性
    • 當(dāng)使用var聲明一個(gè)變量時(shí),創(chuàng)建的這個(gè)屬性是不可配置的,也就是說(shuō)這個(gè)變量無(wú)法通過(guò)delete運(yùn)算符刪除
    • JS全局變量是全局對(duì)象的屬性,這是ECMASscript規(guī)范中強(qiáng)制規(guī)定的,對(duì)于局部變量則沒(méi)有如此規(guī)定
    • ECMAScript 5 規(guī)范稱“聲明上下文對(duì)象”,JS可以允許使用this關(guān)鍵字來(lái)引用全局對(duì)象,卻沒(méi)有方法可以引用局部變量中存放的對(duì)象。這種存放局部變量的對(duì)象的特有性質(zhì),是一種對(duì)我們不可見(jiàn)的內(nèi)部實(shí)現(xiàn)。
  • 作用域鏈(未完全理解)
    • JS是基于詞法作用域的語(yǔ)言:通過(guò)閱讀包含變量定義在內(nèi)的數(shù)行源碼就能知道變量的作用域。
    • 全局變量在程序中始終都是有定義的
    • 局部變量在聲明它的函數(shù)體內(nèi)以及其所嵌套的函數(shù)內(nèi)始終是有定義的
    • /*
    • 如果將一個(gè)局部變量看做是自定義實(shí)現(xiàn)的對(duì)象的屬性的話,那么可以換個(gè)角度來(lái)解讀變量作用域。
    • 每一段JS代碼(全局代碼或函數(shù))都有一個(gè)與之關(guān)聯(lián)的作用域鏈。
    • 這個(gè)作用域鏈?zhǔn)且粋€(gè)對(duì)象列表或者鏈表,這組對(duì)象定義了這段代碼“作用域中”的變量。
    • 當(dāng)JS需要查找變量x的值的時(shí)候(這個(gè)過(guò)程稱做變量解析),它會(huì)從鏈接中的第一個(gè)對(duì)象開(kāi)始查找,如果這個(gè)對(duì)象有名為x的屬性,則會(huì)直接使用這個(gè)屬性的值,如果第一個(gè)對(duì)象中不存在名為x的屬性,JS會(huì)繼續(xù)查找鏈接的下一個(gè)對(duì)象。
    • 如果第二個(gè)對(duì)象依然沒(méi)有名為x的屬性,則會(huì)繼續(xù)查找下一個(gè)對(duì)象,以此類(lèi)推
    • 如果作用域鏈就上沒(méi)有任何一個(gè)對(duì)象含有屬性x,那么就認(rèn)為這段代碼的作用域鏈接上不存在x,并最終拋出一個(gè)引用錯(cuò)誤異常
    • */
    • /*
    • 在JS的最頂層代碼中(也就是不包含在任何函數(shù)定義的代碼),作用域鏈由一個(gè)全局對(duì)象組成
    • 在不包含嵌套的函數(shù)體內(nèi),作用域鏈上有兩個(gè)對(duì)象,第一個(gè)是定義函數(shù)參數(shù)和局部變量的對(duì)象,第二個(gè)是全局對(duì)象
    • 在一個(gè)嵌套的函數(shù)體內(nèi),作用域鏈上至少有三個(gè)對(duì)象
    • 理解對(duì)象鏈的創(chuàng)建規(guī)則是非常重要的
    • 當(dāng)定義一個(gè)函數(shù)時(shí),它實(shí)際上保存一個(gè)作用域鏈。
    • 當(dāng)調(diào)用這個(gè)函數(shù)時(shí),它創(chuàng)建一個(gè)新的對(duì)象來(lái)存儲(chǔ)它的局部變量,并將這個(gè)對(duì)象添加至保存的那個(gè)作用域鏈上,同時(shí)創(chuàng)建一個(gè)新的更長(zhǎng)的表示函數(shù)調(diào)用作用域的“鏈”
    • 對(duì)于嵌套函數(shù)來(lái)講,每次調(diào)用外部函數(shù)時(shí),內(nèi)部函數(shù)又會(huì)重新定義一遍。因?yàn)槊看握{(diào)用外部函數(shù)的時(shí)候,作用域鏈都是不同的
    • 內(nèi)部函數(shù)在每次定義的時(shí)候都有微妙的差別,在每次調(diào)用外部函數(shù)的時(shí)候,每部函數(shù)的代碼都是相同的,而且關(guān)聯(lián)這段代碼的作用域也不相同
表達(dá)式和運(yùn)算符
  • 表達(dá)式JS中的一個(gè)短語(yǔ),JS解釋器會(huì)將其計(jì)算出一個(gè)結(jié)果
  • 常量、變量名都是一種簡(jiǎn)單的表達(dá)式
  • 復(fù)雜表達(dá)式是由簡(jiǎn)單表達(dá)式組成的
  • 簡(jiǎn)單表達(dá)式組合成復(fù)雜表達(dá)式最常用的方法就是使用運(yùn)算符。根據(jù)運(yùn)算符規(guī)則返回一個(gè)值
  • 原始表達(dá)式
    • 最簡(jiǎn)單的表達(dá)式是“原始表達(dá)式”
    • 原始表達(dá)式是表達(dá)式的最小單位,它們不再包含其他表達(dá)式
    • JS原始表達(dá)式包含常量、關(guān)鍵字、變量
  • 對(duì)象和數(shù)組的初始化表達(dá)式
  • 函數(shù)定義表達(dá)式
  • 屬性訪問(wèn)表達(dá)式
  • 調(diào)用表達(dá)式
  • 對(duì)象創(chuàng)建表達(dá)式
  • 省略部分。。。。。。
語(yǔ)句
  • 表達(dá)式在JS中是短語(yǔ),那么語(yǔ)句就是JS整句或命令
  • 語(yǔ)句塊的結(jié)尾不需要分號(hào)。塊中的原始語(yǔ)句必須以分號(hào)結(jié)束,但語(yǔ)句塊不需要
  • 語(yǔ)句塊中的縮進(jìn),這不是必須的,但能增強(qiáng)代碼的可閱讀性
  • JS中沒(méi)有塊級(jí)作用域,在語(yǔ)句塊中聲明的變量并不是語(yǔ)句私有的
對(duì)象
  • 對(duì)象是JS的基本數(shù)據(jù)類(lèi)型
  • 對(duì)象是一種復(fù)合值
  • 對(duì)象也可看做是屬性的無(wú)序集合,每個(gè)屬性都是一個(gè)名/值對(duì)
  • 屬性名是字符串,因此我們可以把對(duì)象看成是對(duì)字符串到值的映射
  • 這種基本數(shù)據(jù)類(lèi)型還有很多叫法,有些我們已然非常熟悉,比如散列、散列表、字典、關(guān)聯(lián)數(shù)組
  • 然而對(duì)象不僅僅是字符串到值的映射,除了可以保持自有的屬性,JS對(duì)象還可以從一個(gè)稱為原型的對(duì)象繼承屬性
  • 對(duì)象的方法通常是繼承的屬性,這種“原型式繼承”是JS的核心特征
  • JS對(duì)象是動(dòng)態(tài)的可以增刪屬性
  • 除了字符串、數(shù)字、true、false、unll、undefined之外,JS中的值都是對(duì)象
  • 對(duì)象最常見(jiàn)的用法是創(chuàng)建、設(shè)置、查找、刪除、檢測(cè)、枚舉它的屬性
  • 屬性包括名字和值
  • 屬性名可以是包含空字符串在內(nèi)的任意字符串
  • 對(duì)象中不能存在兩個(gè)同名的屬性
  • 值可以是任意JS值,或者(在ECMASscript5中)可以是一個(gè)getter或setter函數(shù)
  • 除了名字和值之外,每個(gè)屬性還有一些與之相關(guān)的值,稱為“屬性特性”
  • 屬性特性
    • 可寫(xiě),表明是否餓可以設(shè)置該屬性的值
    • 可枚舉,表明是否可以通過(guò)for/in循環(huán)返回該屬性
    • 可配置,表明是否可以刪除或修改該屬性
  • 對(duì)象特性
    • 對(duì)象的原型,指向另為一個(gè)對(duì)象,本對(duì)象的屬性繼承自它的原型對(duì)象
    • 對(duì)象的類(lèi),是一個(gè)標(biāo)識(shí)對(duì)象類(lèi)型的字符串
    • 對(duì)象的擴(kuò)展標(biāo)記,指明了(在ECMAScript 5中)是否可以向該對(duì)象添加新屬性
  • 三類(lèi)JS對(duì)象的兩類(lèi)屬性作區(qū)分
    • 內(nèi)置對(duì)象,是由ECMAScript規(guī)范定義的對(duì)象或類(lèi)。例如數(shù)組、函數(shù)、日期、增則表達(dá)式
    • 宿主對(duì)象,是由JS解釋器所嵌入的宿主環(huán)境(比如Web瀏覽器)定義的
    • 自定義對(duì)象,是由運(yùn)行中的JS代碼創(chuàng)建的對(duì)象
    • 自有屬性,是直接在對(duì)象中定義的屬性
    • 繼承屬性,是在對(duì)象的原型對(duì)象中定義的屬性
  • 創(chuàng)建對(duì)象
    • 對(duì)象直接量
    • 關(guān)鍵字new創(chuàng)建
    • Object.create()函數(shù)創(chuàng)建
  • 對(duì)象直接量
    • 創(chuàng)建對(duì)象直接量最簡(jiǎn)單的方式就是在JS代碼中使用對(duì)象直接量
    • 對(duì)象直接量是由若干名/值對(duì)組成的映射表
    • 屬性名可以是JS標(biāo)識(shí)符也可以是字符串直接量(包括空字符串)
    • 對(duì)象之間量是一個(gè)表達(dá)式,這個(gè)表達(dá)式的每次運(yùn)算都創(chuàng)建并初始化一個(gè)新的對(duì)象
    • 每次計(jì)算對(duì)象之間量的時(shí)候,也都會(huì)計(jì)算它的每個(gè)屬性值
    • 重復(fù)調(diào)用的函數(shù)中的循環(huán)體內(nèi)使用了對(duì)象直接量,它將創(chuàng)建很多新對(duì)象,并且每次創(chuàng)建的對(duì)象的屬性值也有可能不同
  • 通過(guò)new創(chuàng)建對(duì)象
    • new運(yùn)算符創(chuàng)建并初始化一個(gè)新對(duì)象
    • 關(guān)鍵字new后跟隨一個(gè)函數(shù)調(diào)用,這里的函數(shù)稱做構(gòu)造函數(shù)
    • JS語(yǔ)言核心中的原始類(lèi)型都包含內(nèi)置構(gòu)造函數(shù)
  • 原型
    • 每一個(gè)JS對(duì)象(null除外)都和另一個(gè)對(duì)象相關(guān)聯(lián),就是原型,每一個(gè)對(duì)象都從原型繼承屬性
    • 所有對(duì)象直接量創(chuàng)建的對(duì)象都具有同一個(gè)原型對(duì)象,并可以通過(guò)JS代碼Object.prototype獲得對(duì)原型對(duì)象的引用
    • 通過(guò)new和構(gòu)造函數(shù)調(diào)用創(chuàng)建的對(duì)象的原型就是狗找函數(shù)的prototype屬性的值
    • 沒(méi)有原型的對(duì)象為數(shù)不多,Object.prototype就是其中之一
  • Object.create()
    • Object.create()是一個(gè)靜態(tài)函數(shù),而不是提供給某個(gè)對(duì)象調(diào)用的方法
    • 可以傳入?yún)?shù)null創(chuàng)建一個(gè)沒(méi)有原型的新對(duì)象,這種方式創(chuàng)建的對(duì)象不會(huì)繼承任何東西,甚至不包括基礎(chǔ)方法,比如toString(),也就是說(shuō)它將不能和“+”運(yùn)算符一起正常工作
  • 屬性的查詢和設(shè)置
  • 作為關(guān)聯(lián)數(shù)組的對(duì)象
    • 第一種語(yǔ)法使用點(diǎn)運(yùn)算符和一個(gè)標(biāo)識(shí)符運(yùn)算符,這和C和Java中訪問(wèn)一個(gè)結(jié)構(gòu)體或?qū)ο蟮撵o態(tài)字段非常類(lèi)似
    • 第二種語(yǔ)法使用方括號(hào)和一個(gè)字符串,看起來(lái)更像數(shù)組,這個(gè)素組元素是通過(guò)字符串索引而不是數(shù)字索引,這種數(shù)組就是關(guān)聯(lián)數(shù)組,也稱散列、映射、字典
  • 繼承(未完全理解)
    • JS對(duì)象具有“自有屬性”,也有一些屬性從原型對(duì)象繼承而來(lái)
    • 假設(shè)o對(duì)象的屬性x賦值,如果o中已經(jīng)有屬性x(這個(gè)屬性不是繼承來(lái)的),那么這個(gè)賦值操作只會(huì)改變這個(gè)已有屬性x的值
    • 如果o中不存在屬性x,那么賦值操作給o添加一個(gè)新屬性x
    • 如果之前o繼承自有屬性x,那么這個(gè)繼承的屬性就被新創(chuàng)建的同名屬性覆蓋了
    • 屬性賦值操作首先檢查原型鏈,以此判斷是否允許賦值操作
    • 如果o繼承自一個(gè)只讀屬性x,那么賦值操作是不允許的,如果允許賦值操作,它也總是在原始對(duì)象上創(chuàng)建屬性或?qū)σ延械膶傩再x值,而不會(huì)去修改原型鏈
    • 在JS中,只有在查詢屬性時(shí)才會(huì)體會(huì)到繼承的存在,而設(shè)置屬性則和繼承無(wú)關(guān),這是JS的一個(gè)重要特性,該特性讓程序員可以有選擇地覆蓋繼承的屬性
    • 屬性賦值要么失敗,要么創(chuàng)建一個(gè)屬性,要么在原始對(duì)象中設(shè)置屬性,但有一個(gè)例外,如果o繼承自屬性x,而這個(gè)屬性是一個(gè)具有setter方法的accessor屬性,那么這時(shí)將調(diào)用setter方法而不是給o創(chuàng)建一個(gè)屬性x
    • 需要注意的是,setter方法是由對(duì)象o調(diào)用的,而不是定義這個(gè)屬性的原型對(duì)象調(diào)用的。因此如果setter方法定義任意屬性,這個(gè)操作只是針對(duì)o本身,并不會(huì)修改原型鏈
  • 屬性訪問(wèn)錯(cuò)誤
    • 屬性訪問(wèn)并不總是返回或設(shè)置一個(gè)值
    • 查詢一個(gè)不存在的屬性并不會(huì)報(bào)錯(cuò),查找對(duì)象自有屬性或繼承的屬性中均為找到屬性,屬性訪問(wèn)表達(dá)式返回undefined
    • 如果對(duì)象不存在,那么試圖查詢這個(gè)不存在對(duì)象的屬性就會(huì)報(bào)錯(cuò),因?yàn)檎业綄?duì)象返回的是undefined而unll與undefind都沒(méi)有屬性
    • 給unll和undefined設(shè)置屬性也會(huì)報(bào)類(lèi)型錯(cuò)誤
    • 對(duì)象自有屬性是只讀的,不能給只讀屬性重新賦值(defineProperty()方法中有一個(gè)例外,可以對(duì)可配置的只讀屬性重新賦值)
    • 對(duì)象繼承自有屬性,且它是只讀的,不同通過(guò)同名自有屬性覆蓋只讀的繼承屬性
    • 免去其它不可賦值情況下,對(duì)象的可擴(kuò)展性是false,那么不能定義新屬性
  • 刪除屬性
    • delete運(yùn)算符可以刪除對(duì)象的屬性
    • delete運(yùn)算符只是斷開(kāi)屬性和宿主對(duì)象的聯(lián)系,而不會(huì)去操作屬性中的屬性
    • delete運(yùn)算符只能刪除自有屬性,不能刪除繼承屬性(要?jiǎng)h除繼承屬性必須從定義這個(gè)屬性的原型對(duì)象上刪除它,而且這會(huì)影響到所有繼承自這個(gè)原型的對(duì)象)
    • 當(dāng)刪除一個(gè)嵌套對(duì)象,由于刪除的屬性引用依然存在,可能因?yàn)檫@種不嚴(yán)謹(jǐn)?shù)拇a而造成內(nèi)存泄漏。所有在銷(xiāo)毀對(duì)象的時(shí)候,要遍歷屬性中的屬性,依次刪除
    • 當(dāng)delete表達(dá)式刪除成或沒(méi)有副作用(比如刪除不存在的屬性)時(shí),它返回true,如果delete后不是一個(gè)屬性訪問(wèn)表達(dá)式(比如 delete 1),同樣返回true
    • delete不能刪除那些可配置性為false的屬性(盡管可以刪除不可擴(kuò)展對(duì)象的可配置屬性)。
  • 檢測(cè)屬性
    • in——in與那算符左側(cè)是屬性名(字符串),右側(cè)是對(duì)象。如果對(duì)象自有屬性或繼承屬性中包含這個(gè)屬性則返回true
    • hasOwnProperty()——方法用來(lái)檢測(cè)給定的名字是否是對(duì)象的自有屬性。對(duì)于繼承屬性它將返回false
    • propertyIsEnumerable()——是hasOwnProperty()增強(qiáng)版,只有檢測(cè)到是自有屬性且這個(gè)屬性的可枚舉性為true時(shí)它才返回true。通常由JS代碼創(chuàng)建的屬性都是可枚舉的,除非使用特定方法改變屬性的可枚舉性
    • !==——比較值
    • 有一種場(chǎng)景必須使用in運(yùn)算符,當(dāng)對(duì)象值為undefined時(shí)
  • 枚舉屬性
    • 許多實(shí)用工具庫(kù)給Object.prototype添加了新的方法或?qū)傩?,這些屬性方法可以被所有對(duì)象繼承并使用
    • for/in循環(huán)可以在循環(huán)體中遍歷對(duì)象中所有可枚舉的屬性(包括自有屬性和繼承的屬性),把屬性名稱賦值給循環(huán)變量。
    • 對(duì)象繼承的內(nèi)置方法不可枚舉的,但在代碼中給對(duì)象添加的屬性都是可枚舉的(除非轉(zhuǎn)為成不可枚舉)
    • ECMAScript 5中定義了兩個(gè)用以枚舉屬性名稱的函數(shù)Object.keys()、Object.getOwnPropertyNames()
  • 屬性getter和setter
  • * 屬性的特性
    • 除了包含名字和值之外,屬性還包含一些標(biāo)識(shí)它們可寫(xiě)、可枚舉、可配置的特性
    • 可以認(rèn)為一個(gè)屬性包含一個(gè)名字和4個(gè)特性。數(shù)據(jù)屬性的4個(gè)特性分別是它的值、可寫(xiě)性、可枚舉性、可配置性
    • 存取屬性不具有值特性和可寫(xiě)性,它們的可寫(xiě)性是由setter方法存在于否決定的。因此存取器屬性的4個(gè)特性是讀取、寫(xiě)入、可枚舉、可配置
    • 為了實(shí)現(xiàn)屬性特性的查詢和設(shè)置操作,ECMAScript 5中定義了一個(gè)名為“屬性描述符”的對(duì)象,這個(gè)對(duì)象代表那4個(gè)特性
    • 描述對(duì)象的屬性和它們所描述的屬性特性是同名的。因此,數(shù)據(jù)屬性的描述符對(duì)象的屬性有value、writable、enumerable、configurable
    • 存取器屬性的描述符對(duì)象則用get、set屬性代替value和writable,其中writable、enumerable和configurable都是布爾值
    • 通過(guò)調(diào)用Object.getOwnPropertyDescriptor()可以獲得某個(gè)對(duì)象特定屬性的屬性描述符
    • getOwnPropertyDescriptor()只能得到自有屬性的描述符,想要得到繼承屬性的特性需要遍歷原型鏈
    • 通過(guò)definePeoperty()設(shè)置屬性的特性,屬性秒速符對(duì)象不必包含所有4個(gè)特性。這個(gè)方法要么修改已有屬性要么新建自有屬性,但不能修改繼承屬性
    • 如果要同時(shí)修改或創(chuàng)建多個(gè)屬性,則需要使用Object.defineProperties()
    • 如果對(duì)象是不可擴(kuò)展的,則可以編輯已有的自有屬性,但不能給它添加新屬性
    • 如果屬性是不可配置的,則不能修改它的可配置性和可枚舉性
    • 如果存取器屬性是不可配置的,則不能修改其getter和setter方法,也不能將它轉(zhuǎn)換為數(shù)據(jù)屬性
    • 如果數(shù)據(jù)屬性是不可配置的,則不能將它轉(zhuǎn)換為存取器屬性
    • 如果數(shù)據(jù)屬性是不可配置的,則不能將它的可寫(xiě)性從false修改為true,但可以從true修改為false
    • 如果數(shù)據(jù)屬性是不可配置且不可寫(xiě)的,則不能修改它的值。然而可配置但不可寫(xiě)屬性的值是可以修改的(實(shí)際上是先將它標(biāo)記為可寫(xiě)的,然后修改它的值,最后轉(zhuǎn)換為不可寫(xiě)的)
  • 對(duì)象的三個(gè)屬性
    • 每一個(gè)對(duì)象都有與之相關(guān)的原型、類(lèi)、可擴(kuò)展性
    • 原型屬性
      • 對(duì)象的原型屬性是用來(lái)繼承屬性的
      • 原型屬性是在實(shí)例對(duì)象創(chuàng)建之初就設(shè)置好的
      • 通過(guò)對(duì)象之間量創(chuàng)建的對(duì)象使用Object.prototype作為它們的原型
      • 通過(guò)new構(gòu)造函數(shù)創(chuàng)建的對(duì)象使用構(gòu)造函數(shù)的prototype屬性作為它們的原型
      • 通過(guò)object.create()創(chuàng)建的對(duì)象使用第一個(gè)參數(shù)(也可以是null)作為它們的原型
      • 在ECMScript 5中,將對(duì)象作為參數(shù)傳入Object.getPrototypeOf()可以查詢它的原型
      • 通過(guò)new表達(dá)式創(chuàng)建的對(duì)象,通常繼承一個(gè)constructor屬性,這個(gè)屬性指代創(chuàng)建這個(gè)對(duì)象的構(gòu)造函數(shù)
      • 通過(guò)直接量與object.creat創(chuàng)建的對(duì)象包含一個(gè)名為constructor的屬性,這個(gè)屬性指代Object構(gòu)造函,因此,constructor.prototype才是對(duì)象直接量的真正原型,但對(duì)于object.create()創(chuàng)建的對(duì)象則往往不是這樣
      • 使用isPrototypeOf()方法,檢測(cè)一個(gè)對(duì)象是否是另一個(gè)對(duì)象的原型
      • isPrototypeOf()函數(shù)實(shí)現(xiàn)的功能與instanceof運(yùn)算符非常類(lèi)似
      • _proto_,可設(shè)置對(duì)象的原型,但是應(yīng)用不廣泛,不推薦使用
    • 類(lèi)屬性
      • 對(duì)象的類(lèi)屬性是一個(gè)字符串,用以表示對(duì)象的類(lèi)型信息ECMAS 3與5都未提供設(shè)置個(gè)屬性的方法,并只有一種間接方法可以查詢它。默認(rèn)的toString()方法
      • 很多對(duì)象繼承的toString()方法被重寫(xiě)了,為了能調(diào)用正確版本的toString,必須間接的調(diào)用Function.call()方法
      • 通過(guò)內(nèi)置構(gòu)造函數(shù)創(chuàng)建的對(duì)象包含“類(lèi)屬性”,它與構(gòu)造函數(shù)名稱相匹配
      • 通過(guò)對(duì)象直接量和Object.create創(chuàng)建的對(duì)象的類(lèi)屬性是‘object’,自定義構(gòu)造函數(shù)創(chuàng)建的對(duì)象也是一樣,因此對(duì)于自定義函數(shù)來(lái)說(shuō),沒(méi)辦法通過(guò)類(lèi)屬性類(lèi)區(qū)分對(duì)象的類(lèi)
    • 可擴(kuò)展性
      • 對(duì)象的可擴(kuò)展性用以表示是否可以給對(duì)象添加新屬性,所有內(nèi)置對(duì)象和自定義對(duì)象都是顯式可擴(kuò)展的
      • ECMAScript 5 定義了用來(lái)查詢和設(shè)置對(duì)象可擴(kuò)展性的函數(shù)。Object.esExtensible()判斷是否可擴(kuò)展
      • 將對(duì)象轉(zhuǎn)換為不可擴(kuò)展的,需要調(diào)用Object.preventExtensions(),一旦將對(duì)象轉(zhuǎn)換為不可擴(kuò)展的,就無(wú)法再將其轉(zhuǎn)換回可擴(kuò)展,并且只影響對(duì)象本身的可擴(kuò)展性
      • 給一個(gè)不可擴(kuò)展的原型對(duì)象添加屬性,這個(gè)不可擴(kuò)展對(duì)象同樣會(huì)繼承這些新屬性
      • Object.seal()和Object.preventExtensions()類(lèi)似,除了能夠?qū)?duì)象設(shè)置為不可擴(kuò)展的,還可以將對(duì)象的所有自有屬性都設(shè)置為不可配置的。也就是說(shuō)不能給這個(gè)對(duì)象添加新屬性,而且它已有的屬性也不能刪除或配置,不過(guò)它已有的可寫(xiě)屬性依然可以設(shè)置。
      • 對(duì)于已經(jīng)封閉的對(duì)象是不能解封的??梢允褂肙bject.isSealed()來(lái)檢查對(duì)象是否封閉
      • Object.freeze()將更嚴(yán)格的鎖定對(duì)象——“凍結(jié)”。除了將對(duì)象設(shè)置不可擴(kuò)展和不可配置外,還可以將它已有數(shù)據(jù)屬性設(shè)置為只讀(如果對(duì)象的存取器屬性具有setter方法,存取器屬性將不受影響,仍可以通過(guò)屬性賦值調(diào)用它們)。使用Object.isFrozen()來(lái)檢測(cè)對(duì)象是否凍結(jié)
      • preventExtensions()seal()freeze()都返回傳入的對(duì)象,也就是說(shuō),可以通過(guò)函數(shù)嵌套的方式調(diào)用它們
    • 序列化對(duì)象
      • 序列化對(duì)象是指將對(duì)象的狀態(tài)轉(zhuǎn)換為字符串,也可將字符串還原為對(duì)象
      • ECMAScript 5 提供了內(nèi)置函數(shù)JSON.stringify()和JSON.parse()用來(lái)序列化和還原JS對(duì)象
      • JSON語(yǔ)法是JS語(yǔ)法的子集,并不能表示JS所有對(duì)象
      • 子集
        • 大多數(shù)代碼都會(huì)定義它們的子集,用以更安全的方式執(zhí)行第三方代碼
        • 子集的設(shè)計(jì)目的是在容器或“沙箱”中更安全的運(yùn)行不可信的第三方JavaScript代碼
        • 所有能破壞這個(gè)沙箱并影響全局執(zhí)行環(huán)境的語(yǔ)言特性和API在這個(gè)安全子集中都是禁止的
        • 為了讓代碼靜態(tài)的通過(guò)JavaScript安全檢查,必須移除一些JavaScript特性
          • 禁止使用this,因?yàn)樵冢ǚ菄?yán)格模式中)this訪問(wèn)全局變量
            • 嚴(yán)格模式
              • 嚴(yán)格模式是將更好的的錯(cuò)誤檢查引入代碼中的方法
              • 嚴(yán)格模式時(shí),無(wú)法使用隱式聲明的變量、將賦值給只讀屬性或?qū)傩蕴砑拥讲豢蓴U(kuò)展的對(duì)象等
              • 消除JS代碼中一些不合理、不嚴(yán)謹(jǐn)之處,減少代碼怪異行為
              • 程序或函數(shù)開(kāi)頭使用use strict 來(lái)聲明嚴(yán)格模式
          • with、帶.或[]表達(dá)式、function、windows和對(duì)Document的引用
      • 支持對(duì)象、數(shù)組、字符串、無(wú)窮大數(shù)字、true、false和null,并可以序列化和反序列化
      • NaN/Infinity和-Infinity序列化的結(jié)果是null
      • RegExp、Error對(duì)象和undefined值不能序列化和還原
      • JSON.stringify()只能序列化對(duì)象可枚舉的自有屬性
      • 對(duì)于不能序列化的屬性來(lái)說(shuō),在序列化后的輸出字符串中會(huì)將這個(gè)屬性省略掉
      • stringify()parse都可以接受第二個(gè)可選參數(shù),通過(guò)傳入需要序列化或還原的屬性列表來(lái)定制自定義的序列化或還原操作
    • 對(duì)象方法
    • toString方法
      • toString方法沒(méi)有參數(shù),返回一個(gè)表示調(diào)用這個(gè)方法的對(duì)象值的字符串
      • 很多類(lèi)都帶有自自定義的toString方法
    • toLocaleString方法
      • 除了基本的tostring方法外,對(duì)象都包含toLocaleString方法,這個(gè)方法返回一個(gè)表示這個(gè)對(duì)象的本地字符串
      • Date、Number類(lèi)對(duì)toLocaleString方法做了定制
    • valueOf
      • valueOf與toString非常類(lèi)似,當(dāng)JS需要將對(duì)象轉(zhuǎn)換為某種原始值而非字符串的時(shí)候才會(huì)調(diào)用它,尤其轉(zhuǎn)換為數(shù)字的時(shí)候
      • 在需要使用原始值的地方使用了對(duì)象,JS就會(huì)自動(dòng)調(diào)用這個(gè)方法
× 數(shù)組
  • 數(shù)組是值的有序集合
  • 每個(gè)值叫做一個(gè)元素,每個(gè)元素在數(shù)組中有一個(gè)位置,以數(shù)字表示,稱為索引
  • 數(shù)組可以是任何類(lèi)型,并且同一個(gè)數(shù)組中的不同元素也可能有不同的類(lèi)型
  • 數(shù)組的元素甚至也可能是對(duì)象或其他數(shù)組,這允許創(chuàng)建復(fù)雜的數(shù)據(jù)結(jié)構(gòu)
  • JS數(shù)組的索引是基于零的32位數(shù)值
  • JS數(shù)組是動(dòng)態(tài)的,根據(jù)需要他們會(huì)增長(zhǎng)或縮減,并且在創(chuàng)建數(shù)組時(shí)無(wú)需聲明一個(gè)固定大小或者在數(shù)組大小變化時(shí)無(wú)需重新分配空間
  • JS數(shù)組可能是稀疏的,數(shù)組元素的索引不一定要連續(xù)的,它們之間可以有空缺
  • 每個(gè)JS數(shù)組都有一個(gè)length屬性。針對(duì)非稀疏數(shù)組該元素就是數(shù)組元素的個(gè)數(shù)
  • 針對(duì)稀疏數(shù)組,length比所有元素的索引要大
  • JS數(shù)組是JS對(duì)象的特殊形式
  • 通常,數(shù)組的實(shí)現(xiàn)是經(jīng)過(guò)優(yōu)化的,用數(shù)字索引來(lái)訪問(wèn)數(shù)組元素一般來(lái)說(shuō)比訪問(wèn)常規(guī)對(duì)象屬性要快很多
  • 數(shù)組繼承自Array.prototype中的屬性,它定義了一套豐富的數(shù)組操作方法
  • 數(shù)組直接量中的值不一定是常量,可以是任意表達(dá)式
  • 它可以包含對(duì)象直接量或其他數(shù)組直接量
  • 如果省略數(shù)組直接量中的某個(gè)值,省略的元素將被賦予undefined值
  • 數(shù)組直接量的語(yǔ)法允許有可選的結(jié)尾的逗號(hào)
  • 調(diào)用構(gòu)造函數(shù) Array()是創(chuàng)建數(shù)組的另一種方法,這種形式可以預(yù)分配一個(gè)數(shù)組空間,但數(shù)組中沒(méi)有存儲(chǔ)值,甚至數(shù)組的索引屬性還未定義
  • 數(shù)組的特別之處在于,當(dāng)使用小于2的32次方的非負(fù)整數(shù)作為屬性名時(shí)數(shù)組會(huì)自動(dòng)維護(hù)其length屬性值
  • 所有數(shù)組都是對(duì)象,可以為其創(chuàng)建任意名字的屬性。但如果使用的屬性是數(shù)組的索引,數(shù)組的特殊行為就是將根據(jù)需要更新它們的length屬性值
  • 可以使用負(fù)數(shù)或非整數(shù)來(lái)索引數(shù)組。在這種情況下,數(shù)值轉(zhuǎn)換為字符串,字符串作屬性名來(lái)用。既然名字不是非負(fù)整數(shù),它就只能當(dāng)作常規(guī)的對(duì)象屬性,而非數(shù)組的索引
  • 使用了是非負(fù)整數(shù)的字符串,它就當(dāng)作數(shù)組索引,而非對(duì)象屬性
  • 數(shù)組索引僅僅是對(duì)象屬性名的一種特殊類(lèi)型,這意味著JS數(shù)組沒(méi)有“越界”錯(cuò)誤的概念
  • 當(dāng)試圖查詢?nèi)魏螌?duì)象中不存在的屬性時(shí),不會(huì)報(bào)錯(cuò),只會(huì)得到undefined值。類(lèi)似對(duì)象,對(duì)于對(duì)象同樣存在這種情況
  • 既然數(shù)組是對(duì)象,那么它們可以從原型中繼承元素。在ECMASscript 5中,數(shù)組可以定義元素的getter和setter方法
  • 如果一個(gè)元素確實(shí)繼承了元素或使用了元素的getter和setter方法,訪問(wèn)這種數(shù)組的元素的時(shí)間會(huì)與常規(guī)對(duì)象屬性的查找時(shí)間相近
  • 訪問(wèn)數(shù)組
    • 數(shù)組是對(duì)象的特殊形式。使用方括號(hào)訪問(wèn)數(shù)組元素就像用方括號(hào)訪問(wèn)對(duì)象的屬性一樣
    • JS將指定的數(shù)字索引轉(zhuǎn)換成字符串——索引值1變成“1”——然后將其作為屬性名來(lái)使用
    • 對(duì)于常規(guī)JS對(duì)象也可以使用方括號(hào)來(lái)操作
  • 創(chuàng)建數(shù)組
    • 直接量創(chuàng)建
    • new Array()構(gòu)造函數(shù)創(chuàng)建
  • × 數(shù)組元素的添加和刪除
    • push()方法在數(shù)組末尾增加一個(gè)或多個(gè)元素
    • unshift()方法在數(shù)組的首部插入一個(gè)元素,并且將其他元素依次移到跟高的索引處
    • delete 直接刪除數(shù)組某個(gè)元素,并不影響數(shù)組長(zhǎng)度
    • 數(shù)組有pop方法(它和push()一起使用),后者一次使減少長(zhǎng)度1并返回被刪除元素的值
    • shift方法(它和unshift一起使用),從數(shù)組頭部刪除一個(gè)元素。和delete不同的是shift方法將所有元素下移到比當(dāng)前索引低1的地方
  • 稀疏數(shù)組
    • 稀疏數(shù)組就是包含從0開(kāi)始的不連續(xù)索引的數(shù)組
    • 通常數(shù)組中的length屬性值代表數(shù)組中元素的個(gè)數(shù)。如果數(shù)組是稀疏的,length屬性值大于元素的個(gè)數(shù)
    • 可以用delete操作符來(lái)生產(chǎn)稀疏數(shù)組
    • 足夠稀疏的數(shù)組通常在實(shí)現(xiàn)上比稠密的數(shù)組更慢、內(nèi)存利用率更高,在這一的數(shù)組中查找元素的時(shí)間與常規(guī)對(duì)象屬性的查找時(shí)間一樣長(zhǎng)
    • 通過(guò)數(shù)組刪除 Array.shift() 或 Array.pop()  splice() 不會(huì)產(chǎn)生稀疏數(shù)組
  • 數(shù)組長(zhǎng)度
    • 每個(gè)數(shù)組有一個(gè)length屬性,就是這個(gè)屬性使其區(qū)別于常規(guī)的JS對(duì)象
    • 在數(shù)組中肯定找不到一個(gè)元素的索引值大于或等于它的長(zhǎng)度。為了維持此規(guī)則不變化,數(shù)組有兩個(gè)特殊的行為
    • 1:當(dāng)為數(shù)組元素賦值,他的索引i大于或等于現(xiàn)有數(shù)組長(zhǎng)度時(shí),length屬性的值將設(shè)置i+1
    • 2:設(shè)置length屬性為一個(gè)小于當(dāng)前長(zhǎng)度的非負(fù)整數(shù)n時(shí),當(dāng)前數(shù)組中那些索引值大于或等于n的元素將從中刪除
    • 如果讓一個(gè)數(shù)組元素不能配置,就不能刪除它。如果不能刪除它,length屬性不嫩設(shè)置為小于不可配置元素的索引值
  • 數(shù)組的遍歷
    • for
      • 這是遍歷數(shù)組最常用的方法
      • 在嵌套循環(huán)或其他性能非常重要的上下文中,可以看到這種基本的數(shù)組遍歷需要優(yōu)化,數(shù)組的長(zhǎng)度應(yīng)該只查詢一次而非每次循環(huán)都要查詢
    • for/in
      • 自動(dòng)處理稀疏數(shù)組
      • 循環(huán)每次將一個(gè)可枚舉的屬性名(包括數(shù)組索引)賦值給循環(huán)變量。不存在的所有將不會(huì)被遍歷
      • ECMAScript規(guī)范允許for/in循環(huán)以不同的孫旭遍歷對(duì)象的屬性。通常數(shù)組元素的遍歷實(shí)現(xiàn)是升序的,但不能保證一定是這樣。特別地,如果數(shù)組同時(shí)擁有對(duì)象屬性和數(shù)組元素,返回的屬性名很可能是按照創(chuàng)建的順序而非數(shù)值的大小順序。如果算法依賴于遍歷順序,那么不推薦這種遍歷方法
    • forEach
      • ECMAScript 5定義了一些遍歷數(shù)組元素的新方法,按照索引的順序按個(gè)傳遞給定義的一個(gè)函數(shù)。這些方法中最常用的就是forEach
  • 多維數(shù)組
    • JS不支持真正的多維數(shù)組,但可以用數(shù)組的數(shù)組來(lái)近似。
  • × 數(shù)組方法
  • join
    • Array.join()方法將數(shù)組中所有元素都轉(zhuǎn)化為字符串并連接在一起,返回最后生成的字符串
    • 可以指定一個(gè)可選的字符串在生產(chǎn)的字符串中來(lái)分割數(shù)組的各個(gè)元素。如果不指定分割符,默認(rèn)使用逗號(hào)
    • join是string.split方法的逆向操作,后者是將字符串分割成若干塊來(lái)創(chuàng)建一個(gè)數(shù)組
  • reverse
    • 將數(shù)組中的元素顛倒順序,返回逆序的數(shù)組
    • 它不通過(guò)重新排列的元素創(chuàng)建新的數(shù)組,而是在原先的數(shù)組中重新排序它們
  • sort
    • Array.sort()方法將數(shù)組中的元素排序并返回排序后的數(shù)組。當(dāng)不帶參數(shù)調(diào)用sort()時(shí),數(shù)組元素以字母表順序排序
    • 如果數(shù)組包含undefined元素,它們會(huì)被排到數(shù)組的尾部
  • concat
    • Array.concat()創(chuàng)建并返回一個(gè)新數(shù)組
  • slice
    • Array.slice()返回指定數(shù)組的一個(gè)片段或子數(shù)組
  • splice
    • Array.splice()方法是在數(shù)組中插入或刪除元素的通用方法
  • push和pop
    • 允許將數(shù)組當(dāng)作棧來(lái)使用
  • unshift和shift
    • 行為非常類(lèi)似于push和pop,不一樣的是前者在數(shù)組的頭部而非尾部進(jìn)行元素的插入和刪除操作
  • toString和toLocalString
    • 數(shù)組和其他JS對(duì)象一樣擁有toString方法
  • forEach
    • 從頭至尾遍歷數(shù)組,為每個(gè)元素調(diào)用指定的函數(shù)
  • map
  • filter
  • every和some
  • reduce和reduceRight
  • indexOf和astIndexOf
  • 數(shù)組類(lèi)型
  • 類(lèi)數(shù)組對(duì)象
  • 作為數(shù)組的字符串
函數(shù)
  • 函數(shù)是這樣一段JS代碼,它只定義一次,但可能被執(zhí)行或調(diào)用任意次
  • JS函數(shù)是參數(shù)化的,函數(shù)的定義包括一個(gè)稱為形參的標(biāo)識(shí)符列表,這些參數(shù)在函數(shù)體內(nèi)像局部變量一樣工作
  • 函數(shù)調(diào)用會(huì)為形參提供實(shí)參的值
  • 函數(shù)使用它們實(shí)參的值來(lái)計(jì)算返回值,成為該函數(shù)調(diào)用表達(dá)式的值
  • 除了實(shí)參之外,每次調(diào)用還會(huì)擁有另一個(gè)值——本次調(diào)用的上下文——這就是this關(guān)鍵字的值
  • 函數(shù)掛載在一個(gè)對(duì)象上,作為對(duì)象的一個(gè)屬性,就稱它為對(duì)象的方法。當(dāng)通過(guò)這個(gè)對(duì)象來(lái)調(diào)用函數(shù)時(shí),該對(duì)象就是此次調(diào)用的上下文,也就是該函數(shù)的this的值
  • 用于初始化一個(gè)新創(chuàng)建的對(duì)象的函數(shù)稱為構(gòu)造函數(shù)
  • 在JS里,函數(shù)即對(duì)象,程序可以隨意操控它們,比如可以把函數(shù)賦值給變量,或者作為參數(shù)傳遞給其他函數(shù)。因?yàn)楹瘮?shù)就是對(duì)象,所有可以給它們?cè)O(shè)置屬性,甚至調(diào)用它們的方法
  • JS的函數(shù)可以嵌套在其他函數(shù)中定義,這樣它們就可以訪問(wèn)它們被定義是所處的作用域中的任何變量。這意味著JS函數(shù)構(gòu)成了一個(gè)閉包。它給JS帶來(lái)了非常強(qiáng)勁的編程能力
  • 形參和實(shí)參的區(qū)別,形參相當(dāng)于函數(shù)中定義的變量,實(shí)參是在運(yùn)行時(shí)的函數(shù)調(diào)用時(shí)傳入的參數(shù)
  • 函數(shù)定義
    • 函數(shù)使用function關(guān)鍵字來(lái)定義,它可以用在函數(shù)定義表達(dá)式或者函數(shù)聲明語(yǔ)句里。在兩種形式中,函數(shù)定義都從function關(guān)鍵字開(kāi)始,其后跟隨這些組成部分
  • 嵌套函數(shù)
    • 有趣之處在于它們的變量作用域規(guī)則:它們可以訪問(wèn)嵌套它們(或多重嵌套)的函數(shù)的參數(shù)和變量
  • 函數(shù)調(diào)用
    • 作為函數(shù)
    • 作為方法
    • 作為構(gòu)造函數(shù)
    • 通過(guò)它們的call()和apply()方法間接調(diào)用
  • 方法調(diào)用
    • 一個(gè)方法無(wú)非就是保存在一個(gè)對(duì)象的屬性里的函數(shù)。這里的函數(shù)表達(dá)式本身就是一個(gè)屬性訪問(wèn)表達(dá)式,這意味著該函數(shù)被當(dāng)作一個(gè)方法,而不是普通函數(shù)
    • 方法調(diào)用與函數(shù)調(diào)用有一個(gè)重要的區(qū)別,即,調(diào)用上下文。屬性訪問(wèn)表達(dá)式由兩部分組成,一個(gè)對(duì)象和屬性名稱。
    • 方法和this關(guān)鍵字是面向?qū)ο缶幊谭独暮诵?/li>
    • 任何函數(shù)只要作為方法調(diào)用實(shí)際上都會(huì)傳入一個(gè)隱式的實(shí)參——這個(gè)實(shí)參是一個(gè)對(duì)象,方法調(diào)用的母體就是這個(gè)對(duì)象,方法調(diào)用的語(yǔ)法已經(jīng)清晰表明了函數(shù)將基于一個(gè)對(duì)象進(jìn)行操作
    • this是一個(gè)關(guān)鍵字,不是變量,也不是屬性名。JS的語(yǔ)法不允許給this賦值
    • 和變量不同,this關(guān)鍵字沒(méi)有作用域的限制,嵌套函數(shù)不會(huì)從調(diào)用它的函數(shù)中繼承this
    • 如果嵌套函數(shù)作為方法調(diào)用,其this的值指向調(diào)用它的對(duì)象。如果嵌套函數(shù)作為函數(shù)調(diào)用,其this值不是全局對(duì)象(非嚴(yán)格模式下)就是undefined(嚴(yán)格模式下)
  • 方法鏈
    • 當(dāng)方法返回值是一個(gè)對(duì)象,這個(gè)對(duì)象還可以再調(diào)用它的方法
  • 構(gòu)造函數(shù)調(diào)用
    • 如果函數(shù)或者方法調(diào)用之前帶有關(guān)鍵字new,它就構(gòu)造函數(shù)調(diào)用。
    • 構(gòu)造函數(shù)調(diào)用和普通函數(shù)調(diào)用以及方法調(diào)用在實(shí)參處理、調(diào)用上下文和返回值方面都有不同
    • 如果構(gòu)造函數(shù)調(diào)用在圓括號(hào)內(nèi)包含一組實(shí)參列表,先計(jì)算這些實(shí)參表達(dá)式,然后傳入函數(shù)內(nèi),這和函數(shù)調(diào)用和方法調(diào)用是一致的。如果構(gòu)造函數(shù)沒(méi)有形參調(diào)用都可以省略圓括號(hào)
    • 構(gòu)造函數(shù)調(diào)用創(chuàng)建一個(gè)新的空對(duì)象,這個(gè)對(duì)象繼承自構(gòu)造函數(shù)的prototype屬性。構(gòu)造函數(shù)試圖初始化這個(gè)新創(chuàng)建的對(duì)象,并將這個(gè)對(duì)象用作其調(diào)用的上下文,因此構(gòu)造函數(shù)可以使用this關(guān)鍵字來(lái)引用這個(gè)新創(chuàng)建的對(duì)象
    • 構(gòu)造函數(shù)通常不使用關(guān)鍵字return,它們通常初始化新對(duì)象,當(dāng)構(gòu)造函數(shù)的函數(shù)體執(zhí)行完畢時(shí),它會(huì)顯示返回
    • 如果構(gòu)造函數(shù)使用return語(yǔ)句但沒(méi)有指定返回值,或者返回一個(gè)原始值,那么這時(shí)將忽略返回值,同時(shí)使用這個(gè)新對(duì)象作為調(diào)用結(jié)果
  • 間接調(diào)用
    • JS中的函數(shù)也是對(duì)象,和其他JS對(duì)象沒(méi)什么兩樣,函數(shù)對(duì)象也可以包含方法。其中兩個(gè)方法call和apply()可以用來(lái)間接調(diào)用函數(shù)。兩個(gè)方法都允許顯示指定調(diào)用所需的this值,也就是說(shuō)任何函數(shù)可以作為任何對(duì)象的方法來(lái)調(diào)用,哪怕這個(gè)函數(shù)不是那個(gè)對(duì)象的方法。兩個(gè)方法都可以指定調(diào)用的實(shí)參
  • 函數(shù)的實(shí)參和形參
    • JS中的函數(shù)定義并 未指定函數(shù)形參的類(lèi)型,函數(shù)調(diào)用也未對(duì)傳入的實(shí)參值做任何類(lèi)型檢查。
    • JS函數(shù)調(diào)用甚至不檢查傳入形參的個(gè)數(shù)
  • 可選形參
    • /*optional*/來(lái)強(qiáng)調(diào)形參是可選的
  • 可變長(zhǎng)的實(shí)參列表:實(shí)參對(duì)象
    • 當(dāng)調(diào)用函數(shù)的時(shí)候傳入的實(shí)參個(gè)數(shù)超過(guò)函數(shù)定義是的形參個(gè)數(shù)時(shí),沒(méi)有辦法直接獲得未命名值的引用
    • 在函數(shù)體內(nèi),標(biāo)識(shí)符arguments是指向?qū)崊?duì)象的引用,實(shí)參對(duì)象是一個(gè)類(lèi)數(shù)組對(duì)象
    • arguments并不是真正的數(shù)組,他是一個(gè)實(shí)參對(duì)象。每個(gè)實(shí)參對(duì)象都包含以數(shù)字為索引的一組元素以及l(fā)ength屬性,但并不是真正的數(shù)組??梢岳斫鉃榕銮删哂袛?shù)字為索引的屬性
  • callee和caller屬性
  • 非標(biāo)準(zhǔn)的,但是大多瀏覽器都有實(shí)現(xiàn),通過(guò)caller屬性可以訪問(wèn)調(diào)用棧
  • 將對(duì)象屬性用作實(shí)參
    • 當(dāng)一個(gè)函數(shù)包含超過(guò)三個(gè)形參時(shí),對(duì)程序員來(lái)說(shuō),要記住嗲用函數(shù)中實(shí)參的正確順序非常頭疼。通過(guò)傳入對(duì)象可以簡(jiǎn)化這一步
  • 作為函數(shù)的值
    • 函數(shù)可以定義,也可調(diào)用,這時(shí)函數(shù)最重要的特性
    • 函數(shù)定義和調(diào)用是JS的詞法特性
    • JS中函數(shù)不僅是一種語(yǔ)法,也是值,可以將函數(shù)賦值給變量,存儲(chǔ)在對(duì)象的屬性或數(shù)組的元素中,作為參數(shù)傳入另外一個(gè)函數(shù)等
  • 自定義函數(shù)屬性
    • JS中的函數(shù)并不是原始值,而是一種特殊的對(duì)象,也就是說(shuō)函數(shù)可以擁有屬性
  • 作為命名空間的函數(shù)
    • 函數(shù)作用域的概念:在函數(shù)中聲明的變量在函數(shù)體內(nèi)都是可見(jiàn)的(包括在嵌套函數(shù)中),在函數(shù)的外部是不可見(jiàn)的
    • JS中無(wú)法聲明只在一個(gè)代碼塊內(nèi)部可見(jiàn)的變量,基于這個(gè)原因,我們常常是用函數(shù)用作臨時(shí)命名空間,在這個(gè)命名空間內(nèi)定義的變量都不會(huì)污染到全局命名空間
  • × 閉包
    • JS采用詞法作用域,函數(shù)的執(zhí)行依賴于變量作用域,這個(gè)作用域是在函數(shù)定義時(shí)決定的,而不是函數(shù)調(diào)用時(shí)決定的
    • JS函數(shù)對(duì)象內(nèi)部不僅包含函數(shù)的代碼邏輯,還必須引用當(dāng)前的作用域鏈
    • 函數(shù)對(duì)象通過(guò)作用域鏈互關(guān)聯(lián)起來(lái),函數(shù)體內(nèi)部的變量都可以保存在函數(shù)作用域內(nèi),這種特性在計(jì)算機(jī)科學(xué)文獻(xiàn)中稱為“閉包”
    • 從技術(shù)角度將,所有JS函數(shù)都是閉包:它們都是對(duì)象,它們都關(guān)聯(lián)到作用域鏈
    • 定義大多數(shù)函數(shù)時(shí)的作用域鏈在調(diào)用函數(shù)時(shí)依然有效,但這并不影響閉包
    • 待更新........
  • 函數(shù)屬性、方法和構(gòu)造函數(shù)
  • length屬性
    • arguments.length表示傳入函數(shù)的實(shí)參的個(gè)數(shù)。而函數(shù)本身的length屬性是只讀的,它代表函數(shù)定義時(shí)形參的數(shù)量
  • prototype屬性
    • 每一個(gè)函數(shù)都包含一個(gè)prototype屬性,這個(gè)屬性指向一個(gè)對(duì)象的引用,這個(gè)對(duì)象稱作“原型對(duì)象”
  • call方法和apply方法
  • bind方法
  • toString方法
  • function構(gòu)造函數(shù)
  • 可調(diào)用的對(duì)象
  • 函數(shù)式編程
    • JS并非函數(shù)式編程語(yǔ)言
    • JS中可以向操作對(duì)象一樣操控函數(shù),也就是說(shuō)可以在JS中應(yīng)用函數(shù)式編程技術(shù)
  • 使用函數(shù)處理數(shù)組
    • 高階函數(shù)就是操作函數(shù)的函數(shù),它接收一個(gè)或多個(gè)函數(shù)作為參數(shù),并返回一個(gè)新函數(shù)
  • 高階函數(shù)
  • 不完全函數(shù)
  • 記憶
類(lèi)和模塊
  • 在JS中可以定義對(duì)象的類(lèi),讓每個(gè)對(duì)象都共享某些屬性
  • 在JS中類(lèi)的實(shí)現(xiàn)是基于其原型繼承機(jī)制的
  • 兩個(gè)實(shí)例都從同一個(gè)原型對(duì)象繼承了屬性,我們說(shuō)他們是同一個(gè)類(lèi)的實(shí)例
  • 如果兩個(gè)對(duì)象繼承自同一個(gè)原型,往往意味著(擔(dān)不是絕對(duì))它們是由同一個(gè)構(gòu)造函數(shù)創(chuàng)建并初始化
  • JS中類(lèi)的一個(gè)重要特性是“動(dòng)態(tài)可繼承”
  • 類(lèi)和原型
    • 在JS中,類(lèi)的所有實(shí)例對(duì)象都從同一個(gè)原型對(duì)象上繼承屬性,因此,原型對(duì)象是類(lèi)的核心
  • 類(lèi)和構(gòu)造函數(shù)
    • 構(gòu)造函數(shù)是用來(lái)初始化新創(chuàng)建的對(duì)象的
    • 調(diào)用構(gòu)造函數(shù)的一個(gè)重要特征是,構(gòu)造函數(shù)的prototype屬性被用做新對(duì)象的原型。這意味著同一個(gè)構(gòu)造函數(shù)創(chuàng)建的所有對(duì)象都繼承自一個(gè)相同的對(duì)象,因此他們都是同一個(gè)類(lèi)的成員
  • 構(gòu)造函數(shù)和類(lèi)的標(biāo)識(shí)
    • 原型對(duì)象是類(lèi)的唯一標(biāo)識(shí),當(dāng)且僅當(dāng)兩個(gè)對(duì)象繼承自同一個(gè)原型對(duì)象時(shí),它們才是屬于同一個(gè)類(lèi)的實(shí)例。而初始化的構(gòu)造函數(shù)則不能作為類(lèi)的標(biāo)識(shí),兩個(gè)構(gòu)造函數(shù)的prototype屬性可能指向同一個(gè)原型對(duì)象。那么這兩個(gè)構(gòu)造函數(shù)有創(chuàng)建的實(shí)例屬于同一個(gè)類(lèi)
    • 構(gòu)造函數(shù)是類(lèi)的“外在表現(xiàn)”。構(gòu)造函數(shù)名字通常用做類(lèi)名
    • instanceof的語(yǔ)法強(qiáng)化了“構(gòu)造函數(shù)是類(lèi)的公有標(biāo)識(shí)”概念
  • constructor屬性
    • 任何JS函數(shù)都可以用作構(gòu)造函數(shù),并且調(diào)用構(gòu)造函數(shù)是需要用到一個(gè)prototye屬性的
    • 每個(gè)JS函數(shù)(ECMAScript5中的Function.bind()方法返回的函數(shù)除外)都自動(dòng)擁有一個(gè)prototype屬性。這個(gè)屬性的值是一個(gè)對(duì)象,這個(gè)對(duì)象包含唯一一個(gè)不可枚舉屬性constructor。constructor屬性值是一個(gè)函數(shù)對(duì)象
  • JS中Java式的類(lèi)繼承
    • 構(gòu)造函數(shù)對(duì)象
      • 構(gòu)造函數(shù)(對(duì)象)為JS類(lèi)定義名字。任何添加到這個(gè)構(gòu)造函數(shù)對(duì)象中的屬性都是類(lèi)字段和類(lèi)方法(如果屬性值是函數(shù)的話就是類(lèi)方法)
    • 原型對(duì)象
      • 原型對(duì)象的屬性被類(lèi)的所有實(shí)例所繼承,如果原型對(duì)象的屬性值是函數(shù)的話,這個(gè)函數(shù)就作為類(lèi)的實(shí)例的方法來(lái)調(diào)用
    • 實(shí)例對(duì)象
      • 類(lèi)的每個(gè)實(shí)例都是一個(gè)獨(dú)立的對(duì)象,直接給這個(gè)實(shí)例定義屬性是不會(huì)為所有實(shí)例對(duì)象所共享的。定義在實(shí)例上的非函數(shù)屬性,實(shí)際上是實(shí)例的字段
    • JS中定義類(lèi)的步驟
      • 第一步,定義一個(gè)構(gòu)造函數(shù),并設(shè)置初始化新對(duì)象的實(shí)例屬性
      • 第二步,給構(gòu)造函數(shù)的prototype對(duì)象定義實(shí)例的方法
      • 第三步,給構(gòu)造函數(shù)定義類(lèi)字段和類(lèi)屬性
  • 類(lèi)的擴(kuò)充
    • JS中基于原型的繼承機(jī)制是動(dòng)態(tài)的,對(duì)象從其原型繼承屬性,如果創(chuàng)建對(duì)象之后原型的屬性發(fā)生變化,也會(huì)影響到繼承這個(gè)原型的所有實(shí)例對(duì)象
  • 類(lèi)和類(lèi)型
    • JS定義了少量的數(shù)據(jù)類(lèi)型:null、undefined、布爾值、數(shù)字、字符串、函數(shù)和對(duì)象
  • instanceof運(yùn)算符
    • 左操作符是待檢測(cè)其類(lèi)對(duì)象,右操作數(shù)是定義類(lèi)的構(gòu)造函數(shù)。返回布爾值,這里檢測(cè)繼承可以不是直接繼承

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類(lèi)似文章 更多