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