javascript
ppk on javascript 笔记(五)
第5章 核心
1999年ECMA將核心標(biāo)準(zhǔn)化為ecmascript(http://www.ecma-international.org/publications/standards/Ecma-262.htm),對(duì)該規(guī)范最重要的評(píng)論來自Douglas Crockford(http://crockford.com/javascript/recommend.html)關(guān)于Crockford更多的文章可參考(http://dancewithnet.com/2009/03/29/douglas-crockford/)
?
基礎(chǔ)知識(shí)
區(qū)分大小寫
語句和分號(hào):分號(hào)表示一條語句結(jié)束;對(duì)于一行代碼的語句,不管是否以分號(hào)結(jié)尾,javascript會(huì)自動(dòng)插入分號(hào);當(dāng)使用if,for或while控制結(jié)構(gòu)時(shí),可以不用分號(hào)結(jié)束。
注釋
代碼塊:{};當(dāng)if, while, for只包含一條語句時(shí),可以省略{};函數(shù)主體必須在{}中。
運(yùn)算符:優(yōu)先級(jí);返回值;賦值運(yùn)算符返回當(dāng)前的值,因此可以使用var a=b=1;
值:函數(shù)也可以用來賦值(注意使用為值時(shí)不應(yīng)該再帶括號(hào))。
?
數(shù)據(jù)類型
javascript有4種重要的數(shù)據(jù)類型:數(shù)字、字符串、布爾型和對(duì)象;4種小數(shù)據(jù)類型:undefined、null以及表示“不存在”的兩種說法。
null意味著無值,下面不會(huì)報(bào)錯(cuò),顯示為null,但當(dāng)我們使用null值時(shí)就會(huì)報(bào)錯(cuò)--缺少對(duì)象。
var x = document.getElementById('test');alert(x);
undefined發(fā)生在3種情況:聲明了一個(gè)變量,但沒有賦值;訪問一個(gè)對(duì)象尚未聲明的屬性;定義了函數(shù)的參數(shù),但沒有傳值給它。
alert(y); var x; alert(x);alert(window.y);
第一條語句會(huì)報(bào)錯(cuò):y未定義;第二行和第三行則會(huì)顯示undefined。
typeof運(yùn)算符表示一個(gè)值的數(shù)據(jù)類型,它有兩個(gè)特例:
var x =1; alert(typeof x);var y ='1'; alert(typeof y);
var z =true; alert(typeof z);
function f() {}
alert(typeof(f));
alert(typeof(null));
第一行返回number,第二行返回string,第三行返回boolean。?
函數(shù)使用typeof時(shí)返回function,null則返回object。
數(shù)據(jù)類型轉(zhuǎn)換:javascript會(huì)根據(jù)需要將一種類型解釋為另一種類型,原類型并沒有改變。如:
var a = 2;var b ='3';
var c = a * b;
a是一個(gè)數(shù)字,b是一個(gè)字符串,在做乘法運(yùn)算時(shí),將b解釋為數(shù)字,結(jié)果c是一個(gè)數(shù)字,值為6,b并沒有改變,仍是一個(gè)字符串。
上面的alert(x),實(shí)際上也是把null解釋為字符串,然后輸出。
當(dāng)字符串不能被解釋為數(shù)字時(shí),返回NaN.
使用+時(shí),總是解釋為連接,而不是加法運(yùn)算。
轉(zhuǎn)換為布爾型時(shí),null, undefine, 數(shù)字0, NaN, 空字符串''被轉(zhuǎn)換為false,其他所有的值被轉(zhuǎn)換為true。
顯式的數(shù)據(jù)類型轉(zhuǎn)換,如:x1或者-0將字符串轉(zhuǎn)換成數(shù)字,+''將轉(zhuǎn)換成字符串,使用!!轉(zhuǎn)換成布爾型。
?
普通運(yùn)算符
* - / %及*=等,++和--同樣區(qū)分前后,=賦值運(yùn)算符返回被賦予的值,==相等運(yùn)算符,===等同運(yùn)算符要求數(shù)據(jù)類型一致,同樣!==不等同運(yùn)算符也針對(duì)數(shù)據(jù)類型。
比較運(yùn)算符總是先將變量解釋為數(shù)字進(jìn)行比較,若有一個(gè)不能解釋為數(shù)字,則按照第一個(gè)字母順序進(jìn)行比較,后面的大于前面的,小寫的大于大寫的(類似ascii)
條件運(yùn)算符?:
?
變量
變量命名習(xí)慣采用低駝峰命名規(guī)則(lowerCamelCase),W3CDOM也如此命名,命名時(shí)不要使用保留字。
允許對(duì)一個(gè)未聲明的變量直接賦值,這個(gè)變量會(huì)自動(dòng)聲明,但不允許直接使用未聲明的變量,最好使用var顯示聲明以保持代碼清晰。
按作用域分為全局變量和局部變量,沒有塊作用域,當(dāng)在函數(shù)體中用var顯式聲明或作為函數(shù)的參數(shù)時(shí)為局部變量,其他情況如在函數(shù)體內(nèi)未用var聲明而直接使用或在函數(shù)體外聲明的都是全局變量,盡量使用局部變量。
?
處理數(shù)字
不區(qū)分整數(shù)和浮點(diǎn)數(shù),在使用浮點(diǎn)數(shù)時(shí)會(huì)產(chǎn)生舍入誤差的bug,因此浮點(diǎn)數(shù)運(yùn)算的結(jié)果在顯示之前要先進(jìn)行舍入。0.5可以簡寫為.5s
以0開頭的數(shù)字為8進(jìn)制,以0x開頭的數(shù)字為16進(jìn)制。
Math對(duì)象:
取整的三種方法:Math.round(), Math.floor(), Math.ceil(),同樣適用于負(fù)數(shù);
Math.random()用于產(chǎn)生0~1的隨機(jī)數(shù);
Math.abs()取絕對(duì)值。
n.toFixed(2)將數(shù)字n轉(zhuǎn)換成一個(gè)擁有固定位數(shù)的字符串,要求n必須為number類型,否則會(huì)報(bào)錯(cuò);它返回字符串。
全局方法parseInt(x)和parseFloat(x)將字符串轉(zhuǎn)換為數(shù)字,它逐字符檢查字符串,直接遇見非數(shù)字字符為止,當(dāng)?shù)谝粋€(gè)字符非數(shù)字時(shí)才返回NaN,而上面的顯式轉(zhuǎn)換則要求字符串必須全部為數(shù)字,(注意16進(jìn)制的x和float的.也是允許的)。
?
與字符串打交道
習(xí)慣上適用單引號(hào)表示字符串,允許使用雙引號(hào),\為轉(zhuǎn)義符,+為連接符。
x.length用于取字符串的長度,這是字符串對(duì)象的一個(gè)屬性,且是只讀的。
x.indexOf('a')和x.lastIndexOf('a')用于檢索,它返回的索引從0開始,未檢索到時(shí)返回-1,可以指定檢索開始的位置,如x.indexOf('a', 2), x.lastIndexOf('a', x.length-1)。
x.charAt(9)返回指定位置的字符,索引從0開始。
x.substring(9)或x.substring(9, 11)返回開始位置和結(jié)束位置之間的字符串,索引從0開始。
x.split('c')用指定的分隔符將字符串轉(zhuǎn)換為數(shù)組,分隔符本身并不出現(xiàn)。
x.toLowerCase()和x.toUpperCase()用于大小寫轉(zhuǎn)換。
?
處理布爾值
布爾型數(shù)據(jù)只有兩個(gè):true和false。
邏輯運(yùn)算符|| && !,注意javascript也包含逐位運(yùn)算符&和|。
if(!document.styleSheets)對(duì)象檢測時(shí),若瀏覽器不支持這種方法,即為一個(gè)不存在的對(duì)象null,它被轉(zhuǎn)換為false。
邏輯運(yùn)算符||和&&并不返回布爾值,而是返回運(yùn)算中最后一次計(jì)算的表達(dá)式的值。
例如,應(yīng)用這個(gè)方法,我們可以使用來取得事件目標(biāo)
var evtTarget = evt.target || evt.srcElemnt;大多數(shù)的瀏覽器將事件目標(biāo)保存在evt.target中,而IE保存在srcElement中,當(dāng)evt.target非null時(shí),則返回,否則繼續(xù)計(jì)算srcElement。&&用法也如此。
?
控制結(jié)構(gòu)
if ...?else if ...?else ...
switch(...) { case ..: .. break; default:...?} 注意,switch允許任意的數(shù)據(jù)類型(其他語言如java只允許對(duì)數(shù)字),但switch與case比較時(shí),不會(huì)進(jìn)行數(shù)據(jù)類型的轉(zhuǎn)換。
四種循環(huán)語句:for, while, do/while, for in
for, while?條件檢測總在循環(huán)體執(zhí)行之前,而do/while先執(zhí)行后檢測。
當(dāng)while陷入無限循環(huán)時(shí),瀏覽器會(huì)提示是否終止代碼運(yùn)行。
do { ...} while(..); 最好在do/while的最后加一個(gè)分號(hào)。
break與continue。
當(dāng)在嵌套循環(huán)中想跳出外層循環(huán)時(shí),使用標(biāo)簽是可行的,事實(shí)上,任何語句都可以標(biāo)志為標(biāo)簽。
myloop:for(var i=0; i<x.length; i++) {for(var j=0; j<x.length; j++) {
if([something is the case]) continue myloop;
}
}
try/catch用來確保用戶不會(huì)看到錯(cuò)誤信息。
?
函數(shù)
定義一個(gè)函數(shù) function f() {} 或 var f = function() {}。
函數(shù)可以直接return;或return任意一個(gè)數(shù)據(jù)類型。
var g=f; 則定義了函數(shù)的一個(gè)引用,可以運(yùn)行g(shù)();。
當(dāng)將函數(shù)作為一個(gè)值時(shí)不能使用(),而()運(yùn)算符則命令函數(shù)執(zhí)行。
函數(shù)可以內(nèi)嵌函數(shù),使用內(nèi)嵌函數(shù)時(shí),需注意局部變量的作用域:
function init() {var message =' clicked ';
var x = document.getElementsByTagName('a');
for (var i=0; i<x.length; i++) {
x[i].onclick =function() {
x[i].firstChild.nodeValue = message;
}
}
}
函數(shù)運(yùn)行在被定義的作用域中,而不是執(zhí)行它們的作用域中。這意味著內(nèi)嵌函數(shù)可以訪問所有它的父函數(shù)的局部變量,即使父函數(shù)在內(nèi)嵌函數(shù)調(diào)用前就早已執(zhí)行。
在此,內(nèi)嵌函數(shù)訪問了父函數(shù)的局部變量i和x,但是i發(fā)生了錯(cuò)誤,程序報(bào)錯(cuò)。這是因?yàn)閮?nèi)嵌函數(shù)只能訪問到局部變量的最終值;
假設(shè)x.length=9,那么init函數(shù)執(zhí)行結(jié)束后i的值為10,以后當(dāng)內(nèi)嵌函數(shù)觸發(fā)時(shí)就會(huì)使用這個(gè)i,于是使用了x[10]這個(gè)null值,從而報(bào)錯(cuò);
正確的寫法應(yīng)該是 x[i].onclick = function() { this.firstchild.nodeValue = message; }
?
對(duì)象
對(duì)象用來保存彼此相關(guān)聯(lián)的變量和函數(shù),也就是一組屬性的集合,值為函數(shù)的屬性稱作方法,點(diǎn)運(yùn)算符用來獲取一個(gè)屬性或方法。
允許自定義對(duì)象 var t = new Object(); t.a = 1; t.b = function() {}
可以用字面量來定義對(duì)象 var t = { a:1, b:fucntion() {} }屬性間用逗號(hào)隔開。
訪問一個(gè)屬性沒有什么害處,不管對(duì)象是否有這個(gè)屬性,但是訪問一個(gè)方法的同時(shí)也嘗試去執(zhí)行它,例如
function stopProp(e) {if(e.stopPropagation) {
e.stopPropagation();
}
e.cancelBubble =true;
}
對(duì)停止事件傳播,W3C標(biāo)準(zhǔn)的瀏覽器需執(zhí)行stopPropagation方法,而IE只需將cancelBubble設(shè)為true,上面這種寫法是規(guī)范的,直接訪問不存在的方法會(huì)報(bào)錯(cuò),而對(duì)于W3C標(biāo)準(zhǔn)的瀏覽器則只是多創(chuàng)建一個(gè)值為true的屬性而已,但是這個(gè)屬性對(duì)IE來說卻是一個(gè)預(yù)定義屬性,改變預(yù)定義屬性的值便會(huì)引起一些相應(yīng)的動(dòng)作。
允許創(chuàng)建自己的屬性。
this關(guān)鍵字出現(xiàn)在方法中(js不區(qū)分方法和函數(shù)),用來引用定義該方法的對(duì)象。
屬性和變量也是對(duì)等不區(qū)分的,全局變量也即全局對(duì)象window的屬性。
?
關(guān)聯(lián)數(shù)組
下面兩種表達(dá)式等價(jià)的:object.property; object['property']; 同樣的這也是等價(jià)的:object.method(); object['method']();
使用點(diǎn)符號(hào)時(shí),后面的屬性名或方法名是固定的字符串常量,而使用方括號(hào)則可以使用變量隨意更改屬性的名字。
關(guān)聯(lián)數(shù)組是一個(gè)數(shù)組,它允許通過字符串作為值的名字來找到某一個(gè)確定的值,這些字符串叫做關(guān)鍵字。
for in用來遍歷一個(gè)關(guān)聯(lián)數(shù)組,例如
var t = {a:2,
b:'2',
c:function() {
alert(this.a*this.b);
}
}
for(var i in t) {
alert(i +':'+ t[i]);
}
彈出的三個(gè)信息分別為a:2,b:2和c:fuction() { alert(this.a*this.b); }。注意到i表示了關(guān)鍵字,而方括號(hào)使用了變量i來獲取t的屬性(點(diǎn)符號(hào)是行不通的,t.i表示t的i屬性),同時(shí)也可以看到a的值數(shù)字2被轉(zhuǎn)換成了字符串2。
?
數(shù)組
數(shù)組是一個(gè)用數(shù)字來索引的值的集合,索引數(shù)從0開始,例如
var t =new Array();t[0] ='2';
t[2] =3;
t[5] =function() {
alert(this[0] *this[2]);
} t[7] = new Array(); t[7][5] = false;
t[5]();
alert(t[1]);
這定義了一個(gè)稀疏數(shù)組,它只定義了幾個(gè)元素,對(duì)于其他元素根本就沒有創(chuàng)建它們,訪問時(shí)會(huì)返回undefined,就好像一個(gè)未定義的屬性一樣。運(yùn)行t[5]()會(huì)彈出6。t[7]則是一個(gè)嵌套數(shù)組。
除了上述定義方法,數(shù)組還有兩種表示法:
var s =new Array(0, 1, '2', 'three', false);var t = [0, 1, '2', 'three', false];
這兩種方法無法指定特定的索引序列,其中后一種方法數(shù)組字面量常用。
如getElementsByTagName獲得的節(jié)點(diǎn)列表并不是數(shù)組,可以看做為缺乏所有定義在數(shù)組對(duì)象上的有用方法的只讀數(shù)組,以后再介紹。
length屬性表示數(shù)組長度,數(shù)組長度總是最大的索引數(shù)加1,包括稀疏數(shù)組。增加減少元素會(huì)更新length的值,對(duì)length屬性賦值會(huì)改變數(shù)組,訪問超出長度的索引會(huì)返回undefined。
設(shè)t是一個(gè)數(shù)組,有四種方法增減元素:t.unshift(x);用來插入一個(gè)起始元素,t.shift();刪除一個(gè)起始元素,t.push(x)插入一個(gè)末尾元素,t.pop()刪除一個(gè)末尾元素。
?
轉(zhuǎn)載于:https://www.cnblogs.com/bloodmage/archive/2010/07/30/1758573.html
總結(jié)
以上是生活随笔為你收集整理的ppk on javascript 笔记(五)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 腾达 PR204 无线路由器设置宽带连接
- 下一篇: gradle idea java ssm