摘要:對(duì)之前看高級(jí)程序設(shè)計(jì)時(shí)沒(méi)有注意到的一些知識(shí)點(diǎn),結(jié)合本書做以補(bǔ)充語(yǔ)法注釋源于的型既可以出現(xiàn)在字符串字面量中,也可能出現(xiàn)在正則表達(dá)式字面量中,如故一般建議使用型注釋保留字語(yǔ)句變量參數(shù)屬性名運(yùn)算符和標(biāo)記等標(biāo)識(shí)符不允許使用保留字,此外在對(duì)象字面量中
語(yǔ)法對(duì)之前看《JavaScript高級(jí)程序設(shè)計(jì)》時(shí)沒(méi)有注意到的一些知識(shí)點(diǎn),結(jié)合本書做以補(bǔ)充
注釋
源于PL/I的/* */型既可以出現(xiàn)在字符串字面量中,也可能出現(xiàn)在正則表達(dá)式字面量中,如
/* var a = /a*/.match(s); */
故一般建議使用//型注釋
保留字
語(yǔ)句、變量、參數(shù)、屬性名、運(yùn)算符和標(biāo)記等標(biāo)識(shí)符不允許使用保留字,此外在對(duì)象字面量中,或用點(diǎn)運(yùn)算提取對(duì)象屬性時(shí),也都不能用保留字做屬性名
數(shù)字
JavaScript只有一種數(shù)字類型,即64位浮點(diǎn)數(shù)
字符串
1.JavaScript中所有的字符都是16位的
2.轉(zhuǎn)義字符可以將反斜線,引號(hào),和控制字符等不被允許的字符插入到字符串中
3.u用來(lái)約定指定數(shù)字字符編碼"A"==="u0041"
4.字符串一旦被創(chuàng)建就無(wú)法被改變,只能通過(guò)+等操作符創(chuàng)建新字符串
語(yǔ)句
1.JavaScript中的代碼塊{}不會(huì)創(chuàng)建新的作用域,故變量應(yīng)該定義在函數(shù)的頭部,而不是代碼塊中
2.被當(dāng)做假的值false,null," ",0,NaN
3.JavaScript不允許在return關(guān)鍵字和表達(dá)式之間換行,也不允許在break關(guān)鍵字和標(biāo)簽之間換行
定義
JavaCript中的對(duì)象是可變的鍵控集合,是屬性的容器,屬性名可以是包括空字符串在內(nèi)的任意字符串,屬性值是除undefined值之外的任何值
對(duì)象字面量
一個(gè)對(duì)象字面量就是包圍在一對(duì)花括號(hào)中的零個(gè)或多個(gè)名/值對(duì),其中若 屬性是合法的JavaScript標(biāo)識(shí)符(字母開頭,加數(shù)字、下劃線組成)且不是保留字,則并不強(qiáng)制要求加引號(hào)
對(duì)象值得檢索
屬性名為非合法的JavaScript標(biāo)識(shí)符,需用[]來(lái)讀值,為合法的標(biāo)識(shí)符且不是保留字,則也可以用.來(lái)讀值,通常更傾向于.,因?yàn)槠湫矢吒o湊,嘗試從undefined的成員屬性中讀值會(huì)導(dǎo)致TypeError異常,如
flight.equipment // undefined flight.equipment.model // throw "TypeErrpr"
引用
對(duì)象通過(guò)引用傳遞,不會(huì)被傳遞,換句話說(shuō)var a = {}; b = a;b則和a指向同一塊內(nèi)存
原型
何為委托?沿原型鏈查找的過(guò)程就是委托(ps:原型鏈的末端是Object.prototype)
反射
獲取對(duì)象上的屬性而不要原型中的屬性,使用hasOwnProperty()檢查,若為對(duì)象實(shí)例上的屬性,則會(huì)返回true
枚舉
for in 可用來(lái)遍歷一個(gè)對(duì)象上的所有屬性名(包括實(shí)例和原型),但需注意的是for in遍歷出來(lái)的屬性是無(wú)序的
刪除
delete無(wú)法刪除原型中的屬性
減少全局變量污染
措施:聲明一個(gè)全局變量,作為命名空間,然后將應(yīng)用資源都放到這個(gè)命名空間中,可以有效的減少與其他程序,組件,類庫(kù)的沖突
函數(shù)函數(shù)對(duì)象
Js中函數(shù)就是對(duì)象,連接到Function.prototype上,而Function.prototype則連接到Object.prototype上
函數(shù)字面量
函數(shù)字面量包含以下4個(gè)部分:
保留字:function
函數(shù)名:可省略,此外函數(shù)還可以通過(guò)函數(shù)名來(lái)進(jìn)行遞歸調(diào)用
形參:函數(shù)中的形參不會(huì)被如普通變量一樣被初始化為undefined,而是在函數(shù)被調(diào)用的時(shí)候被初始化為實(shí)參所提供的值
語(yǔ)句:包圍在花括號(hào)中的一組語(yǔ)句被稱為函數(shù)的主體
調(diào)用
在一個(gè)函數(shù)中調(diào)用另一個(gè)函數(shù),會(huì)暫停對(duì)當(dāng)前函數(shù)的執(zhí)行,并將控制權(quán)和參數(shù)傳遞給新函數(shù),此外每個(gè)函數(shù)還會(huì)接收兩個(gè)附加參數(shù)this和arguments(其中this的值取決于函數(shù)的調(diào)用模式)
函數(shù)的調(diào)用模式主要存在以下4種:
1.方法調(diào)用模式:函數(shù)被保存為一個(gè)對(duì)象的屬性時(shí),當(dāng)此函數(shù)被調(diào)用時(shí)this即指向該對(duì)象
2.函數(shù)調(diào)用模式:當(dāng)函數(shù)并非對(duì)象的屬性,就被當(dāng)做一個(gè)函數(shù)調(diào)用時(shí),this會(huì)被綁定到全局對(duì)象上,但這種設(shè)計(jì)在實(shí)際開發(fā)中會(huì)造成很多的不便,因此我們常會(huì)再聲明一個(gè)變量并將其賦值為this,如下:
var obj = {name:"aleen"}; obj.sayName = function(){ var that = this; var say = function(){ alert(that.name); } say(); } obj.sayName();
3.構(gòu)造器調(diào)用模式:使用new調(diào)用構(gòu)造函數(shù)時(shí),會(huì)創(chuàng)建一個(gè)連接到構(gòu)造函數(shù)prototype成員的新對(duì)象,并將函數(shù)中的this綁定到新對(duì)象上
4.Apply調(diào)用模式:因?yàn)镴s中的函數(shù)也是對(duì)象,所以函數(shù)也擁有方法,任何函數(shù)在調(diào)用時(shí)使用Apply方法,可以改變函數(shù)運(yùn)行時(shí)this的運(yùn)行對(duì)象(apply的第二個(gè)參數(shù)可傳入一個(gè)參數(shù)數(shù)組)
var obj = {age:21}; var sayName = function(){alert(this.age)} sayName.apply(obj);
參數(shù)
arguments:在函數(shù)內(nèi)部可以通過(guò)該變量訪問(wèn)所有在函數(shù)運(yùn)行時(shí)傳遞給函數(shù)的實(shí)參(包括沒(méi)有被形參接收的參數(shù)),但是注意arguments只是一個(gè)類數(shù)組的對(duì)象,擁有l(wèi)ength屬性,但并沒(méi)有任何數(shù)組方法
返回
一個(gè)函數(shù)總會(huì)返回一個(gè)值,如果沒(méi)指定值,則返回undefined,注意當(dāng)函數(shù)在調(diào)用時(shí)前面加上了new并且返回值不是一個(gè)對(duì)象,則返回新對(duì)象即this
異常處理
Js中可用throw來(lái)拋出異常
isNum = function(num){ if(typeof num != "number"){ throw { name:"type error", message:"there needs a number" } } } try{ isNum("a"); }catch(e){ document.writeln(e.name+";"+e.message); }
擴(kuò)充類型的功能
即使用prototype在原型上擴(kuò)充實(shí)例可以共享的方法,但有一點(diǎn)需注意的是——基本類型的原型是公用結(jié)構(gòu),所以在類庫(kù)混用時(shí)需小心使用,保險(xiǎn)的做法是只在確定沒(méi)有改方法時(shí)再添加它
遞歸
注意一些語(yǔ)言為尾遞歸提供了優(yōu)化,可以顯著提高速度,但Js并沒(méi)有提供尾遞歸的優(yōu)化,深度遞歸可能會(huì)因?yàn)槎褩R绯龆\(yùn)行失敗
尾遞歸示例:
var factorial = function factorial(i,a){ a = a||1; if(i<2){ return a; } return factorial(i-1,a*i); }; console.log(factorial(4));
作用域
沒(méi)有塊級(jí)作用域(ES6中已有塊級(jí)作用域了),故最好在函數(shù)頂部聲明所有函數(shù)體中可能用到的變量
閉包
一個(gè)函數(shù)可以訪問(wèn)它被創(chuàng)建時(shí)的上下文環(huán)境,即成為閉包
此外:要避免在循環(huán)中創(chuàng)建函數(shù)
回調(diào)
回調(diào)函數(shù)是異步處理的,故不會(huì)因?yàn)榫W(wǎng)絡(luò)傳輸或服務(wù)器響應(yīng)慢而導(dǎo)致客戶端出現(xiàn)假死狀態(tài)
模塊
簡(jiǎn)而言之:模塊是一個(gè)提供接口卻隱藏狀態(tài)和實(shí)現(xiàn)的函數(shù)或?qū)ο?br>一般形式:定義一個(gè)擁有私有變量和特權(quán)函數(shù)(特權(quán)函數(shù)利用閉包特性可以訪問(wèn)私有變量)的函數(shù),最后返回這個(gè)特權(quán)函數(shù)或者將其保存到一個(gè)可訪問(wèn)到的地方
級(jí)聯(lián)
級(jí)聯(lián)使得我們可以多帶帶在一條語(yǔ)句中依次調(diào)用同一個(gè)對(duì)象的很多方法
柯里化
簡(jiǎn)單來(lái)說(shuō),柯里化就是將函數(shù)與傳遞給它的參數(shù)相結(jié)合產(chǎn)生新的函數(shù)的過(guò)程
function add(a,b){ return a+b; } Function.prototype.curry = function(){ var slice = Array.prototype.slice, args = slice.apply(arguments), that = this; return function(){ return that.apply(null,args.concat(slice.apply(arguments))); }; } var add1 = add.curry(1); console.log(add1(6));
記憶
例如斐波那契
var fibonacci = function(n){ return n < 2 ? n : fibonacci(n-1)+fibonacci(n-1) }
頻繁遞歸調(diào)用會(huì)消耗極大的資源,因此可以采用記憶策略,將已經(jīng)計(jì)算過(guò)的值緩存起來(lái)
var fibonacci = function(){ var meno = [0,1]; var lib = function(n){ var result = meno[n]; if(typeof result !== "number"){ result = fib(n-1)+fib(n-2); meno[n]=result; } return result; } return fib; }();數(shù)組
JavaScript中的數(shù)組是一種類似于數(shù)組的對(duì)象,它將數(shù)組的下標(biāo)轉(zhuǎn)變成字符串,并用其作為屬性
數(shù)組字面量
數(shù)組字面量var num = [1,2,3];和對(duì)象字面量var num_obj = {"0":1,"1":2,"2",3}基本一致都是包含3個(gè)屬性的對(duì)象,但它們的原型不同,num的原型是Array.prototype而num_obj的原型是Object.prototype,故 num有length屬性而num_obj沒(méi)有
ps:不同于強(qiáng)類型的語(yǔ)言,Js中的數(shù)組元素可以是不同類型的值
長(zhǎng)度
1.Js中的length屬性是沒(méi)有上界的,當(dāng)使用大于或等于length的位置來(lái)存儲(chǔ)元素時(shí),不會(huì)發(fā)生數(shù)組越界錯(cuò)誤,而會(huì)自動(dòng)增加length的值以容納新元素
2.length屬性的值不一定等于數(shù)組里的屬性個(gè)數(shù),如
myArray[100]=true; myArray.length //101 //數(shù)組中只包含一個(gè)屬性
3.[]下標(biāo)運(yùn)算符會(huì)將所含表達(dá)式轉(zhuǎn)換為一個(gè)字符串,當(dāng)表達(dá)式有`toString方法時(shí),就使用該方法的值
4.JavaScript中的數(shù)組下標(biāo)必須是大于等于0并小于等于2的32次方-1的整數(shù)
5.設(shè)置更大的length不會(huì)給數(shù)組分配更多的空間,而把length設(shè)小將會(huì)導(dǎo)致所有下標(biāo)大于等于新length的屬性會(huì)被刪除
刪除
因?yàn)閿?shù)組也是對(duì)象,所以可以用delete來(lái)刪除數(shù)組中的元素,但它只會(huì)將那塊的值移除掉,而保留那塊的空間,故那塊的值就變成undefined了,因此常用splice方法來(lái)刪除元素,但此方法的特點(diǎn)在 刪除元素時(shí)是將被刪除的元素之后的元素全部移除,再不斷添加到新位置,這種做法對(duì)于大型數(shù)組來(lái)說(shuō)效率不高
枚舉
數(shù)組可用for in來(lái)枚舉元素,但它不會(huì)保證數(shù)組元素的順序,因此我們常用在枚舉時(shí)我們常用for循環(huán)
數(shù)組和對(duì)象的判斷
由于在Js中,數(shù)組和對(duì)象極易混淆,所以一個(gè)較好的判斷其類型的方法是:
var is_Array = function (value){ return Object.prototype.toString.apply(value).slice(8,-1) === "Array"; }
指定初始值
Js不會(huì)給數(shù)組元素預(yù)設(shè)初值,[]得到的新數(shù)組為空,訪問(wèn)一個(gè)不存在的元素則是undefined
代碼風(fēng)格1.代碼塊內(nèi)容和對(duì)象字面量縮進(jìn)4個(gè)空格
2.if和()之間放置一個(gè)空格
3.每個(gè)逗號(hào)和冒號(hào)后面都使用一個(gè)空格
4.在if和while這樣的結(jié)構(gòu)化語(yǔ)句里,始終使用代碼塊
5.將{放在一行的結(jié)尾,而不是第二行的開頭
6.盡量使程序具備自我說(shuō)明,并添加必要注釋,推薦行注釋
7.盡量在每個(gè)函數(shù)開始的地方,聲明所有變量
8.避免switch語(yǔ)句塊的條件穿越到下一條case
全局變量
代碼塊中沒(méi)有塊級(jí)作用域
自動(dòng)插入分號(hào),故應(yīng)該在將{放在上一行的尾部,而不是下一行的頭部
保留字,Js中的保留字不能用來(lái)做變量名和參數(shù),當(dāng)保留字被用作對(duì)象字面量的鍵值時(shí),必須用""括起來(lái),并用[]引用
糟粕文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/83595.html
摘要:但采用構(gòu)造器調(diào)用模式,即是使用了前綴去調(diào)用一個(gè)函數(shù)時(shí),函數(shù)執(zhí)行的方式會(huì)改變。對(duì)象包含構(gòu)造器需要構(gòu)造一個(gè)新的實(shí)例的所有信息。構(gòu)造器的變量和內(nèi)部函數(shù)變成了該實(shí)例的私有成員。 JavaScript 是一門弱類型語(yǔ)言,從不需要類型轉(zhuǎn)換。對(duì)象繼承關(guān)系變得無(wú)關(guān)緊要。對(duì)于一個(gè)對(duì)象來(lái)說(shuō)重要的時(shí)它能夠做什么,而不是它從哪里來(lái)。 閱讀《javascript語(yǔ)言精粹》筆記! 偽類 js的原型存...
摘要:前言由于最近的項(xiàng)目用到了一些的代碼,所以我?guī)е闷嫘模J(rèn)真閱讀了這本書,粗略地了解語(yǔ)言的基本結(jié)構(gòu)和特性,對(duì)于一些不熟悉的新概念,以記錄的形式加強(qiáng)印象,也是對(duì)學(xué)習(xí)的反思總結(jié)。 前言 由于最近的項(xiàng)目用到了一些js的代碼,所以我?guī)е闷嫘模J(rèn)真閱讀了這本書,粗略地了解js語(yǔ)言的基本結(jié)構(gòu)和特性,對(duì)于一些不熟悉的新概念,以記錄的形式加強(qiáng)印象,也是對(duì)學(xué)習(xí)的反思總結(jié)。 一、字面量(literals...
摘要:對(duì)象適用于匯集和管理數(shù)據(jù)。一個(gè)對(duì)象字面量就是包圍在一對(duì)花括號(hào)的多個(gè)名值對(duì)。嘗試從對(duì)象里取值將會(huì)導(dǎo)致異常。亦不會(huì)觸及原型鏈中的任何對(duì)象。嚴(yán)格模式下,不能用刪除顯式聲明的標(biāo)識(shí)符,名稱或具名函數(shù)。 Javascirpt里的對(duì)象是無(wú)類型的。它對(duì)新屬性的名字和屬性的值沒(méi)有任何的限制。對(duì)象適用于匯集和管理數(shù)據(jù)。對(duì)象可以包括其他對(duì)象,所以它們可以容易地表示成樹狀或者圖形結(jié)構(gòu)。 對(duì)象字面量 ...
摘要:在中數(shù)組是經(jīng)常被使用到的,我們除了要學(xué)習(xí)數(shù)組的方法,還需要了解誒一下某一些方法是如何來(lái)實(shí)現(xiàn)的。然而我看了語(yǔ)言精粹中方法的一章,想記錄下書上的代碼,以便加深印象。方法移除數(shù)組中的第一個(gè)元素并且放回該元素。 在js中數(shù)組是經(jīng)常被使用到的,我們除了要學(xué)習(xí)數(shù)組的方法,還需要了解誒一下某一些方法是如何來(lái)實(shí)現(xiàn)的。然而我看了《javascript語(yǔ)言精粹》中方法的一章,想記錄下書上的代碼,以便加深印...
摘要:語(yǔ)言精粹讀書筆記第四章函數(shù)函數(shù)字面量函數(shù)字面量包含個(gè)部分第一部分,保留字第二部分,函數(shù)名,它可以被忽略。這個(gè)超級(jí)延遲綁定使得函數(shù)對(duì)高度復(fù)用。構(gòu)造器調(diào)用模式一個(gè)函數(shù),如果創(chuàng)建的目的就是希望結(jié)合的前綴來(lái)調(diào)用,那它就被稱為構(gòu)造器構(gòu)造。 《JavaScript 語(yǔ)言精粹》 讀書筆記 第四章 函數(shù) Functions 函數(shù)字面量 函數(shù)字面量包含4個(gè)部分: 第一部分, 保留字 function...
閱讀 1417·2021-11-09 09:45
閱讀 1785·2021-11-04 16:09
閱讀 1449·2021-10-14 09:43
閱讀 1814·2021-09-22 15:24
閱讀 1589·2021-09-07 10:06
閱讀 1597·2019-08-30 14:15
閱讀 980·2019-08-30 12:56
閱讀 1563·2019-08-29 17:22