JavaScript 是一種復雜的語言。如果是你是高級或者初級 JavaScript 開發人員,了解它的基本概念非常重要。本文介紹 JavaScript 至關重要的12個概念,但絕對不是說 JavaScript 開發人員只需要知道這些就可以了。
1.變量賦值 (值 vs 引用)
理解 JavaScript 如何給變量賦值可以幫助我們減少一些不必要的 bug。如果你不理解這一點,可能很容易地編寫被無意中更改值的代碼。
JavaScript 總是按照值來給變量賦值。 這一部分非常重要:當指定的值是 JavaScript 的五種基本類型之一(即 Boolean,null,undefined,String 和 Number)時,將分配實際值。 但是,當指定的值是 Array,Function或Object時,將分配對內存中對象的引用給變量。
在以下代碼段中,使用 var1 對 var2 進行賦值。 由于var1是基本類型(String),因此 var2 的值等于 var1 的 String 值,并且可以認為此時與var1完全不同。 因此,重新賦值var2對var1沒有影響。
let var1 = 'My string';let var2 = var1;var2 = 'My new string';console.log(var1);// 'My string'console.log(var2);// 'My new string'
接著,與對象賦值進行比較。
let var1 = { name: 'Jim' }let var2 = var1;var2.name = 'John';console.log(var1);// { name: 'John' }console.log(var2);// { name: 'John' }如果你期望它會像原始類型賦值那樣,很可能會出問題!如果你創建了一個無意中會改變對象的函數,就會出現一些非預期的行為。
2.閉包
閉包是一個重要的JavaScript模式,可以私有訪問變量。在本例中,createGreeter返回一個匿名函數,這個函數可以訪問參數 greeting(在這里是“Hello”)。在后續的調用中,sayHello 將有權訪問這個 greeting!
function createGreeter(greeting) { return function(name) { console.log(greeting + ', ' + name); }}const sayHello = createGreeter('Hello');sayHello('Joe');// Hello, Joe在更真實的場景中,你可以設想一個初始函數apiConnect(apiKey),它返回一些使用API key的方法。在這種情況下,apiKey 只需要提供一次即可。
function apiConnect(apiKey) { function get(route) { return fetch(`${route}?key=${apiKey}`); } function post(route, params) { return fetch(route, { method: 'POST', body: JSON.stringify(params), headers: { 'Authorization': `Bearer ${apiKey}` } }) } return { get, post }}const api = apiConnect('my-secret-key');// No need to include the apiKey anymoreapi.get('http://www.example.com/get-endpoint');api.post('http://www.example.com/post-endpoint', { name: 'Joe' });3.解構
JavaScript 參數解構可以從對象中干中提取所需屬性的常用方法。
const obj = { name: 'Joe', food: 'cake'}const { name, food } = obj;console.log(name, food);// 'Joe' 'cake'
新聞熱點
疑難解答
圖片精選