亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > JS > 正文

12個提高JavaScript技能的概念(小結)

2024-05-06 16:50:38
字體:
來源:轉載
供稿:網友

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'

如果要以其他名稱提取屬性,可以使用如下方式:

const obj = { name: 'Joe', food: 'cake'}const { name: myName, food: myFood } = obj;console.log(myName, myFood);// 'Joe' 'cake'

解構經常也用于直接用于提取傳給函數的參數。如果你熟悉 React,可能已經見過這個:

const person = { name: 'Eddie', age: 24}function introduce({ name, age }) { console.log(`I'm ${name} and I'm ${age} years old!`);}console.log(introduce(person));// "I'm Eddie and I'm 24 years old!"

4. 展開運算

ES6的一個常用之一的特性就是展開(...)運算符了,在下面的例子中,Math.max 不能應用于 arr 數組,因為它不將數組作為參數,但它可以將各個元素作為參數傳入。展開運算符...可用于提取數組的各個元素。

const arr = [4, 6, -1, 3, 10, 4];const max = Math.max(...arr);console.log(max);// 10

5. 剩余參數

剩余參數語法和展開語法看起來的一樣的,不同的是展開語法是為了結構數組和對象;而剩余參數和展開運算符是相反的,剩余參數收集多個元素合成一個數組。

function myFunc(...args) { console.log(args[0] + args[1]);}myFunc(1, 2, 3, 4);// 3

rest parameters 和 arguments 的區別

  1. arguments 是偽數組,包含所有的實參
  2. 剩余參數 是標準的數組,可以使用數組的方法

6. 數組方法

JavaScript 數組方法通常可以提供令人難以置信的、優雅的方法來執行所需的數據轉換。作為StackOverflow 的貢獻者,我經??吹疥P于如何以某種方式操縱對象數組的問題,這往往也是數組方法的完美用例。

map、filter、reduce

JavaScript 數組方法map、filter和reduce容易混淆,這些都是轉換數組或返回聚合值的有用方法。

map:返回一個數組,其中每個元素都使用指定函數進行過轉換。

const arr = [1, 2, 3, 4, 5, 6];const mapped = arr.map(el => el + 20);console.log(mapped);// [21, 22, 23, 24, 25, 26]

filter:返回一個數組,只有當指定函數返回 true 時,相應的元素才會被包含在這個數組中。

const arr = [1, 2, 3, 4, 5, 6];const filtered = arr.filter(el => el === 2 || el === 4);console.log(filtered);// [2, 4]

reduce:按函數中指定的值累加

const arr = [1, 2, 3, 4, 5, 6];const reduced = arr.reduce((total, current) => total + current);console.log(reduced);// 21

find, findIndex, indexOf

find:返回與指定條件匹配的第一個實例,如果查到不會繼續查找其他匹配的實例。

const arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];const found = arr.find(el => el > 5);console.log(found);// 6

再次注意,雖然5之后的所有元素都滿足條件,但是只返回第一個匹配的元素。當你發現匹配項時,通常會中斷for循環,在這種情況下,這實際上非常有用。

findIndex:這與find幾乎完全相同,但不是返回第一個匹配元素,而是返回第一個匹配元素的索引。

const arr = ['Nick', 'Frank', 'Joe', 'Frank'];const foundIndex = arr.findIndex(el => el === 'Frank');console.log(foundIndex);// 1

indexOf:與findIndex幾乎完全相同,但它不是將函數作為參數,而是采用一個簡單的值。 當w你需要更簡單的邏輯并且不需要使用函數來檢查是否存在匹配時,可以使用此方法。

const arr = ['Nick', 'Frank', 'Joe', 'Frank'];const foundIndex = arr.indexOf('Frank');console.log(foundIndex);// 1

push, pop, shift, unshift

push:這是一個相對簡單的方法,它將一個項添加到數組的末尾。它就地修改數組,函數本身會返回添加到數組中的項。

let arr = [1, 2, 3, 4];const pushed = arr.push(5);console.log(arr);// [1, 2, 3, 4, 5]console.log(pushed);// 5

pop:這將從數組中刪除最后一項。同樣,它在適當的位置修改數組,函數本身返回從數組中刪除的項。

let arr = [1, 2, 3, 4];const popped = arr.pop();console.log(arr);// [1, 2, 3]console.log(popped);// 4

shift:從數組中刪除第一項。同樣,它在適當的位置修改數組。函數本身返回從數組中刪除的項。

let arr = [1, 2, 3, 4];const shifted = arr.shift();console.log(arr);// [2, 3, 4]console.log(shifted);// 1

unshift:將一個或多個元素添加到數組的開頭。同樣,它在適當的位置修改數組。與許多其他方法不同,函數本身返回數組的新長度。

let arr = [1, 2, 3, 4];const unshifted = arr.unshift(5, 6, 7);console.log(arr);// [5, 6, 7, 1, 2, 3, 4]console.log(unshifted);// 7

splice, slice

splice:通過刪除或替換現有元素和/或添加新元素來更改數組的內容,此方法會修改了數組本身。

下面的代碼示例的意思是:在數組的位置 1 上刪除 0 個元素,并插入 b。

let arr = ['a', 'c', 'd', 'e'];arr.splice(1, 0, 'b')

slice:從指定的起始位置和指定的結束位置之前返回數組的淺拷貝。 如果未指定結束位置,則返回數組的其余部分。 重要的是,此方法不會修改數組,而是返回所需的子集。

let arr = ['a', 'b', 'c', 'd', 'e'];const sliced = arr.slice(2, 4);console.log(sliced);// ['c', 'd']console.log(arr);// ['a', 'b', 'c', 'd', 'e']

sort

sort:根據提供的函數對數組進行排序。這個方法就地修改數組。如果函數返回負數或 0,則順序保持不變。如果返回正數,則交換元素順序。

let arr = [1, 7, 3, -1, 5, 7, 2];const sorter = (firstEl, secondEl) => firstEl - secondEl;arr.sort(sorter);console.log(arr);// [-1, 1, 2, 3, 5, 7, 7]

7. Generators(生成器)

生成器是一種特殊的行為,實際上是一種設計模式,我們通過調用next()方法來遍歷一組有序的值。想象一下,例如使用遍歷器對數組[1,2,3,4,5]進行遍歷。第一次調用next()方法返回1,第二次調用next()方法返回2,以此類推。當數組中的所有值都返回后,調用next()方法將返回null或false或其它可能的值用來表示數組中的所有元素都已遍歷完畢。

function* greeter() { yield 'Hi'; yield 'How are you?'; yield 'Bye';}const greet = greeter();console.log(greet.next().value);// 'Hi'console.log(greet.next().value);// 'How are you?'console.log(greet.next().value);// 'Bye'console.log(greet.next().value);// undefined

使用生成器生成無限個值:

function* idCreator() { let i = 0; while (true)  yield i++;}const ids = idCreator();console.log(ids.next().value);// 0console.log(ids.next().value);// 1console.log(ids.next().value);// 2// etc...

8.恒等運算符(===)與相等運算符(==)

大家一定要知道JavaScript中的恒等運算符(===)和相等運算符(==)之間的區別! ==運算符在比較值之前會進行類型轉換,而===運算符在比較之前不會進行任何類型轉換。

console.log(0 == '0');// trueconsole.log(0 === '0');// false

9. 對象比較

我看到 JavaScript新手所犯的錯誤是直接比較對象。 變量指向內存中對象的引用,而不是對象本身! 實際比較它們的一種方法是將對象轉換為 JSON 字符串。 這有一個缺點:對象屬性順序不能保證! 比較對象的一種更安全的方法是引入專門進行深度對象比較的庫(例如,lodash的isEqual)。

下面的對象看起來是相等的,但實際上它們指向不同的引用。

const joe1 = { name: 'Joe' };const joe2 = { name: 'Joe' };console.log(joe1 === joe2);// false

相反,下面的計算結果為true,因為一個對象被設置為與另一個對象相等,因此指向相同的引用(內存中只有一個對象)。

const joe1 = { name: 'Joe' };const joe2 = joe1;console.log(joe1 === joe2);// true

相反,以下計算結果為true,因為一個對象設置為等于另一個對象,因此指向相同的引用(內存中只有一個對象)。

const joe1 = { name: 'Joe' };const joe2 = joe1;console.log(joe1 === joe2);// true

10. 回調函數

很多人都被 JavaScript 回調函數嚇倒了! 他們很簡單,舉個例子。 console.log 函數作為回調傳遞給myFunc。 它在setTimeout完成時執行。

function myFunc(text, callback) { setTimeout(function() {  callback(text); }, 2000);}myFunc('Hello world!', console.log);// 'Hello world!'

11. Promises

一旦你理解了 JavaScript 回調,很快就會發現自己陷入了“回調地獄”中。這個時候可以使用 promise,將異步邏輯包裝在 promise 中,成功時 resolve 或在失敗時reject 使用“then”來處理成功的情況,使用catch來處理異常。

const myPromise = new Promise(function(res, rej) { setTimeout(function(){  if (Math.random() < 0.9) {   return res('Hooray!');  }  return rej('Oh no!'); }, 1000);});myPromise .then(function(data) {  console.log('Success: ' + data);  })  .catch(function(err) {  console.log('Error: ' + err);  });  // If Math.random() returns less than 0.9 the following is logged:// "Success: Hooray!"// If Math.random() returns 0.9 or greater the following is logged:// "Error: On no!"

12. Async/Await

在掌握了 promise 的用法后,你可能也會喜歡 async await,它只是一種基于 promise 的“語法糖”。在下面的示例中,我們創建了一個 async 函數,并 await greeter promise。

const greeter = new Promise((res, rej) => { setTimeout(() => res('Hello world!'), 2000);})async function myFunc() { const greeting = await greeter; console.log(greeting);}myFunc();// 'Hello world!'

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VeVb武林網。


注:相關教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久久久日韩精品久久久男男| 91国在线精品国内播放| 国产精品爱啪在线线免费观看| 国产精品丝袜视频| 亚洲午夜av久久乱码| 久久精品99无色码中文字幕| 国产在线精品播放| 久久久久久久久久久久av| 日韩有码视频在线| 亚洲精品大尺度| 国产精品一区二区三区毛片淫片| 欧美高清性猛交| 国产剧情久久久久久| 欧美中文字幕精品| 欧美华人在线视频| 久久99热这里只有精品国产| 中文日韩在线视频| 日韩欧美在线国产| 国产精品黄页免费高清在线观看| 欧美色视频日本高清在线观看| 国产日韩换脸av一区在线观看| 亚洲www永久成人夜色| 久久久精品在线| 亚洲欧美一区二区精品久久久| 一区二区三区四区视频| 91在线播放国产| 一级做a爰片久久毛片美女图片| 国产噜噜噜噜噜久久久久久久久| 一区二区在线免费视频| 欧美老肥婆性猛交视频| 一本色道久久88亚洲综合88| 国产综合香蕉五月婷在线| 日韩有码在线视频| 国产成人一区二区| 成人免费大片黄在线播放| 成人自拍性视频| 亚洲free性xxxx护士白浆| 日韩少妇与小伙激情| 欧美日韩国产成人高清视频| 91sa在线看| 精品国内自产拍在线观看| 亚洲国产99精品国自产| 国内精品伊人久久| 久久久久久久久网站| 91精品国产综合久久久久久蜜臀| 4k岛国日韩精品**专区| 国产精品aaaa| 性色av一区二区咪爱| 国模私拍视频一区| 久久天天躁夜夜躁狠狠躁2022| 欧美精品免费在线观看| 日本三级久久久| 亚洲国产精品一区二区三区| 国产盗摄xxxx视频xxx69| 粉嫩av一区二区三区免费野| 欧美国产视频日韩| 在线精品视频视频中文字幕| 琪琪第一精品导航| 亚洲美女激情视频| 国产成人精品视频| 欧美亚洲成人免费| 丝袜亚洲另类欧美重口| 在线观看日韩专区| 欧洲日本亚洲国产区| 精品视频—区二区三区免费| 国产有码在线一区二区视频| 久久精品视频99| 亚洲欧美日韩国产中文| 中文字幕日韩欧美在线视频| 97精品免费视频| 亚洲一区二区三区久久| 欧美日韩成人在线播放| 日本一本a高清免费不卡| 久久韩国免费视频| 成人a在线观看| 欧美美女18p| 国产日韩精品在线| 欧美精品在线免费播放| 2019亚洲男人天堂| 欧美激情2020午夜免费观看| 45www国产精品网站| 欧美成人sm免费视频| 国产精品久久久久久久久久小说| 日韩欧美国产骚| 日本一欧美一欧美一亚洲视频| 国产免费一区视频观看免费| 亚洲精品日韩激情在线电影| 北条麻妃一区二区三区中文字幕| 色先锋资源久久综合5566| 久久天天躁狠狠躁夜夜爽蜜月| 欧美亚洲国产视频小说| 性欧美亚洲xxxx乳在线观看| 中文字幕免费精品一区高清| 欧美日韩国产精品| 亚洲毛片在线免费观看| 一区二区三区精品99久久| 亚洲伦理中文字幕| 亚洲自拍小视频免费观看| 国产丝袜一区二区| 亚洲综合av影视| 国产精品日日摸夜夜添夜夜av| 欧美福利在线观看| 国产精品色午夜在线观看| 色综合久综合久久综合久鬼88| 久久久精品国产网站| 中文字幕久久亚洲| 久久精品电影网| 久久精品成人一区二区三区| 精品亚洲一区二区三区| 美女扒开尿口让男人操亚洲视频网站| 91网站在线免费观看| 欧美一级淫片播放口| 欧美日本国产在线| 亚洲欧美另类自拍| 亚洲一区精品电影| 欧美在线精品免播放器视频| 亚洲欧美一区二区三区在线| 国产精品美女久久| 久久久久国产精品一区| 亚洲国产天堂久久综合| 日韩av在线高清| 国产精品成人品| 国产91对白在线播放| 91网站在线看| 日韩中文字幕网站| 欧美大尺度在线观看| 国产成人在线精品| 91精品国产91久久久久| www.久久色.com| 国产视频欧美视频| y97精品国产97久久久久久| 欧美成人精品在线观看| 国产精品一区二区三| 亚洲最大av在线| 国产精品久久一区主播| 日韩精品在线观看一区二区| 欧美激情国产日韩精品一区18| 91免费综合在线| 日韩免费精品视频| 欧美亚洲视频在线看网址| 国模私拍一区二区三区| 一级做a爰片久久毛片美女图片| 亚洲激情成人网| 在线观看欧美日韩| 高清欧美性猛交xxxx黑人猛交| 97在线视频免费观看| 蜜臀久久99精品久久久久久宅男| 亚洲欧美国产另类| 亚洲人av在线影院| 亚洲国产精品美女| 日韩av电影中文字幕| 成人网欧美在线视频| 精品国产欧美成人夜夜嗨| 国产一区私人高清影院| 日韩人在线观看| 亚洲图片制服诱惑| 日韩中文字幕在线视频| 九九久久久久久久久激情| 欧美日韩成人在线视频| 日韩在线观看网址| 久久精品成人动漫| 日韩成人网免费视频| 欧美资源在线观看| 久久影院在线观看|