javascript語言精粹總結

一、javascript語法

Number

它在內部被表示爲64位的浮點數,而且它沒有分離出整數,1.0===1.好處是完全避免短整型溢出的問題。

string

  • 字符串字面量可以包含在一對單引號或者雙引號中,javascript中所以字符都是16位的。
  • 字符串有一個length屬性。
  • 完全相同的字符+字符串順序一樣的字符串被認爲是相同的字符串。
  • 字符串連接有很多種,例如concat、slice、+,array.join()一般用+號比較好,根據瀏覽器的不同在提高性能方面也有不同。

二、對象

對象字面量

如果屬性名不是標識符(字母開頭,後面也可以加下劃線、字母、數字),那麼需要用“”括起來屬性名,例如first-name。
var obj={
name:“leo”,
age:“22”
}

原型

原型連接在更新時不起作用。就是我們對某個對象做出改變時,他會觸及該對象的原型。只有在檢索時,會起作用。當我們找不到該對象的某個屬性時,可以去其原型對象中找。

枚舉

  • for in可以遍歷所有的可枚舉的屬性,包括原型上的。你可以通過hasOwnProperty來過濾一些你不想要的值。
  • for in遍歷出現的屬性名的順序不確定,如果你想要屬性以特定的順序出現,可以避免使用for in,而是將屬性名以正確順序放在一個數組中。

三、函數

函數調用

  • 除了函數聲明事定義的形參外,每個函數還接受兩個附加的參數:this和arguments。
  • 函數調用時,this邦定在全局對象上,但是當一個內部函數被調用是,應該將this邦定在外部函數的this變量上。解決辦法:
function doubels(){
var that=this;//解決辦法
  var helper=function(){
  return that.value;
  }
  helper();
}

遞歸

遞歸是可以直接或者間接調用自己的函數。可以非常高效地操作樹形結構,例如DOM。一些語言也通過尾遞歸進行優化,目前javascript並沒有提供尾遞歸優化。

回調

如果網絡傳輸或者服務器很慢,採用異步請求,解決瀏覽器的阻塞問題。回調是異步請求之一,其中還包括promise、asyns/await、事件監聽等等。

級聯(一條語句一次調用一個對象的很多方法)

一些方法沒有返回值,我們可以通過級聯讓這些方法返回this而不是undefined。

$('.mydiv').move(200,200).color('red').........;

柯里化

把多參數函數轉化爲一系列單參數函數並進行調用的技術。

Function.prototype.curry=function(){
  var args=Array.prototype.slice.apply(arguments);
  var _this=this;
  return function(){
  return _this.apply(null,args.concat(Array,prototype.slice.apply(arguments)));
  }
}

記憶

在計算機領域,記憶主要用於加速程序計算的一種優化技術,它使得函數避免重複演算。

//一個簡單斐波那契數列的優化
var fibonacci=function(){
//1.名爲memo的數組保存我們的存儲結果
var memo=[0,1];
var fib=function(n){
//2.存儲結果隱藏在閉包中
 var result=memo[n];
 if(typeof result !=='number'){
 return result=fib(n-1)+fib(n-2);
 }
 //3.如果結果存在,就返回這個結果。
 return result;
};
return fib;
}

四、繼承

new的實現

function _new(){
//1.創建一個新對象
var obj={};
//將構造函數的作用域指向這個新對象
var other=this.apply(obj,arguments);
//如果它的返回值不是一個對象,那麼就返回新對象
return (typeof other === 'object'&& other)||obj;
}

函數化

我們所看到的繼承模式的一個弱點及時沒辦法保護隱私。有些程序員會考慮接受一種僞裝隱私的模式,就是給屬性起一個奇奇怪怪的名字。我們可以通過應用模塊模式來保護隱私。

var constructor=function(spec,my){
var that,其他的私有實例變量;
my=my ||{};//祕密共享的容器
把共享的變量和函數添加到my中
that=一個新對象
擴充that添加特權方法
return that;

}

五、數組

刪除

數組刪除會留下一個空洞。可以通過splice解決。

var arr=[1,2,3,4]
delete arr[2]//arr=[1,2,undefined,4]
arr.splice(2,1);//[1,2,4]

array.sort()

sort方法對array中的內容進行排序,但是不能正確的給一組數字排序。需要通過自己的比較函數代替默認的比較函數。
不穩定的。穩定性是指排序後相等值的相對位置沒有發生變化。

//數字的升序
arr.sort(function(a,b){
  return a-b;
})
//字符串排序
var m=['aa','bb'.'a',2,4,1,6];
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;
});
//m=[1,2,4,6,'a','aa','bb']

六、正則表達式Regexp

處理正則表達式的方法

regexp.exec(string) 返回一個數組
regexp.test(string) 匹配返回true 不要使用/g
string match(regexp) /g,如果沒有g和regexp.exec()結果相同
string.replace(searchvalue,replacevalue) str.replace(/c/g,‘b’)
string.search(regexp) text.search(/[" ']/)會返回第一個匹配的首字符的位置,沒有返回-1
string.split() 如果是正則,有的系統會排出空字符串,有的不會

regexp對象的屬性

屬性 用法
global 如果標識g被使用,值爲true
ignoreCase 標識i使用,值爲true
lastIndex 下一次exec匹配開始的索引。初始值爲0
multiline 標識m(換行)被使用,值爲true
source 正則表達源碼文本

正則表達式轉義

/d [0-9]數字
/s 空白
/w [0-9A-Za-z]字母和數字
/b 邊界

正則表達式字符轉義

字符類中需要轉義的特殊字符:- / [ \ ] ∧

正則表達式分組

捕獲型 非捕獲型 向前正向匹配 向前負向匹配
任何匹配這個分組的字符都會捕獲,每個捕獲型分組會被指定一個數字,正則表達式中第一個捕獲( 的分組1,第二個捕獲 (是分組2 ?: 只做簡單的匹配,並不捕獲所匹配的文本 ?= 匹配後,文本會倒回到它開始的地方,實際上並不匹配任何東西。 ?! 匹配失敗後才繼續向前進行匹配

七、代碼風格

  1. 儘量只有唯一的全局變量。因爲全局變量可以被程序任何部分在任意時間修改。降低程序的可靠性。
  2. 在每個函數開頭聲明我的所有變量。
  3. 在if中不使用賦值語句。我們要做的是===
  4. 不使用塊註釋 因爲一些正則也會出現/ * * /
  5. 少用with語句和eval語句(以及 setTimeout、setInterval、Function提供了訪問javascript編譯器的機會)
  6. ++ --少用,會引起緩衝區溢出。i+=1
  7. 類型的包裝對象,主要用來操作基本類型的。不要使用new String 、new Number 、new Boolean
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章