隨著 JavaScript 慢慢移出瀏覽器,出現(xiàn)了一些可以顯著提升 JavaScript 穩(wěn)健性的工具。
其中一個(gè)工具稱(chēng)為 Underscore.js,這是我們今天要介紹的工具。讓我們開(kāi)始吧!
#認(rèn)識(shí) Underscore.js
那Underscore到底是做什麼的?
Underscore 是一個(gè) JavaScript 實(shí)用工具庫(kù),它提供了許多您在 Prototype.js(或 Ruby)中所期望的函數(shù)式程式設(shè)計(jì)支持,但沒(méi)有擴(kuò)展任何內(nèi)建 JavaScript 物件。
塊引用>使用 Python 或 Ruby 工作的好處之一是像
map
這樣的奇特結(jié)構(gòu),它讓生活變得更輕鬆。遺憾的是,目前版本的 JavaScript 在低階實(shí)用程式方面相當(dāng)簡(jiǎn)陋。正如您在上面所讀到的,Underscore.js 是一個(gè)漂亮的小型 JavaScript 庫(kù),它以?xún)H 4kb 的大小帶來(lái)了數(shù)量驚人的功能。
下劃線的實(shí)際應(yīng)用
“關(guān)於圖書(shū)館的廢話已經(jīng)夠多了”,我可以聽(tīng)到你說(shuō)。你是對(duì)的!在我繼續(xù)我的大喊大叫之前,讓我們先看看 Underscore 的運(yùn)行情況。
假設(shè)您有一組隨機(jī)的測(cè)驗(yàn)分?jǐn)?shù),並且您需要一個(gè)包含 90 分?jǐn)?shù)的清單。您通常會(huì)寫(xiě)這樣的內(nèi)容:
var scores = [84, 99, 91, 65, 87, 55, 72, 68, 95, 42], topScorers = [], scoreLimit = 90; for (i=0; i<=scores.length; i++) { if (scores[i]>scoreLimit) { topScorers.push(scores[i]); } } console.log(topScorers);它非常簡(jiǎn)單,即使進(jìn)行了優(yōu)化,對(duì)於我們想要做的事情來(lái)說(shuō)也相當(dāng)冗長(zhǎng)。
讓我們看看接下來(lái)可以使用 Underscore 實(shí)現(xiàn)什麼目標(biāo)。
var scores = [84, 99, 91, 65, 87, 55, 72, 68, 95, 42], topScorers = [], scoreLimit = 90; topScorers = _.select(scores, function(score){ return score > scoreLimit;}); console.log(topScorers);我不了解你,但我只是有一種書(shū)呆子氣。這是一些令人難以置信的簡(jiǎn)潔和可讀的程式碼。
很好,但我真的需要這個(gè)嗎?
嗯,這完全取決於您想要做什麼。如果您對(duì) JavaScript 的使用僅限於玩弄 DOM,那麼答案大多是否定的,因?yàn)?jQuery 可以完成您想做的大部分事情。
是的。
另一方面,如果您正在處理非 DOM 程式碼甚至複雜程式碼,請(qǐng)考慮 MVC、前端程式碼,Underscore 絕對(duì)是一個(gè)福音。
雖然該程式庫(kù)公開(kāi)的一些功能正在慢慢進(jìn)入 ECMA 規(guī)範(fàn),但它並非在所有瀏覽器中都可用,並且讓您的程式碼跨瀏覽器工作本身就是另一個(gè)噩夢(mèng)。 Underscore 為您提供了一組很好的抽象,可以在任何地方使用。
如果您是一個(gè)以性能為導(dǎo)向的人(您應(yīng)該如此),Underscore 會(huì)回退到本機(jī)實(shí)現(xiàn)(如果可用),以確保性能盡可能最佳。
開(kāi)始使用
只需在此處取得原始程式碼,將其包含在您的頁(yè)面中即可。
如果您期待一個(gè)大型的設(shè)定過(guò)程,那麼您將會(huì)非常失望。只需在此處獲取原始程式碼,將其包含在您的頁(yè)面中即可。
Underscore 在全域範(fàn)圍內(nèi)透過(guò)單一物件建立並公開(kāi)其所有功能。該物件是標(biāo)題下劃線字元 _。
如果您想知道,是的,這與 jQuery 使用美元 [$] 符號(hào)的方式非常相似。就像 jQuery 一樣,您可以重新映射此字符,以防遇到衝突?;蛘撸绻裎乙粯訉?duì)波形符有一種非理性的喜愛(ài)。
函數(shù)式還是物件導(dǎo)向?
雖然該函式庫(kù)的官方行銷(xiāo)宣傳聲稱(chēng)它添加了函數(shù)式程式設(shè)計(jì)支持,但實(shí)際上還有另一種做事方式。
讓我們以之前的程式碼為例:
var scores = [84, 99, 91, 65, 87, 55, 72, 68, 95, 42], topScorers = [], scoreLimit = 90; topScorers = _.select(scores, function(score){ return score > scoreLimit;}); console.log(topScorers);上面的方法是功能性或程序性方法。您也可以使用更直接、可能更明顯的物件導(dǎo)向方法。
var scores = [84, 99, 91, 65, 87, 55, 72, 68, 95, 42], topScorers = [], scoreLimit = 90; topScorers = _(scores).select(function(score){ return score > scoreLimit;}); console.log(topScorers);沒(méi)有真正的「正確」方法來(lái)做事,但請(qǐng)記住,您可以使用後一種方法連結(jié) jQuery 式方法。
檢查功能
Underscore 提供了 60 多個(gè)函數(shù),涵蓋了多種功能。從本質(zhì)上講,它們可以分為幾組功能,這些功能運(yùn)行於:
- 收藏
- 陣列
- 物件
- 函數(shù)
- 實(shí)用程式
讓我們看看每個(gè)部分的作用,如果適用,每個(gè)部分中我最喜歡的一兩個(gè)。
集合
集合可以是數(shù)組,也可以是對(duì)象,如果我在語(yǔ)意上是正確的,則可以是 JavaScript 中的關(guān)聯(lián)數(shù)組。
Underscore提供了許多對(duì)集合進(jìn)行操作的方法。我們之前看到了
select
方法。這裡有一些更非常有用的。採(cǎi)摘
#假設(shè)您有一個(gè)包含鍵值對(duì)的漂亮小數(shù)組,並且您想要從每個(gè)數(shù)組中提取一個(gè)特定的屬性。有了 Underscore,一切就輕鬆了。
var Tuts = [{name : 'NetTuts', niche : 'Web Development'}, {name : 'WPTuts', niche : 'WordPress'}, {name : 'PSDTuts', niche : 'PhotoShop'}, {name : 'AeTuts', niche : 'After Effects'}]; var niches = _.pluck(Tuts, 'niche'); console.log(niches); // ["Web Development", "WordPress", "PhotoShop", "After Effects"]使用
pluck
就像傳入目標(biāo)物件或陣列以及選擇哪個(gè)屬性一樣簡(jiǎn)單。在這裡,我只是提取每個(gè)網(wǎng)站的利基市場(chǎng)。地圖
Map 從集合建立一個(gè)數(shù)組,其中每個(gè)元素都可以透過(guò)函數(shù)進(jìn)行變異或以其他方式變更。
讓我們以前面的示例為例并對(duì)其進(jìn)行一些擴(kuò)展。
var Tuts = [{name : 'NetTuts', niche : 'Web Development'}, {name : 'WPTuts', niche : 'WordPress'}, {name : 'PSDTuts', niche : 'PhotoShop'}, {name : 'AeTuts', niche : 'After Effects'}]; var names = _(Tuts).pluck('name').map(function (value){return value + '+'}); console.log(names); // ["NetTuts+", "WPTuts+", "PSDTuts+", "AeTuts+"]由于我注意到名稱(chēng)末尾缺少加號(hào),因此我將它們添加到提取的數(shù)組中。
這里您不僅限于簡(jiǎn)單的串聯(lián)。您可以根據(jù)自己的意愿隨意修改傳遞的值。
全部
all
如果您需要檢查集合中的每個(gè)值是否滿足特定條件,則非常有用。例如,檢查學(xué)生是否通過(guò)了每個(gè)科目。var Scores = [95, 82, 98, 78, 65]; var hasPassed = _(Scores).all(function (value){return value>50; }); console.log(hasPassed); // true
數(shù)組
Underscore 有很多專(zhuān)門(mén)處理數(shù)組的函數(shù),這是非常受歡迎的,因?yàn)榕c其他語(yǔ)言相比,JavaScript 提供的處理數(shù)組的方法非常少。
Uniq
此方法基本上解析數(shù)組并刪除所有重復(fù)元素,只為您提供唯一元素。
var uniqTest = _.uniq([1,5,4,4,5,2,1,1,3,2,2,3,4,1]); console.log(uniqTest); // [1, 5, 4, 2, 3]當(dāng)您解析巨大的數(shù)據(jù)集并需要清除重復(fù)項(xiàng)時(shí),這非常方便。請(qǐng)記住,僅計(jì)算元素的第一個(gè)實(shí)例,因此保留原始順序。
范圍
一種非常方便的方法,可讓您創(chuàng)建“范圍”或數(shù)字列表。讓我們看一個(gè)超級(jí)簡(jiǎn)單的例子。
var tens = _.range(0, 100, 10); console.log(tens); // [0, 10, 20, 30, 40, 50, 60, 70, 80, 90]該方法的參數(shù)依次為起始值、結(jié)束值和步長(zhǎng)值。如果您想知道,使用負(fù)步長(zhǎng)值會(huì)導(dǎo)致遞減范圍。
交叉路口
此方法將兩個(gè)數(shù)組相互比較,并返回在所有傳遞的數(shù)組中找到的元素列表,即集合論中的交集。
讓我們擴(kuò)展前面的示例來(lái)看看它是如何工作的。
var tens = _.range(0, 100, 10), eights = _.range(0, 100, 8), fives = _.range(0, 100, 5); var common = _.intersection(tens, eights, fives ); console.log(common); // [0, 40, 80]很簡(jiǎn)單,對(duì)吧?您只需傳入要比較的數(shù)組列表,Underscore 就會(huì)完成剩下的工作。
對(duì)象
除了預(yù)期的 is
檢查之外,Underscore 還提供了各種方法來(lái)克隆、擴(kuò)展和其他操作對(duì)象。 這是我最喜歡的一些。
鍵和值
有一個(gè)巨大的對(duì)象,您只需要鍵或只需要值?使用 Underscore 真是太簡(jiǎn)單了。
var Tuts = { NetTuts : 'Web Development', WPTuts : 'WordPress', PSDTuts : 'PhotoShop', AeTuts : 'After Effects'}; var keys = _.keys(Tuts), values = _.values(Tuts); console.log(keys + values); // NetTuts,WPTuts,PSDTuts,AeTutsWeb Development,WordPress,PhotoShop,After Effects默認(rèn)值
當(dāng)您需要?jiǎng)?chuàng)建具有合理默認(rèn)值的對(duì)象(而創(chuàng)建對(duì)象時(shí)可能不會(huì)使用該默認(rèn)值)時(shí),此方法非常有用。
var tuts = { NetTuts : 'Web Development'}; var defaults = { NetTuts : 'Web Development', niche: 'Education'}; _.defaults(tuts, defaults); console.log(tuts); // Object { NetTuts="Web Development", niche="Education"}
函數(shù)
盡管聽(tīng)起來(lái)很奇怪,Underscore 的函數(shù)可以作用于函數(shù)。大多數(shù)函數(shù)在這里解釋起來(lái)往往相當(dāng)復(fù)雜,因此我們將看一下最簡(jiǎn)單的函數(shù)。
綁定
this
是 JavaScript 中難以捉摸的一部分,往往會(huì)讓很多開(kāi)發(fā)人員感到非常困惑。此方法旨在使其更容易解決。var o = { greeting: "Howdy" }, f = function(name) { return this.greeting +" "+ name; }; var greet = _.bind(f, o); greet("Jess")這有點(diǎn)令人困惑,所以請(qǐng)留在這兒。綁定函數(shù)基本上讓您無(wú)論何時(shí)何地調(diào)用該函數(shù)都可以保留
this
的值。當(dāng)您使用
this
被劫持的事件處理程序時(shí),這特別有用。
實(shí)用程序
為了進(jìn)一步提高交易的吸引力,Underscore 提供了大量的實(shí)用函數(shù)。由于我們的時(shí)間已經(jīng)不多了,所以讓我們看看重要的事情。
模板化
已經(jīng)有大量的模板解決方案,但 Underscore 的解決方案因其實(shí)現(xiàn)相當(dāng)小而功能相當(dāng)強(qiáng)大而值得一看。
讓我們看一個(gè)快速示例。
var data = {site: 'NetTuts'}, template = 'Welcome! You are at <%= site %>'; var parsedTemplate = _.template(template, data ); console.log(parsedTemplate); // Welcome! You are at NetTuts首先,我們創(chuàng)建數(shù)據(jù)來(lái)填充模板,然后創(chuàng)建模板本身。默認(rèn)情況下,Underscore 使用 ERB 樣式分隔符,盡管這是完全可自定義的。
有了這些,我們就可以簡(jiǎn)單地調(diào)用
template
來(lái)傳遞我們的模板和數(shù)據(jù)。我們將結(jié)果存儲(chǔ)在一個(gè)單獨(dú)的字符串中,以便稍后根據(jù)需要用于更新內(nèi)容。請(qǐng)記住,這是 Underscore 模板的極其簡(jiǎn)單的演示。您可以使用
分隔符在模板內(nèi)使用任何 JavaScript 代碼。當(dāng)您需要迭代復(fù)雜的對(duì)象(例如 JSON 源)時(shí),您可以與 Underscore 出色的集合函數(shù)配合來(lái)快速創(chuàng)建模板。
仍然不相信你應(yīng)該選擇這個(gè)
jQuery 和 Underscore 齊頭并進(jìn)。
不不不,你們都錯(cuò)了!如果說(shuō)有什么不同的話,那就是 jQuery 和 Underscore 相輔相成,齊頭并進(jìn)。真的!
看,jQuery 在一些事情上做得非常好。其中最主要的是 DOM 操作和動(dòng)畫(huà)。它不涉及較高或較低級(jí)別的任何內(nèi)容。如果像 Backbone 或 Knockout 這樣的框架處理更高級(jí)別的問(wèn)題,那么 Underscore 可以解決所有相對(duì)裸機(jī)的問(wèn)題。
從更廣泛的角度來(lái)看,jQuery 在瀏覽器之外沒(méi)有什么用途,因?yàn)樗拇蟛糠止δ芏寂c DOM 相關(guān)。另一方面,下劃線可以在瀏覽器或服務(wù)器端使用,沒(méi)有任何問(wèn)題。事實(shí)上,Underscore 依賴(lài)它的 Node 模塊數(shù)量最多。
好了,今天就講到這里??紤]到 Underscore 的范圍,我們?cè)谶@里僅僅觸及了皮毛。請(qǐng)務(wù)必查看更多圖書(shū)館內(nèi)容,如果您有任何疑問(wèn),請(qǐng)?jiān)谙旅娴脑u(píng)論中告訴我。非常感謝您的閱讀!
以上是擁抱 Underscore.js 的溫暖的詳細(xì)內(nèi)容。更多資訊請(qǐng)關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

熱AI工具

Undress AI Tool
免費(fèi)脫衣圖片

Undresser.AI Undress
人工智慧驅(qū)動(dòng)的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費(fèi)的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門(mén)文章

熱工具

記事本++7.3.1
好用且免費(fèi)的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強(qiáng)大的PHP整合開(kāi)發(fā)環(huán)境

Dreamweaver CS6
視覺(jué)化網(wǎng)頁(yè)開(kāi)發(fā)工具

SublimeText3 Mac版
神級(jí)程式碼編輯軟體(SublimeText3)

WordPress導(dǎo)致服務(wù)器CPU使用率飆升的主要原因包括插件問(wèn)題、數(shù)據(jù)庫(kù)查詢(xún)效率低、主題代碼質(zhì)量差或流量激增。 1.首先通過(guò)top、htop或控制面板工具確認(rèn)是否為WordPress引起的高負(fù)載;2.進(jìn)入故障排查模式逐步啟用插件排查性能瓶頸,使用QueryMonitor分析插件執(zhí)行情況並刪除或替換低效插件;3.安裝緩存插件、清理冗餘數(shù)據(jù)、分析慢查詢(xún)?nèi)照I以?xún)?yōu)化數(shù)據(jù)庫(kù);4.檢查主題是否存在過(guò)度加載內(nèi)容、複雜查詢(xún)或缺乏緩存機(jī)制等問(wèn)題,建議用標(biāo)準(zhǔn)主題測(cè)試對(duì)比並優(yōu)化代碼邏輯。按照上述步驟逐一排查可定位並解

MinifyingJavaScript文件可通過(guò)刪除空白、註釋和無(wú)用代碼來(lái)提升WordPress網(wǎng)站加載速度。 1.使用支持合併壓縮的緩存插件如W3TotalCache,在“Minify”選項(xiàng)中啟用並選擇壓縮模式;2.使用專(zhuān)用壓縮插件如FastVelocityMinify,提供更精細(xì)控制;3.手動(dòng)壓縮JS文件並通過(guò)FTP上傳,適用於熟悉開(kāi)發(fā)工具的用戶。注意部分主題或插件腳本可能與壓縮功能衝突,啟用後需徹底測(cè)試網(wǎng)站功能。

防止評(píng)論垃圾信息最有效的方式是通過(guò)程序化手段自動(dòng)識(shí)別並攔截。 1.使用驗(yàn)證碼機(jī)制(如GooglereCAPTCHA或hCaptcha)可有效區(qū)分人類(lèi)與機(jī)器人,尤其適合公眾網(wǎng)站;2.設(shè)置隱藏字段(Honeypot技術(shù)),利用機(jī)器人自動(dòng)填寫(xiě)特性識(shí)別垃圾評(píng)論,不影響用戶體驗(yàn);3.檢查評(píng)論內(nèi)容關(guān)鍵詞黑名單,通過(guò)敏感詞匹配過(guò)濾垃圾信息,需注意避免誤判;4.判斷評(píng)論頻率與來(lái)源IP,限制單位時(shí)間內(nèi)的提交次數(shù)並建立黑名單;5.使用第三方反垃圾服務(wù)(如Akismet、Cloudflare)提升識(shí)別準(zhǔn)確性??筛鶕?jù)網(wǎng)站

在開(kāi)發(fā)Gutenberg塊時(shí),正確enqueue資產(chǎn)的方法包括:1.使用register_block_type指定editor_script、editor_style和style的路徑;2.在functions.php或插件中通過(guò)wp_register_script和wp_register_style註冊(cè)資源,並設(shè)置正確的依賴(lài)和版本;3.配置構(gòu)建工具輸出合適的模塊格式,並確保路徑一致;4.通過(guò)add_theme_support或enqueue_block_assets控制前端樣式的加載邏輯,確保

要添加自定義用戶字段需根據(jù)平臺(tái)選擇擴(kuò)展方式並註意數(shù)據(jù)驗(yàn)證與權(quán)限控制。常見(jiàn)做法包括:1.利用數(shù)據(jù)庫(kù)額外表或鍵值對(duì)結(jié)構(gòu)存儲(chǔ)信息;2.在前端加入輸入框並與後端集成;3.對(duì)敏感數(shù)據(jù)進(jìn)行格式校驗(yàn)和訪問(wèn)權(quán)限限制;4.更新接口及模板以支持新字段展示與編輯,同時(shí)兼顧移動(dòng)端適配和用戶體驗(yàn)。

在WordPress中添加自定義重寫(xiě)規(guī)則的關(guān)鍵在於使用add_rewrite_rule函數(shù)並確保規(guī)則正確生效。 1.使用add_rewrite_rule註冊(cè)規(guī)則,格式為add_rewrite_rule($regex,$redirect,$after),其中$regex是正則表達(dá)式匹配URL,$redirect指定實(shí)際查詢(xún),$after控制規(guī)則位置;2.需通過(guò)add_filter添加自定義查詢(xún)變量;3.修改後必須刷新固定鏈接設(shè)置;4.建議將規(guī)則放在'top'以避免衝突;5.可藉助插件查看當(dāng)前規(guī)則便於

robots.txt對(duì)WordPress網(wǎng)站的SEO至關(guān)重要,能引導(dǎo)搜索引擎抓取行為,避免重複內(nèi)容並提升效率。 1.屏蔽如/wp-admin/、/wp-includes/等系統(tǒng)路徑,但避免誤封/uploads/目錄;2.添加Sitemap路徑如Sitemap:https://yourdomain.com/sitemap.xml以幫助搜索引擎快速發(fā)現(xiàn)站點(diǎn)地圖;3.限制/page/和帶參數(shù)的URL以減少爬蟲(chóng)浪費(fèi),但需注意勿封重要?dú)w檔頁(yè);4.避免常見(jiàn)錯(cuò)誤如誤封全站、緩存插件影響更新及忽略移動(dòng)端與子域名配

1.使用性能分析插件可快速定位問(wèn)題,如QueryMonitor可查看數(shù)據(jù)庫(kù)查詢(xún)次數(shù)與PHP錯(cuò)誤,BlackboxProfiler生成函數(shù)執(zhí)行報(bào)告,NewRelic提供服務(wù)器級(jí)分析;2.分析PHP執(zhí)行性能需檢查耗時(shí)函數(shù)、調(diào)試工具使用及內(nèi)存分配情況,如Xdebug生成火焰圖輔助優(yōu)化;3.監(jiān)控?cái)?shù)據(jù)庫(kù)查詢(xún)效率可通過(guò)慢查詢(xún)?nèi)照I與索引檢查,QueryMonitor能列出所有SQL並按時(shí)間排序;4.結(jié)合GooglePageSpeedInsights、GTmetrix與WebPageTest等外部工具評(píng)估前端加
