1、Array類型函數
array.concat(item...)
函數功能:關聯數組,實現數組相加功能,但並不影響原先數組,concat返回新數組。

array.join(separator)
函數功能:將array中的每個元素用separator為分隔符構造成字符串,默認的separator是逗號,當然你可以自己指定separator
事實上join方法最常用的地方在字符串相加,用過js的人都知道js的字符串相加是特別慢且性能特別差的,把大量片段字符串放在一個數組中並用join方法連接比用+連接要快得多。

array.pop()
pop和push方法使數組array像堆棧一樣工作。
函數功能:pop方法移除array中的最后一個元素並返回該元素。
如果array是空的,則返回undefined;

array.push(item...)
函數功能:push方法將一個或多個item參數附加到array尾部。但是它不像concat方法那樣,push方法不會修改item參數,如果參數item是一個數組,它會將參數數組作為單個元素整個添加到數組中,它返回array的新長度

array.reverse()
函數功能:反轉array中元素的順序,返回當前array
array.shift()
函數功能:移除array中的第一個元素並返回該元素,如果array是空的,它會返回undefined。
shift比pop要慢很多
array.slice(start,end)
函數功能:對array中的一段做淺復制。end參數是可選的,默認值為數組的長度array.length。
如果兩個參數中任何一個是負數,array.length將和它們相加來試圖將它們成為非負數。
如果start大於等於array.length,得到的結果將是一個新的空數組

array.sort(compareFn)
函數功能:對array中的內容進行排序。
var n = [4, 8, 15, 16, 23, 43]; n.sort(function (a, b) { return a - b; }); console.log(n); //[4, 8, 15, 16, 23, 43]
var m = ['aa', 'bb', 'a', 4, 8, 15, 16, 23, 43]; m.sort(function (a, b) { if (a === b) { return 0; } if (typeof a === typeof b) { return a < b ? -1 : 1; } return typeof a < typeof b ? -1 : 1; }); console.log(m); //[4, 8, 15, 16, 23, 43, "a", "aa", "bb"]
var compare = function (name) { return function (o, p) { var a, b; if (typeof o === 'object' && typeof p === 'object' && o && p) { a = o[name]; b = p[name]; if (a === b) { return 0; } if (typeof a === typeof b) { return a < b ? -1 : 1; } return typeof a < typeof b ? -1 : 1; } else { throw { name: "Error", message: 'Expected an object when sorting by ' + name }; } }; }; var s = [ { first: 'Joe', last: 'Felix' }, { first: 'Moe', last: 'Besser' }, { first: 'Joe', last: 'Howard' }, { first: 'Shemp', last: 'DeRita' }, { first: 'Larry', last: 'Howard' }, { first: 'Curly', last: 'Fine' }, { first: 'Shirly', last: 'Angela' } ]; s.sort(compare('first')); /* s = [ { first: 'Curly', last: 'Fine' }, { first: 'Joe', last: 'Felix' }, { first: 'Joe', last: 'Howard' }, { first: 'Larry', last: 'Howard' }, { first: 'Moe', last: 'Besser' }, { first: 'Shemp', last: 'DeRita' }, { first: 'Shirly', last: 'Angela' } ]; */
array.splice(start,deleteCount,item...)
函數功能:從array中移除1個或多個元素,並用新的item替換它們。返回一個包含移除元素的數組。
array.unshift(item...)
函數功能:將item插入到array的開始部位。返回array的新長度值。
2、Function類型函數
function.apply(thisArg,argArray)
Function.prototype.bind = function (that) { //返回一個函數,調用這個函數就像它是那個對象的方法一樣 var method = this, slice = Array.prototype.slice, args = slice.apply(arguments, [1]); return function () { return method.apply(that, args.concat(slice.apply(arguments, [0]))); }; }; var x = function () { return this.value; } .bind({ value: 666 }); console.log(x());//666
3、Number類型函數
number.toExponential(fractionDigits)
函數功能:把number轉換成一個指數形式的字符串。可選參數fractionDigits控制其小數點后的數字位數,它的值必須在0到20之間。

number.toFixed(fractionDigits)
函數功能:把number轉換成一個十進制形式的字符串。可選參數fractionDigits控制其小數點后的數字位數,它的值必須在0到20之間。默認為0。

number.toPrecision(precision)
函數功能:把number轉換成一個十進制形式的字符串。可選參數fractionDigits控制其小數點后的數字位數,它的值必須在1到21之間。

number.toString(radix)
函數功能:把number轉換成一個字符串。可靠參數radix控制基數,它的值必須在2和36之間,默認為10

4、Object類型函數
object.hasOwnProperty(name)
函數功能:如果object包含名為name的屬性,hasOwnProperty方法將返回true,原型鏈中的同名屬性是不會被檢查的。
for (name in obj) { if (obj.hasOwnProperty(name)) { console.log(obj[name]); } }
5、Regexp類型函數
regexp.exec(string)
函數功能:成功匹配regexp和字符串,返回一個數組。
數組中下標為0的元素包含正則表達式regexp匹配的子字符串
下標為1的元素是分組1捕獲的文本,下標為2的元素是分組2捕獲的文本,依此類推。如果匹配失敗,就返回null。
如果regexp帶有一個g(全局)標志,查找不是從這個字符串起始位置開始,而是從regexp.lastIndex(它的初始值為0)位置開始,如果匹配成功,那么regexp.lastIndex將被設置為該匹配后第一個字符的位置。 不成功的匹配會重置regexp.lastIndex為0
regexp.test(string)
函數功能:如果regexp匹配string,返回true 否則返回false
6、String類型函數
string.charAt(pos)
函數功能:返回在string中pos位置處的字符。
如果pos小於0或者大於string.length,將返回空字符串
string.charCodeAt(pos)
函數功能:返回在string中pos位置處的字符的字符編碼。
string.concat(string...)
函數功能:連接字符串(不過很少被使用,因為用運算符+也能實現這個功能)
string.indexOf(searchString,position)
函數功能:在string內查找另一個字符串searchString,如果找到則返回第一個匹配字符的位置,否則返回-1。
可選參數position可設置從string的某個位置開始查找。
string.lastIndexOf(searchString,position)
函數功能:跟indexOf方法類似,區別是從字符串的末尾開始查找而不是從開頭。
string.localCompare(that)
函數功能:比較兩個字符串
string.match(regexp)
函數功能:匹配一個字符串和一個正則表達式。
如果沒有g標識,string.match(regexp)和regexp.exec(string)結果相同。
如果有g標識,返回一個包含除捕獲分組之處的所有匹配的數組。
string.replace(searchValue,replaceValue)
函數功能:對string進行查找和替換操作,並返回一個新的字符串。
var oldAreaCode = /\((\d{3})\)/g; var p = '(555)(666)-1212'.replace(oldAreaCode, '$1-'); console.log(p);//555-666--1212
string.search(regexp)
函數功能:和indexOf方法類似,只是它接受一個正則表達式作為參數而不是一個字符串,如果找到匹配返回第一個匹配的首字符位置,如果沒有找到匹配,則返回-1。
string.slice(start,end)
函數功能:復制string的一部分來構造一個新的字符串。
如果start參數是負數,它將與string.length相加。end參數是可選的,並且它的默認值是string.length。如果end參數是負數,它將與string.length相加。end參數是一個比最末一個字符的位置值還大的數。
string.split(separator,limit)
函數功能:把string分割成片段來創建一個字符串數組。可選參數limit可以限制被分割的片段數量。
var digits = '0123456789'; var a = digits.split('', 5); //["0", "1", "2", "3", "4"]
string.substring(start,end)
函數功能:substring的用法和slice方法一樣,只是它不能處理負數參數,一般性的用slice替代它。
string.toLocalLowerCase()
函數功能:用本地化的規則把string中的所有字母轉換為小寫格式。
string.toLocalUpperCase()
函數功能:用本地化的規則把string中的所有字母轉換為大寫格式。
string.toLowerCase()
函數功能: 把string中的所有字母都轉化為小寫格式。
string.toUpperCase()
函數功能: 把string中的所有字母都轉化為大格式。
string.fromCharCode(char...)
函數功能:從一串數字中返回一個字符串。
var a = String.fromCharCode(67, 97, 116); console.log(a);//Cat;
書寫可讀性的JavaScript
可讀性的大部分內容都是和代碼縮進相關的,必須保證代碼有良好的格式。可讀性的另一方面就是注釋,一般而言,有如下一些地方需要進行注釋
1.1.1 函數和方法
每個函數或方法都應該包含一個注釋,描述其目的和用於完成任務所可能使用的算法,陳述事先的假設也非常重要,如參數代表什么,函數是否有返回值等等
1.1.2 大段代碼
用於完成單個任務的多行代碼應該在前面放一個描述任務的注釋
1.1.3 復雜的算法
如果使用了一個獨特的方式解決某個問題,則要在注釋中解釋你是如何做的,這不僅僅可以幫助其它瀏覽你代碼的人,也能在下次你自己查閱代碼的時候幫助理解
1.1.4 Hack
因為存在瀏覽器差異,JavaScript代碼一般會包含一些Hack,不要假設其他人在看代碼的時候能夠理解Hack所要應付的瀏覽器問題,如果因為某種瀏覽器無法使用普通的方法,所以你需要用一些不同的方法,那么請將這些信息放在注釋中。
1.1.5 代碼排版
1.1.5.1 行長度
每行代碼應小於 80 個字符。如果代碼較長,應盡量選擇換行,下一行代碼應縮進4 個空格。這樣可以使代碼排版整齊,減輕閱讀代碼的疲勞感,以增強代碼的可閱讀性
1.1.5.2 行結束
JavaScript 語句應該以分號結束。但大多數瀏覽器允許不寫分號,只要在本應是分號的地方有一個換行符就行。但是如果代碼行較長需要換行的時候,有哪些注意事項呢?換行應選擇在操作符和標點符號之后,最好是在逗號','之后,而不要在變量名、字符串、數字、或')' ']' '++' '--'等符號之后換行。這樣可以有效的防止拷貝、粘貼而引起的錯誤,並可有效地增強代碼的可閱讀性。
例如:var valueB = valueA ///bad
+1;
可以替換為:var valueC = valueB + ///good
valueA;
1.1.5.3 注釋
我們會強調代碼中注釋數量的多少,而輕視了對注釋質量的提高。編碼是及時添加注釋,會給后續代碼的維護人員帶來很大的便利。但是如果注釋不注意更新,或者由於拷貝、粘貼引起的錯誤的注釋,則會誤導閱讀人員,反而給閱讀帶來障礙,除了注釋要及時更新外,我們還應對注釋的內容要特別關注。注釋要盡量簡單、清晰明了,避免使用含混晦澀的語言,同時着重注釋的意義,對不太直觀的部分進行注解。
例如:
//following section is used to initialize golbal variables (good)
var valueA = 0; //initialize valueA to be sero (bad)
var valueB = 1;
...
//call f1 function after waiting for 50 seconds. (good)
setTimeout (f1,50000); //set timeout to be 20s (copy error)
大功能塊的功能描述:
/*
*@desc:功能描述
*@param:參數描述
*@return:返回值
*/
1.1.5.4 縮進
建議使用4個空格來進行縮進
1.1.5.5 空白符
適當的空白行可以大大提高代碼的可閱讀性,可以使代碼邏輯更清晰易懂。同時,在表達式中適當的留空白,也會給代碼的閱讀帶來方便,關鍵字的后面如有括號,則最好在關鍵字和左括號'('之間留空白,如 for, if, while 等。而函數名和括號之間則不宜留空白,但若是匿名函數,則必須在 function 和左括號'('之間留空白,否則,編輯器會誤認為函數名為 function。在表達式中,二元運算符 ( 除左括號'(',左方括號'[',作用域點'.') 和兩個操作數之間最好留空白。一元運算符(若不是詞 typeof 等)和其操作數之間不宜留空白。逗號','的后面需要留空白,以顯示明確的參數間隔,變量間隔等。分號';'之后通常表明表達語句的結束,而應空行。在 for 的條件語句中,分號之后則應該留空白。
總結一句就是縮進和注釋可以帶來更可讀的代碼,還有就是用空行來將邏輯相關的代碼塊分割開可以提高程序的可讀性,增加程序的可讀性只為了在未來代碼更容易維護。
1.2 變量和函數命名
JavaScript是嚴格區分大小寫的,名稱的也遵循以下規則:
- 第一個字符必須是字母、下划線、或一個美元符號$
- 其它字符可以是字母、下划線、美元符號或數字
- 變量、參數、成員變量、函數等名稱均以小寫字母開頭,構造器的名稱以大寫字母開頭
- 下划線'_'開頭的變量一般習慣於標識私有/局部成員
- 美元符號'$'開頭的變量習慣於標識系統相關,比如系統進程等。應避免用下划線'_'或美元符號'$'來命名標識符。盡可能地降低代碼的閱讀負擔
每一行最多只包含一條語句,必須將分號放在簡單語句的結尾外,雖然分號在JavaScript是可有可無了,但是為了壓縮后不容易報錯,強制性的必須每條js代碼都得以分號結束
1.2.1 變量名應為名詞
如car或person,如果是私有變量,則在名稱前加_下划線
1.2.2 函數名應該為動詞開始
如getName(),返回布爾類型值的函數一般以is開始,如isEnable(),如果是普通函數,則第一個字母小寫,如果是構造函數,則第一個字母大寫。函數名與((左括號)之間不應該有空格。)(右括號)與 開始程序體的{(左大括號)之間應插入一個空格,}(右大括號)應該與函數名在同一行而不應該另起一行
1.2.3 變量和函數都應使用合乎邏輯的名字
不要擔心長度,長度問題可以通過處理和壓縮
1.2.4 所有變量聲明都需要放到函數最頂部聲明或者說是作用域開始部位聲明
1.3 變量類型透明
因為JavaScript是弱類型(也叫松散類型)語言,很容易忘記變量所應包含的數據類型。使用匈牙利標記法來指定變量類型,匈牙利標記法就是在變量名之前加上一個或多個字符來表示數據類型。JavaScript中最傳統的匈牙利標記法是用單個字符表示基本類型:“O”代碼對象,“S”代表字符串,“I”代表整數,“F”代表浮點數,“B”代表布爾型。如下所示
var bFound; //布爾型
var iCount; //整數
var sName; //字符串
var oPerson; //對象
簡單幾句話來說就是:
1:樣式與javascript分離
2:1、循環語句中length屬性可以用變量保存。2、為事件處理器創建重用的函數。
3:使用配置對象存放代碼中的硬編碼,如使用到的文本標簽或自定義的屬性名。有利於后續的維護。
4:為變量和函數起有含義的名字
5:添加必要的注釋
JavaScript變量聲明的淺談
相對於C/C++來說,ECMAScript里的for循環並不能創建一個局部的上下文。
for (var k in {a: 1, b: 2}) { alert(k); } alert(k); // 盡管循環已經結束但變量k依然在當前作用域
任何時候,變量只能通過使用var關鍵字才能聲明。
上面的賦值語句:
a = 10;
這僅僅是給全局對象創建了一個新屬性(但它不是變量)。“不是變量”並不是說它不能被改變,而是指它不符合ECMAScript規范中的變量概念,所以它“不是變量”(它之所以能成為全局對象的屬性,完全是因為javascript中存在一個global對象,這樣的操作不是聲明一個變量而是給global對象增加一個a屬性。
下面看一個簡單的例題來說明問題
if (!("a" in window)) { var a = 1; } alert(a);
首先,所有的全局變量都是window的屬性,語句 var a = 1;等價於window.a = 1;
你可以用如下方式來檢測全局變量是否聲明
"變量名稱" in window
第二,所有的變量聲明都在范圍作用域的頂部,看一下相似的例子:
alert("a" in window);
var a;
此時,盡管聲明是在alert之后,alert彈出的依然是true,這是因為JavaScript引擎首先會掃墓所有的變量聲明,然后將這些變量聲明移動到頂部,最終的代碼效果是這樣的:
var a; alert("a" in window);
第三,你需要理解該題目的意思是,變量聲明被提前了,但變量賦值沒有,因為這行代碼包括了變量聲明和變量賦值。
你可以將語句拆分為如下代碼:
var a; //聲明 a = 1; //初始化賦值
所以總結起來就是當變量聲明和賦值在一起用的時候,JavaScript引擎會自動將它分為兩部以便將變量聲明提前,不將賦值的步驟提前是因為他有可能影響代碼執行出不可預期的結果。
題目中的代碼相當於:
var a; if (!("a" in window)) { a = 1; } alert(a);
根據上述例題的分析,聲明變量時如果是聲明的局部變量前面一定要加var,如果聲明的是全局變量可以不加var(最好限制全局變量的個數,盡量使用局部變量)
下面講述一個使用var的幾個特性
使用var語句多次聲明一個變量不僅是合法的,而且也不會造成任何錯誤。
如果重復使用的一個聲明有一個初始值,那么它擔當的不過是一個賦值語句的角色。
如果重復使用的一個聲明沒有一個初始值,那么它不會對原來存在的變量有任何的影響。
沒有var聲明的變量,是作為全局變量存在的;有var聲明的變量,屬於局部變量,尤其是在函數內部。並且,經過測試,帶var聲明比不帶var速度要快。函數內盡量多設局部變量,這樣即安全又快速,變量操作也更加合理,不會因為函數內胡亂操作全局變量而導致邏輯錯誤。
聲明對象時最好使用對象自面量的方式,這樣的速度相對new的方式要快很多。
變量名是自己取的,為了照顧語義和規范,變量名可能稍長,但是注意了,變量名的長度也會影響代碼的執行速度。長的變量名聲明的執行速度沒有短的快。
