JavaScript高級(jí)程序設(shè)計(jì)(第三版)學(xué)習(xí)筆記1~5章
第2章,在html中使用JavaScript
Html引入外部js腳本
<script type="text/javascript" src="test.js">兩個(gè)</script>之間不應(yīng)放腳本,因?yàn)椴⒉粫?huì)被執(zhí)行</script>
<script>標(biāo)簽有一個(gè)defer屬性可以延遲腳本執(zhí)行,但是并不保證會(huì)按腳本排列順序執(zhí)行
建議:將腳本引入放在<body>標(biāo)簽的所有內(nèi)容之后,而不放在<head>標(biāo)簽中進(jìn)行引入,加快頁面響應(yīng)
<noscript></noscript>標(biāo)簽中的內(nèi)容會(huì)在瀏覽器不支持腳本或腳本被禁用的時(shí)候輸出,啟用了腳本的瀏覽器將不會(huì)看到標(biāo)簽中的
內(nèi)容
第3章,基本概念
標(biāo)識(shí)符
第一個(gè)字符必須是字母,下劃線(_)或美元符號(hào)($),有效命名為字母、數(shù)字、下劃線和美元符號(hào)構(gòu)成的
采用駝峰命名法:第一個(gè)字母小寫,后面的每個(gè)單詞首字母大寫
單行注釋:
//這是單行注釋
多行注釋:
/*這是
多行
注釋
*/
typeof 操作符
typeof – 判斷給定變量的數(shù)據(jù)類型
返回:
“undefined” – 未定義的數(shù)據(jù)類型
“boolean” – 布爾值
“string” – 字符串
“number” – 數(shù)值
“object” – 對(duì)象或者NULL
“function” – 函數(shù)
注:函數(shù)在js中是對(duì)象,不是數(shù)據(jù)類型,因此使用typeof區(qū)分函數(shù)和對(duì)象是有必要的
typeof在有些時(shí)候會(huì)返回令人迷惑但技術(shù)上確是正確的值,例如,null和對(duì)象,兩者都會(huì)返回“object”
null與undefined是相等的,null == undefined 將返回true
進(jìn)行算術(shù)計(jì)算時(shí),所有的八進(jìn)制和十六進(jìn)制都將轉(zhuǎn)換成十進(jìn)制
Infinity 無窮大,有正負(fù)無窮大,可以使用isFinite()判斷是否無窮大
Number.MAX_VALUE,Number.MIN_VALUE分別保存著數(shù)值類型的最大值和最小值
Number.NEGATIVE_INFINITY和Number.POSITIVE_INFINITY分別保存著負(fù)和正無窮大
NaN 非數(shù)值,可以使用isNaN判斷一個(gè)變量是否非數(shù)值
數(shù)值轉(zhuǎn)換
強(qiáng)制轉(zhuǎn)換Number(),但是結(jié)果并不合理,建議使用parseInt()函數(shù),并帶入需要轉(zhuǎn)換的基數(shù)
例:
parseInt(“10”,2); //以二進(jìn)制解析 parseInt(“10”,8); //以八進(jìn)制解析
不帶入基數(shù)意味著讓parseInt自己決定如何解析字符串,這會(huì)在某些時(shí)候造成錯(cuò)誤
parseFloat()與parseInt()基本相同,將字符串解析成浮點(diǎn)數(shù),始終忽略前導(dǎo)零,只解析十進(jìn)制值,十六進(jìn)制將被解析成0,因此
他沒有第二個(gè)參數(shù)
字符串類型
字符串類型變量是不可變,亦即字符串變量是為一個(gè)常量,可以使用單引號(hào)('),也可以使用雙引號(hào)(”)定義字符串變量,但必須匹配,如果需要混用,建議加上轉(zhuǎn)義字符(\)
使用toString()函數(shù)將一個(gè)值轉(zhuǎn)換為字符串,數(shù)值則可以使用基數(shù)值進(jìn)行轉(zhuǎn)換
例:
var num = 10; num.toString(“2”); //”1010” num.toString(“8”); //”12”
也可以使用String()進(jìn)行強(qiáng)制轉(zhuǎn)換
Object類型
constructor:構(gòu)造函數(shù)
hasOwnProperty(propertyName):檢查給定的屬性在當(dāng)前對(duì)象中是否存在
isPrototypeOf(object):檢查傳入的對(duì)象是否是傳入對(duì)象的原型
propertyIsEnumerable(propertyName):檢查給定的屬性是否能夠使用for-in語句來枚舉,與hasOwnProperty一樣,給定的屬性名必須以字符串的形式指定
toLocalString():返回對(duì)象的字符串表示,與執(zhí)行環(huán)境的地區(qū)對(duì)應(yīng)
toString():返回對(duì)象的字符串表示
valueOf():返回對(duì)象的字符串、數(shù)值或布爾值表示。通常與toString返回相同
操作符
按位非:~,按位與:&,按位或:|,按位異或:^,左移:<<,有符號(hào)右移:>>(以符號(hào)位填充),無符號(hào)右移:>>>(以零填充),邏輯非:!,邏輯與:&&,邏輯或:||
關(guān)系操作符:<,>,<=,>=
相等和不相等:==,!=,先轉(zhuǎn)換再比較
全等和不全等:===,!==,只比較,不轉(zhuǎn)換,類型不同則不同
條件操作符:? :,三目運(yùn)算符
逗號(hào)操作符:(,),返回最后一個(gè)表達(dá)式的值:var num = (3,5,6,2),num = 2
語句
if{},do{}while();,while(){},for(;;){}
for-in語句:
精準(zhǔn)的迭代語句,可以用來枚舉對(duì)象的屬性
for(property in expression) statement
例:
for(var propName in window){ document.write(propName); }
注:當(dāng)對(duì)象的變量值為null或者為undefined時(shí),for-in會(huì)發(fā)生錯(cuò)誤,雖然ECMAScript5更改了這一錯(cuò)誤,不過,為了最大限度的保證兼容性,在使用for-in循環(huán)之前,先檢測(cè)該對(duì)象的值不是null或者undefined
label語句:標(biāo)簽語句
start:for(var I = 0;i<count;i++){ statement }
這個(gè)start標(biāo)簽可以在之后的break和continue語句中使用,標(biāo)簽語句一般與循環(huán)語句一起使用
with語句:
將代碼的作用域設(shè)置到一個(gè)特定的對(duì)象中
with(expression) statement;
嚴(yán)格模式下不允許使用with語句,否則將被視為語法錯(cuò)誤
大量使用with語句會(huì)導(dǎo)致性能下降以及代碼調(diào)試?yán)щy,建議大型應(yīng)用程序的開發(fā)不使用with語句
switch語句
switch(expression){ case selection:statement; break; …… default:statement; break; }
函數(shù)
嚴(yán)格模式對(duì)函數(shù)限制:
函數(shù)不能命名為eval和arguments
參數(shù)不能命名為eval和arguments
不能出現(xiàn)兩個(gè)命名參數(shù)同名的情況
理解函數(shù)參數(shù)
js中的函數(shù)并不介意傳進(jìn)來多少個(gè)函數(shù)參數(shù),即使與定義的情況不同,因?yàn)樵诤瘮?shù)接收到的永遠(yuǎn)都是一個(gè)類似數(shù)組形式的參數(shù),函數(shù)并不關(guān)心數(shù)組包含的參數(shù)。可以在函數(shù)體內(nèi)通過arguments對(duì)象來訪問這個(gè)參數(shù)數(shù)組。
arguments只是與數(shù)組類似,因?yàn)榭梢允褂梅嚼ㄌ?hào)來訪問它的元素,使用length來確定傳進(jìn)來的參數(shù)個(gè)數(shù)。arguments中的參數(shù)順序與傳進(jìn)來的參數(shù)順序一致,并且是同步改變的。
注:沒有傳遞值的命名參數(shù),將會(huì)被賦值為undefined值。
嚴(yán)格模式對(duì)arguments對(duì)象作出了一些限制:在函數(shù)中對(duì)arguments進(jìn)行賦值將會(huì)變得無效,重寫arguments值將會(huì)導(dǎo)致語法錯(cuò)誤
使用arguments對(duì)參數(shù)的類型和數(shù)量進(jìn)行判斷,可以模仿重載
第4章,變量、作用域和內(nèi)存問題
注:js中所有函數(shù)的參數(shù)都是按值傳遞的
檢測(cè)類型:instanceof
instanceof操作符,只能操作引用類型,即對(duì)象,對(duì)基本數(shù)據(jù)類型的測(cè)試始終返回true,因?yàn)榛緮?shù)據(jù)類型不是對(duì)象
result = variable instanceof constructor
若變量是給定的引用類型,則返回true
例:
person instanceof Object; //person是Object類型嗎?
color instanceof Array; //color是Array類型嗎?
沒有塊級(jí)作用域
if(true){ var j = “blue”; } alert(j); //將會(huì)得到輸出blue
如果在C/C++中將會(huì)出現(xiàn)錯(cuò)誤,而js并不會(huì)出現(xiàn)錯(cuò)誤,在塊里面定義的變量將會(huì)添加到當(dāng)前的花括號(hào)之外的作用域中。
垃圾收集
標(biāo)記清除
引用計(jì)數(shù)
第5章,引用類型
Object類型
兩種創(chuàng)建實(shí)例方式:
一、使用new操作符后跟Object構(gòu)造函數(shù)
var obj = new Object(); obj.name = “name”; obj.age = 23;
二、使用對(duì)象字面量(通過對(duì)象字面量定義對(duì)象時(shí),實(shí)際上并不會(huì)調(diào)用Object構(gòu)造函數(shù))
var obj = { name : “name”; age : 23 }
可以使用點(diǎn)表示法和方括號(hào)表示法訪問對(duì)象的屬性
點(diǎn)表示法: 方括號(hào)表示法:(必須以字符串的形式表示要訪問的屬性名)
obj.name obj[“name”]
注:當(dāng)屬性名包含會(huì)導(dǎo)致語法錯(cuò)誤的字符,或?qū)傩悦褂玫氖顷P(guān)鍵字或保留字時(shí),可以使用方括號(hào)表示法,還可以通過變量訪問屬性
建議:除非必須使用變量訪問屬性,否則最好使用點(diǎn)表示法
Array類型
創(chuàng)建方式:
一、使用Array構(gòu)造函數(shù)
var arr = new Array(); //創(chuàng)建一個(gè)空數(shù)組 var arr = new Array(20); //創(chuàng)建一個(gè)包含20個(gè)項(xiàng)的數(shù)組 var arr = new Array(“one”,”two”,”three”); //創(chuàng)建包含one,two,three三項(xiàng)的數(shù)組 還可以將new操作符省略
二、使用數(shù)組字面量表示法
var color = [“red”,”blue”]; //創(chuàng)建包含兩個(gè)項(xiàng)的數(shù)組 var color = [“yellow”,”green”,]; //不要這樣創(chuàng)建數(shù)組,瀏覽器的解析不同,結(jié)果會(huì)不同
注:使用數(shù)組字面量創(chuàng)建數(shù)組時(shí),也不會(huì)調(diào)用Array構(gòu)造函數(shù)
arr.length,將會(huì)返回?cái)?shù)組的項(xiàng)數(shù),即將返回?cái)?shù)組的大小
對(duì)arr.length進(jìn)行賦值,將會(huì)動(dòng)態(tài)改表數(shù)組大小,賦值大于原數(shù)組大小將擴(kuò)大數(shù)組,新增項(xiàng)獲得undefined的值,小于原數(shù)組大小,將保留前面的數(shù)值,多的數(shù)值將被移除
數(shù)組檢測(cè):
對(duì)于只有一個(gè)全局作用域而言,instanceof可以很方便的檢測(cè)某個(gè)變量是否是數(shù)組,但對(duì)于多個(gè)框架的網(wǎng)頁而言,則存在多個(gè)不同的版本的Array構(gòu)造函數(shù),instanceof將不能夠滿足要求,為此引入Array.isArray(value)方法,這個(gè)方法可以最終確定某個(gè)值是否是數(shù)組,而不管是哪個(gè)框架構(gòu)造的。支持的瀏覽器為:IE9+,F(xiàn)irefox4+,Safari5+,Opera10.5+,chrome。
轉(zhuǎn)換方法:
調(diào)用數(shù)組的toString()方法,將會(huì)返回由數(shù)組中每個(gè)值的字符串形式拼接而成的以逗號(hào)分隔的字符串,valueOf()方法返回的還是數(shù)組,與toString()是一樣的結(jié)果
toLocaleString()返回的通常與toString()和valueOf()返回結(jié)果是一樣的,但并不總是如此,使用toLocaleString()方法,則會(huì)去調(diào)用數(shù)組中每一項(xiàng)的toLocaleString()方法,而不是toString()方法。
join方法
join方法接受一個(gè)參數(shù),即作為分隔符的字符串
例:
var arr = [“one”,”two”]; arr.join(“|”); //one|two
如果不給join傳遞參數(shù),則返回以逗號(hào)作為分隔的字符串
注:如果數(shù)組中某一項(xiàng)的值為null或者undefined,則調(diào)用join,toLocaleString(),toString(),valueOf()返回的結(jié)果則使用空字符串表示
數(shù)組的棧方法
var arr = new Array();
arr.push(),在數(shù)組末尾添加數(shù)據(jù),可以傳入多個(gè)參數(shù),并返回修改后的數(shù)組長度
arr.pop(),從數(shù)組末尾移除最后一個(gè)數(shù)據(jù),減少數(shù)組的length值,并返回該項(xiàng)的值
數(shù)組的隊(duì)列方法
var arr = new array();
arr.shift(),移除數(shù)組的第一項(xiàng),減少數(shù)組的length值,并返回該項(xiàng)的值
arr.unshift(),在數(shù)組的前端添加任意個(gè)項(xiàng),并返回修改后的數(shù)組長度
使用shift和push結(jié)合,可以模擬隊(duì)列操作
使用unshift和pop結(jié)合,可以從相反方向模擬隊(duì)列
重排序方法:
var arr = new Array();
arr.reverse(),翻轉(zhuǎn)數(shù)組的項(xiàng),即首尾順序調(diào)轉(zhuǎn)
arr.sort(),默認(rèn)情況下升序排列,注:排列順序是數(shù)組值轉(zhuǎn)換成字符串之后的升序排列,通常不是所需要的排序
sort方法可以接受一個(gè)比較函數(shù)作為參數(shù),實(shí)現(xiàn)所需的排序方法,方法返回負(fù)數(shù)則按升序排列,返回整數(shù)則按降序排列,注:可以適應(yīng)大多數(shù)排序情況
操作方法:
var arr = new Array();
arr.concat(),進(jìn)行數(shù)組連接,并返回連接后的數(shù)組,可傳入多個(gè)參數(shù)
arr.slice(),可以基于當(dāng)前數(shù)組中的一個(gè)或多個(gè)值創(chuàng)建一個(gè)新數(shù)組返回,接受一個(gè)或兩個(gè)參數(shù),即返回原數(shù)組的起始位置和結(jié)束位置之間的所有項(xiàng),不包含結(jié)束位置的項(xiàng),只有一個(gè)參數(shù)則返回從該參數(shù)指定位置到末尾的所有項(xiàng)。
注:如果參數(shù)是負(fù)數(shù),則會(huì)將數(shù)組的長度加上這個(gè)負(fù)數(shù)得到的結(jié)果來確定位置。結(jié)束位置小于起始位置則返回空
splice()方法:
刪除:指定兩個(gè)參數(shù),要?jiǎng)h除的起始位置和要?jiǎng)h除的項(xiàng)數(shù),例:splice(0,2);
插入:指定三個(gè)參數(shù),起始位置,要?jiǎng)h除的項(xiàng)數(shù)(0),要插入的項(xiàng),插入的項(xiàng)可以是多個(gè)項(xiàng)
例:splice(2,0,”red”,”green”); //從位置2插入red,green
替換:與插入相同,第二個(gè)參數(shù)有變化,起始位置,要?jiǎng)h除的項(xiàng)數(shù),要插入的項(xiàng),插入的項(xiàng)數(shù)可以是多個(gè)項(xiàng)
位置方法:
indexOf(),lastIndexOf(),都接收兩個(gè)參數(shù),要查找的項(xiàng)和查找起點(diǎn)位置索引indexOf從數(shù)組頭開始查找,lastIndexOf從數(shù)組末尾開始查找。若沒有找到則返回-1.
注:查找時(shí)進(jìn)行的比較使用的是全等操作符,就像使用“===”一樣
迭代方法:
ECMAScript5定義了5個(gè)迭代方法,全部接收兩個(gè)參數(shù):每一項(xiàng)上運(yùn)行的函數(shù),運(yùn)行該函數(shù)的作用域?qū)ο蟆绊憈his的值。函數(shù)則接收三個(gè)參數(shù):數(shù)組項(xiàng)的值,該項(xiàng)在數(shù)組中的位置,和數(shù)組對(duì)象本身
var arr = new Array();
every(),對(duì)數(shù)組中每一項(xiàng)運(yùn)行給定函數(shù),每一項(xiàng)都返回true,則返回true
filter(),對(duì)數(shù)組每一項(xiàng)運(yùn)行給定函數(shù),返回該執(zhí)行函數(shù)返回true的項(xiàng)組成的數(shù)組
例:
var num = [1,2,3,4,5,4,3,2,1]; var filter = num.filter(function(item,index,array){ return item > 2; }); //[3,4,5,4,3]
forEach(),對(duì)數(shù)組中每一項(xiàng)運(yùn)行給定函數(shù),沒有返回值,本質(zhì)上與for循環(huán)迭代數(shù)組一致
map(),對(duì)數(shù)組中每一項(xiàng)運(yùn)行給定函數(shù),返回每次函數(shù)調(diào)用的結(jié)果組成的結(jié)果
some(),對(duì)數(shù)組中每一項(xiàng)運(yùn)行給定函數(shù),只要任一項(xiàng)的函數(shù)結(jié)果是true,則返回true
注:以上所有函數(shù)并不會(huì)對(duì)數(shù)組進(jìn)行修改
例:
var num = [1,2,3,4,5,4,3,2,1]; var mapResult = num.map(function(item,index,array(){ return item * 2; }); //以上代碼返回?cái)?shù)組每一項(xiàng)都乘2以后的數(shù)組
歸并方法:
reduce()和reduceRight()
兩個(gè)函數(shù)都會(huì)迭代數(shù)組的所有項(xiàng),然后構(gòu)建一個(gè)最終返回的值,其中reduce從數(shù)組第一項(xiàng)開始,reduceRight從數(shù)組最后一項(xiàng)開始
這兩個(gè)方法都接收2個(gè)參數(shù):一個(gè)在每一項(xiàng)上都調(diào)用的函數(shù)和(可選的)作為歸并基礎(chǔ)的初始值。傳遞的函數(shù)需要接收4個(gè)參數(shù):前一個(gè)值,當(dāng)前值,項(xiàng)的索引和數(shù)組對(duì)象。這個(gè)函數(shù)的返回值會(huì)作為第一個(gè)參數(shù)傳遞給下一項(xiàng),第一次迭代發(fā)生在數(shù)組的第二項(xiàng)上,因此第一個(gè)參數(shù)是數(shù)組的第一項(xiàng),第二個(gè)參數(shù)是數(shù)組的第二項(xiàng)。
例:
var value = [1,2,3,4,5]; var sum = value.reduce(function(prev,cur,index,array){ return prev + cur; }); //sum = 15
//第一次執(zhí)行回調(diào)函數(shù),prev = 1,cur = 2,第二次,prev = 3(第一次函數(shù)返回結(jié)果1+2),cur = 3(當(dāng)前數(shù)組項(xiàng))。這個(gè)過程會(huì)把數(shù)組每一項(xiàng)都訪問一遍。
reduceRight除了方向不一樣,其他都一樣。
Date類型
Date類型使用自UTC1970.1.1午夜零時(shí)開始經(jīng)過的毫秒數(shù)來保存日期,可以將日期精確到1970.1.1之前或之后100 000 000(一億)年。
使用Date構(gòu)造函數(shù)而不傳參數(shù),新對(duì)象會(huì)獲得當(dāng)前日期和時(shí)間,要?jiǎng)?chuàng)建特定日期時(shí)間,必須傳入表示該日期的毫秒數(shù),ECMAScript提供了兩個(gè)方法Date.parse和Date.UTC方法來簡(jiǎn)化操作。
Date.parse方法接收一個(gè)表示日期的字符串參數(shù)。這個(gè)方法因?qū)崿F(xiàn)而異,而且通常因地區(qū)而異。美國地區(qū)的瀏覽器支持以下格式:
月/日/年,如6/13/2004
英文月名 日,年,如January 12,2004
英文名星期幾 英文月名 日 年 時(shí):分:秒 時(shí)區(qū),如Tue May 25 2004 00:00:00 GMT-0700
ISO 8601擴(kuò)展格式Y(jié)YYY-MM-DDTHH:mm:ss.sssZ,如2004-05-25T00:00:00,只有支持js5的實(shí)現(xiàn)支持這種格式
Date.UTC也同樣返回表示日期毫秒數(shù),參數(shù)分別為:年份、基于0的月份(一月份是0)、月中哪一天(1-31)、小時(shí)數(shù)(0-23)、分鐘、秒及毫秒數(shù),其中只有前兩個(gè)參數(shù)是必須的。
例:
var someDate = new Date(Date.UTC(2000,0)); //2000年1月1日0時(shí)0分0秒 var someDate = new Date(Date.UTC (2000,0,1,15,23,23)); //2000年1月1日15時(shí)23分23秒
Date構(gòu)造函數(shù)會(huì)模仿Date.parse和Date.UTC函數(shù)。
Date.now方法返回調(diào)用這個(gè)函數(shù)時(shí)的日期和時(shí)間毫秒數(shù)。在不支持的瀏覽器上面,可以使用+操作符獲取Date對(duì)象時(shí)間戳
var start = +new Date(); var stop = +new Date();
日格式化方法
toDateString—以特定于實(shí)現(xiàn)的格式顯示星期幾、月、日、年
toTimeString—以特定于實(shí)現(xiàn)的格式顯示時(shí)、分、秒和時(shí)區(qū)
toLocaleDateString—以特定于地區(qū)的格式顯示星期幾、月、日、年
toLocaleTimeString—以特定于實(shí)現(xiàn)的格式顯示時(shí)、分、秒
toUTCString—以特定于實(shí)現(xiàn)的格式完整的UTC時(shí)間
與toLocaleString和toString一樣,以上方法沒有一個(gè)能夠用來在用戶界面中顯示一致的日期信息。
RegExp類型,正則
語法:類似于Perl語法
var expression = / pattern /flags;
模式(pattern)部分可以是簡(jiǎn)單或復(fù)雜的正則表達(dá)式,每個(gè)表達(dá)式可以使用一個(gè)或多個(gè)標(biāo)識(shí)符,支持以下3個(gè)標(biāo)識(shí)符
g:全局模式,將被應(yīng)用于所有字符串,而不是在匹配到第一個(gè)字符串后就停止,
i:表示不區(qū)分大小寫,
m:表示多行模式,即達(dá)到一行文本末尾時(shí),會(huì)繼續(xù)查找下一行
注:模式中所有元字符都需要轉(zhuǎn)義
元字符:( [ { \ ^ $ | } ? * + . ] )
以上方法是以字面量模式創(chuàng)建正則表達(dá)式
使用RegExp構(gòu)造正則表達(dá)式
var partten = new RegExp(“bat”,”I”);
注:使用RegExp構(gòu)造函數(shù),所有元字符必須雙重轉(zhuǎn)義
例:/\[bc\]at/ ===> “\\[bc\\]at”
RegExp實(shí)例屬性
global:布爾值,表示是否設(shè)置了g標(biāo)志
ignoreCase:布爾值,表示是否設(shè)置了i標(biāo)志
lastIndex:整數(shù),表示開始搜索的下一個(gè)匹配項(xiàng)的字符位置,從0算起
multiline:布爾值,表示是否設(shè)置了m標(biāo)志
source:正則表達(dá)式的字符串表示,按照字面量形式,而非傳入構(gòu)造函數(shù)中的字符串模式返回
RegExp對(duì)象的主要方法是exec(),exec()接收一個(gè)參數(shù),即要應(yīng)用模式的字符串,返回一個(gè)匹配項(xiàng)(即使設(shè)置了g標(biāo)志),有沒有設(shè)置g標(biāo)志的差別在于,沒有設(shè)置則總是返回同一個(gè)結(jié)果,設(shè)置了則返回下一個(gè)匹配
test方法,接收一個(gè)字符串,只返回是否匹配,不返回結(jié)果
Function類型
函數(shù)是對(duì)象,函數(shù)名是指針
定義方法:
//函數(shù)聲明的形式 function sum(num1,num2){ return num1 + num2; } //函數(shù)表達(dá)式的形式 var sum = function(num1,num2){ return num2 + num2; } var sum = new Function(“num2”,”num2”,”return num1 + num2”); //不建議,性能渣,但能更好的理解函數(shù)是對(duì)象的思想。 function add(num){ return num + 100; } function add(num1,num2){ return num + 200; } //實(shí)際如同下面的代碼 function add(num){ return num + 100; } add = function(num){ return num + 200; }
所以函數(shù)沒有重載。
函數(shù)內(nèi)部屬性
函數(shù)內(nèi)部有兩個(gè)特殊對(duì)象,arguments和this
arguments有一個(gè)屬性callee,指向擁有這個(gè)arguments的函數(shù)
定義遞歸函數(shù)時(shí),最好使用arguments.callee()來代替函數(shù)名,降低耦合,減少問題的出現(xiàn)
例:
function factorial(num){ if(num<1) return 1; else return num * factorial(num – 1); } function factorial(num){ if(num<1) return 1; else return num * arguments.callee(num – 1); }
this對(duì)象
函數(shù)的this對(duì)象引用的是函數(shù)據(jù)以執(zhí)行的環(huán)境對(duì)象
ECMAScript5規(guī)范定義了另一個(gè)函數(shù)對(duì)象的屬性:caller,保存著調(diào)用當(dāng)前函數(shù)的函數(shù)的引用
函數(shù)包含了兩個(gè)屬性:length(希望接收的函數(shù)個(gè)數(shù))和prototype,prototype不可枚舉,所以for-in無法發(fā)現(xiàn)他。prototype是所有引用類型保存其所有實(shí)例方法的真正所在
包含兩個(gè)非繼承而來的方法:apply和call
apply方法接收兩個(gè)參數(shù):一個(gè)是在其中運(yùn)行函數(shù)的作用域,也就是this對(duì)象,一個(gè)是參數(shù)數(shù)組,可以是Array實(shí)例,也可以是arguments對(duì)象
call與apply基本相同,區(qū)別在于,使用call函數(shù),參數(shù)必須逐個(gè)列舉出來
傳遞參數(shù)并非apply和call真正用武之地,真正強(qiáng)大的地方在于能夠擴(kuò)充函數(shù)的作用域
例:
window.color = “red”; var o = {color:”blue”}; function sayColor(){ alert(this.color); } sayColor(); //red sayColor.call(this); //red sayColor.call(window); //red sayColor.call(o); //blue
不需要再將sayColor函數(shù)放到o對(duì)象中,就可以使o對(duì)象能夠使用sayColor函數(shù)
ECMAScript5還定義了另一個(gè)方法:bind,這個(gè)方法會(huì)創(chuàng)建一個(gè)函數(shù)實(shí)例,其this值會(huì)被綁定到傳給bind函數(shù)的值
window.color = “red”; var o = {color:”blue”}; function sayColor(){ alert(this.color); } var objSayColor = sayColor.bind(o); objSayColor(); //blue
toLocaleString和toString始終返回函數(shù)代碼,但由于瀏覽器差異,并沒有辦法根據(jù)返回結(jié)果實(shí)現(xiàn)任何重要功能,valueOf也只返回函數(shù)代碼
基本包裝類型
Boolean、Number、String
對(duì)基本包裝類型的實(shí)例調(diào)用typeof會(huì)返回object,而且所有的基本包裝類型的實(shí)例都會(huì)返回true,
Object構(gòu)造函數(shù)也會(huì)像工廠方法一樣,根據(jù)傳入的值的類型返回響應(yīng)的基本包裝類型的實(shí)例
例:
var obj = new Object(“some text”); alert(obj instanceof String); //true
使用new調(diào)用基本包裝類型和直接使用同名的轉(zhuǎn)型函數(shù)是不一樣的。例:
var value = “25”; var num = Number(value); //轉(zhuǎn)型函數(shù) alert(typeof num); //”number” var obj = new Number(value); //構(gòu)造函數(shù) alert(typeof obj); //”object”
Number類型
另外提供的方法
toFixed();接收一個(gè)參數(shù),表示要以幾位小數(shù)表示當(dāng)前值,當(dāng)前小數(shù)位過長則四舍五入,此方法可以表示帶有0到20個(gè)小數(shù)位的數(shù)值,這只是標(biāo)準(zhǔn)實(shí)現(xiàn)范圍
toExponential();接收一個(gè)參數(shù),返回指數(shù)形式表示,參數(shù)指定返回的結(jié)果中的小數(shù)位數(shù)
toPrecision();接收一個(gè)參數(shù),表示所有數(shù)字的位數(shù),不包括指數(shù)部分
string類型
var str = “hello world”; str.charAt(1); //”e”,返回字符 str.charCodeAt(1); //”101”,返回字符編碼 str.concat();//連接字符串,可以接收任意個(gè)字符串 slice(),substring(),substr(),都接收一或兩個(gè)參數(shù),接收的第一個(gè)參數(shù)均代表起始位置,slice(),substring()接收的第二個(gè)參數(shù)表示終止位置,substr()的第二個(gè)參數(shù)表示返回的字符個(gè)數(shù),若不給第二個(gè)參數(shù),則返回從起始位置到字符串結(jié)束位置的字符
帶入負(fù)數(shù)表現(xiàn)不同:slice會(huì)將所有帶入的負(fù)數(shù)與字符串長度相加,substr會(huì)將第一參數(shù)加上字符串長度,第二個(gè)參數(shù)轉(zhuǎn)換為0,substring()將所有負(fù)值轉(zhuǎn)為0
indexOf,lastIndexOf方法都返回子字符串的位置,indexOf從頭查找,lastIndexOf從末尾查找,沒有找到返回-1,兩個(gè)方法都可以接收第二個(gè)可選參數(shù),表示字符從哪里開始搜索
trim(),返回源字符串刪除前后綴所有空格的結(jié)果
toLowerCase,toLocaleLowerCase,toUpperCase,toLocaleUpperCase,帶有Locale的方法是針對(duì)特定地區(qū)的實(shí)現(xiàn)。通常而言是沒有什么差別,但少數(shù)語言會(huì)為Unicode大小寫轉(zhuǎn)換應(yīng)用特殊規(guī)則,這就必須使用針對(duì)特定地區(qū)的實(shí)現(xiàn)
match(),search()這兩個(gè)方法均接收一個(gè)參數(shù),字符串或者RegExp對(duì)象指定的一個(gè)正則表達(dá)式
replace()方法,接收兩個(gè)參數(shù),第一個(gè)參數(shù)可以是一個(gè)RegExp對(duì)象或字符串(不會(huì)被轉(zhuǎn)換成正則表達(dá)式),第二個(gè)參數(shù)可以是一個(gè)字符串或函數(shù),若要替換所有字符串,則必須使用正則表達(dá)式,并加全局(g)標(biāo)志
split(),接收一個(gè)參數(shù)作為字符串的分隔符,返回由分隔符分隔得到的數(shù)組,可以接收第二個(gè)可選參數(shù),作為返回結(jié)果的數(shù)組大小
localeCompare(),比較兩個(gè)字符串,關(guān)于是否區(qū)分大小寫,視地區(qū)而定
1、源字符串應(yīng)排在參數(shù)字符串之前,返回負(fù)數(shù)(具體視情況而定,通常為-1)
2、源字符串與參數(shù)字符串相同,返回0
3、源字符串排在參數(shù)字符串之后,返回整數(shù)(具體視情況而定,通常為1)
fromCharCode(),接收一個(gè)或多個(gè)字符編碼,轉(zhuǎn)換成字符串,與charCodeAt()執(zhí)行的是相反操作
URI(通用資源標(biāo)識(shí)符)
方法:encodeURI,encodeURIComponent,decodeURI,decodeURIComponent,編碼和解碼,解碼方法只能識(shí)別各自對(duì)應(yīng)的編碼方法
eval(),將帶入的字符串參數(shù),轉(zhuǎn)換成可執(zhí)行語句,并插入到當(dāng)前位置
eval創(chuàng)建的任何變量和函數(shù)都不會(huì)被提升,嚴(yán)格模式下,外部無法訪問eval創(chuàng)建的變量和函數(shù)
注:盡量不使用eval方法,僅屬于個(gè)人意見
Math對(duì)象
min(),max(),ceil()向上舍入,floor()向下舍入,round()標(biāo)準(zhǔn)舍入,即四舍五入,random()返回大于等于0小于1的隨機(jī)數(shù)
以上所述是小編給大家介紹的JavaScript高級(jí)程序設(shè)計(jì)(第三版)學(xué)習(xí)筆記1~5章 ,希望對(duì)大家有所幫助!
- javascript中類的定義及其方式(《javascript高級(jí)程序設(shè)計(jì)》學(xué)習(xí)筆記)
- JavaScript高級(jí)程序設(shè)計(jì) DOM學(xué)習(xí)筆記
- JavaScript高級(jí)程序設(shè)計(jì) XML、Ajax 學(xué)習(xí)筆記
- JavaScript高級(jí)程序設(shè)計(jì) 事件學(xué)習(xí)筆記
- JavaScript高級(jí)程序設(shè)計(jì)(第3版)學(xué)習(xí)筆記 概述
- JavaScript高級(jí)程序設(shè)計(jì)(第3版)學(xué)習(xí)筆記2 js基礎(chǔ)語法
- JavaScript高級(jí)程序設(shè)計(jì)(第3版)學(xué)習(xí)筆記3 js簡(jiǎn)單數(shù)據(jù)類型
- JavaScript高級(jí)程序設(shè)計(jì)(第3版)學(xué)習(xí)筆記4 js運(yùn)算符和操作符
- JavaScript高級(jí)程序設(shè)計(jì)(第3版)學(xué)習(xí)筆記5 js語句
相關(guān)文章
webpack本地開發(fā)環(huán)境無法用IP訪問的解決方法
下面小編就為大家分享一篇webpack本地開發(fā)環(huán)境無法用IP訪問的解決方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-03-03JavaScript使用Math.Min返回兩個(gè)數(shù)中較小數(shù)的方法
這篇文章主要介紹了JavaScript使用Math.Min返回兩個(gè)數(shù)中較小數(shù)的方法,涉及javascript中Math.Min方法的使用技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-04-04javascript如何動(dòng)態(tài)加載表格與動(dòng)態(tài)添加表格行
在某些時(shí)候需要?jiǎng)討B(tài)加載表格與動(dòng)態(tài)添加表格行,在接下來的文章中將為大家介紹下javascript是如何做到的,感興趣的朋友不要錯(cuò)過2013-11-11