欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

JavaScript位置參數(shù)實現(xiàn)原理及過程解析

 更新時間:2020年09月14日 08:30:46   作者:小幾斤  
這篇文章主要介紹了JavaScript位置參數(shù)實現(xiàn)原理及過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下

1.什么是位置參數(shù)?

JavaScript:為什么命名參數(shù)比位置參數(shù)更好

你一定很熟悉位置參數(shù),即使你第一次聽到這個名字。

function greet(firstName, lastName) { 
 console.log(`Hello ${firstName} ${lastName}`); 
} 

// 預(yù)期用法 

greet('Michael', 'Scott'); 

const fName = 'Harry'; 
const lName = 'Potter'; 
greet(fName, lName); 

// 錯誤用法 

const firstName = 'Erlich'; 
const lastName = 'Bachman'; 
greet(lastName, firstName); 

greet函數(shù)接受兩個參數(shù):firstName和lastName。調(diào)用者必須確保firstName是第一個參數(shù),lastName是第二個參數(shù)。這里重要的一點是,參數(shù)的名稱沒有任何意義,唯一重要的是參數(shù)傳遞的順序。

這種熟悉的方法稱為位置參數(shù)。通常,在你傳遞一個或兩個參數(shù)的情況下,這很好,因為它很難弄亂參數(shù)的順序。但是如果你必須調(diào)用一個需要6個參數(shù)的函數(shù),那就很難記住傳遞參數(shù)的順序。你不希望傳遞密碼來代替用戶名參數(shù)。

2. 位置參數(shù)問題

位置參數(shù)很簡單,但是你將面臨一些挑戰(zhàn)。

(1) 不能跳過中間參數(shù) /

假設(shè)你已經(jīng)更改了greet函數(shù),使其現(xiàn)在需要3個參數(shù):firstName、middleName和lastName。由于許多人沒有中間名,因此你希望將MiddleName設(shè)為可選參數(shù),僅使用firstName和lastName調(diào)用greet函數(shù)的唯一方法是此方法。

greet('Aditya', null, 'Agarwal'); 
// Correct 
greet('Aditya', 'Agarwal'); 
// Incorrect 

你不能只提供firstName和lastName。當(dāng)可選參數(shù)的數(shù)量增加到5個時,這個問題變得更加明顯。現(xiàn)在,你必須提供5個null才能在這些參數(shù)之后提供參數(shù)。

(2) 將類型添加到位置參數(shù)不那么干凈

如今,為你的實用程序添加類型變得非常普遍。使用位置參數(shù),你別無選擇,只能將類型與函數(shù)定義一起內(nèi)聯(lián)。這可能會使代碼有點模糊,如果我們可以在一個塊中聲明所有參數(shù)的類型定義,那就更好了。

(3) 引起細(xì)微的錯誤

位置參數(shù)包裝了很多隱性行為,這可能是造成微妙bug的原因。我們來看一個常見的JS技巧問題

const numbers = ['1', '4', '8', '10'];
console.log(numbers.map(parseInt));

// 你可能會認(rèn)為結(jié)果將是:
[1, 4, 8, 10]

// 這是實際的輸出:
[ 1, NaN, NaN, 3 ]

驚訝嗎?這種奇怪的輸出的原因隱藏在位置參數(shù)的隱性背后。你會看到map和parseInt函數(shù)在顯而易見的情況下隱藏了它們的一些秘密。

讓我們再次查看代碼 number.map(parseInt)。

這里到底發(fā)生了什么?

  • 我們在numbers數(shù)組上運行map函數(shù)。
  • map獲取數(shù)組的第一項并將其傳遞給parseInt。
  • 現(xiàn)在,對于數(shù)組中的第一項(即1),它將執(zhí)行 parseInt(1)。對...?錯誤!!!

實際上,map將三個參數(shù)傳遞給其回調(diào)函數(shù)。第一個是數(shù)組中的當(dāng)前項目,第二個是項目的索引,第三個是整個數(shù)組。這本身沒有問題,但真正的問題在于后一部分。

numbers.map(parseInt) 與 numbers.map((item) => parseInt(item)) 不同。你可以假設(shè),由于回調(diào)函數(shù)僅接受item參數(shù)并將其傳遞給parseInt,因此我們可以跳過附加步驟。但是兩者是不同的:在前者中,我們將所有數(shù)據(jù)從map傳遞到parseInt,而在后者中,我們僅傳遞項。

你可能不知道,但是parseInt的第二個參數(shù)稱為基數(shù)。默認(rèn)情況下,基數(shù)的值為10(以10為底,因為人類遵循十進制進行計數(shù))。該代碼出了問題,就是我們將當(dāng)前項目的索引作為基數(shù)值傳遞給parseInt。這些是發(fā)生的實際函數(shù)調(diào)用:

parseInt('1', 0, [...]);
parseInt('4', 1, [...]);
parseInt('8', 2, [...]);
parseInt('10', 3, [...]);

現(xiàn)在我們知道了問題,我們?nèi)绾尾拍茏龅酶?#63;

3. 位置參數(shù)的替代

如果一個函數(shù)可以通過名字就知道它期望的參數(shù)是什么呢?這樣即使你誤傳了額外的數(shù)據(jù)給它,它也只會使用它需要的東西。

讓我們對parseInt進行包裝。下面是一個簡單的實現(xiàn)。

// 實現(xiàn) 
function myCustomParseInt(objArgs) { 
 return parseInt(objArgs.item, objArgs.radix); 
} 

// 使用 
const num = myCustomParseInt({ item: '100', radix: 10 }); 

myCustomParseInt僅接受一個參數(shù),它是一個對象。這個對象可以有兩個鍵:item 和 radix。讓我們使用我們的自定義函數(shù)與map。必須有一個中間步驟,將回調(diào)收到的args發(fā)送到myCustomParseInt。

const numbers = ['1', '4', '8', '10'];

const result = numbers.map((item, index) => myCustomParseInt({ item, index }));

console.log(result); // [ 1, 4, 8, 10 ]

請注意,即使我們將索引傳遞給myCustomParseInt也不會造成任何問題。那是因為myCustomParseInt只會忽略它。將對象傳遞給函數(shù)的這種模式稱為命名參數(shù),它比位置參數(shù)更明確。

要更改基數(shù),我們必須顯式傳遞基數(shù)鍵。這意味著如果要解析以2為底的字符串,則必須轉(zhuǎn)到文檔并查看參數(shù)(基數(shù))的確切名稱。如果我們盲目地傳遞任何其他鍵,它將無濟于事。這對我們來說很棒,因為它避免了意外行為。

(1) 具有解構(gòu)的命名參數(shù)

不久前,JavaScript獲得了稱為解構(gòu)的功能,讓我們在myCustomParseInt實現(xiàn)中使用它。

// 位置參數(shù) 
function myCustomParseInt(item, radix) { 
 return parseInt(item, radix); 
} 

// 命名參數(shù)舊的實現(xiàn) 
function myCustomParseInt(objArgs) { 
 return parseInt(objArgs.item, objArgs.radix); 
} 

// 命名參數(shù)解構(gòu) 
function myCustomParseInt({ item, radix }) { 
 return parseInt(item, radix); 
} 

你會注意到,只需添加兩個花括號,我們就可以得到命名args的好處,你可以將解構(gòu)視為執(zhí)行 const item = objArgs.item;。

如果使用 undefined 調(diào)用myCustomParseInt,則JS將引發(fā)錯誤。那是因為不允許 undefined.item。為了避免這種情況,我們可以在解構(gòu)結(jié)束時添加 = {}。這樣,當(dāng)我們傳遞undefined時,它將執(zhí)行 {}.item 這是有效的JS。這是最終的實現(xiàn):

function myCustomParseInt({ item, radix } = {}) { 
 return parseInt(item, radix); 
} 

通過命名參數(shù)模式,我們也可以跳過我們不想提供的參數(shù),因為函數(shù)不再依賴于傳遞參數(shù)的順序。

// 對于位置參數(shù),我們必須在之間添加一個null
function greetPos(firstName, middleName, lastName) {}
greetPos('Aditya', null, 'Agarwal');

// 使用命名參數(shù),你只需提供firstName和lastName。
function greetNamed({ firstName, middleName, lastName } = {}) {}
greetNamed({ firstName: 'Aditya', lastName 'Agarwal' });

總而言之,我要說的是命名參數(shù)是一種強大的模式,如今它已變得非常普遍,但是你不必總是使用它們。有時你甚至可以將兩者結(jié)合在一起。瀏覽器中的fetch API的用法如下:

// 以url作為位置參數(shù)的請求,以及以args做命名參數(shù)的選項。 
fetch('https://google.com', { 
 method: 'POST', 
 headers: { 
  'Content-Type': 'application/json', 
 }, 
}); 

// basic GET requests with just positional args 
fetch('https://google.com'); 

這里的強制參數(shù)(API路徑)是一個位置參數(shù),然后通過命名參數(shù)接受可選的參數(shù)。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • jsTree事件和交互以及插件plugins詳解

    jsTree事件和交互以及插件plugins詳解

    這篇文章主要為大家詳細(xì)介紹了jsTree事件和交互以及插件plugins的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • uniapp小程序底部tabbar圖標(biāo)大小設(shè)置辦法

    uniapp小程序底部tabbar圖標(biāo)大小設(shè)置辦法

    這篇文章主要給大家介紹了關(guān)于uniapp小程序底部tabbar圖標(biāo)大小設(shè)置辦法的相關(guān)資料,在使用uniapp進行開發(fā)時,tabbar是我們使用的很頻繁的一個組件,但是在特定的平臺會有一些使用上的限制,需要的朋友可以參考下
    2023-08-08
  • 點擊彈出層效果&彈出窗口后網(wǎng)頁背景變暗效果的實現(xiàn)代碼

    點擊彈出層效果&彈出窗口后網(wǎng)頁背景變暗效果的實現(xiàn)代碼

    本篇文章主要是對點擊彈出層效果&彈出窗口后網(wǎng)頁背景變暗效果的實現(xiàn)代碼進行了介紹,需要的朋友可以過來參考下,希望對大家有所幫助
    2014-02-02
  • js實現(xiàn)input的賦值小結(jié)

    js實現(xiàn)input的賦值小結(jié)

    這篇文章主要介紹了js實現(xiàn)input的賦值問題小結(jié),在實際的開發(fā)中,為了頁面的美觀,可能用到一些框架,比如EasyUI框架,文中介紹了easyui的input框賦值代碼,感興趣的朋友一起看看吧
    2023-12-12
  • JavaScript中的閉包

    JavaScript中的閉包

    閉包,官方對閉包的解釋是:一個擁有許多變量和綁定了這些變量的環(huán)境的表達式(通常是一個函數(shù)),因而這些變量也是該表達式的一部分
    2016-02-02
  • 用move.js庫實現(xiàn)百葉窗特效

    用move.js庫實現(xiàn)百葉窗特效

    本文主要介紹了用move.js庫實現(xiàn)百葉窗特效的思路與方法。具有很好的參考價值,下面跟著小編一起來看下吧
    2017-02-02
  • 使用uniapp打包微信小程序時主包和vendor.js過大解決(uniCloud的插件分包)

    使用uniapp打包微信小程序時主包和vendor.js過大解決(uniCloud的插件分包)

    每個使用分包小程序必定含有一個主包,所謂的主包,即放置默認(rèn)啟動頁面/TabBar頁面,以及一些所有分包都需用到公共資源/JS 腳本,下面這篇文章主要給大家介紹了關(guān)于使用uniapp打包微信小程序時主包和vendor.js過大解決的相關(guān)資料,,需要的朋友可以參考下
    2023-02-02
  • 微信JSSDK上傳圖片

    微信JSSDK上傳圖片

    做過微信開發(fā)的都知道,在部分android機型里微信不支持網(wǎng)頁上傳圖片的,這是由于這些機型的文件上傳存在內(nèi)存泄漏,會導(dǎo)致微信閃退,所以微信內(nèi)置瀏覽器將文件上傳屏蔽,本篇文章給大家介紹使用微信jssdk如何上傳圖片,需要的朋友可以關(guān)注下
    2015-08-08
  • JavaScript?數(shù)據(jù)結(jié)構(gòu)之集合創(chuàng)建(1)

    JavaScript?數(shù)據(jù)結(jié)構(gòu)之集合創(chuàng)建(1)

    這篇文章主要介紹了JavaScript?數(shù)據(jù)結(jié)構(gòu)之集合創(chuàng)建,集合是由一組無序且唯一的元素組成。數(shù)據(jù)結(jié)構(gòu)中的集合,對應(yīng)的是數(shù)學(xué)概念當(dāng)中的有限集合;下文詳細(xì)介紹需要的小伙伴可以參考一下
    2022-04-04
  • Listloading.js移動端上拉下拉刷新組件

    Listloading.js移動端上拉下拉刷新組件

    這篇文章主要介紹了Listloading.js移動端上拉下拉刷新組件的相關(guān)資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2016-08-08

最新評論