成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

那些不起眼的小工具?

ChanceWong / 389人閱讀

摘要:直接看源碼如果原生支持就用原生的,否知自己實(shí)現(xiàn)一個(gè)結(jié)尾暫時(shí)就介紹這些看起來(lái)并不起眼的工具函數(shù),在以后的文章和源碼分析中遇到其他的會(huì)陸續(xù)更新到這篇文章中來(lái)。

前言

原文鏈接

源碼地址

今天想寫一篇關(guān)于下劃線這個(gè)庫(kù)中一些小工具函數(shù)的故事,我們都聽過(guò)一句話,一個(gè)成功的男人背后一定有一個(gè)了不起的女人(?,其實(shí)也不一定,也許還有男人呢),那么一個(gè)經(jīng)久不衰,為程序猿們所稱道的庫(kù),框架的背后自然也有不少看起來(lái)不起眼,甚至你都懶得正眼瞧他的"小工具"存在。正是這些背后的無(wú)名英雄為類庫(kù)和框架的形成,貢獻(xiàn)了不可磨滅的力量。

第一篇文章說(shuō)了undefined,那我們也從undefined開始。

_.isUndefined(obj)

判斷obj等于undefined與否,是就返回true,反之false。

示例

let a = null
let b = window.b
let c = () => {}
let d = undefined
let e = void 0
let f = "qianlongo"
let g

console.log(_.isUndefined(a)) // false
console.log(_.isUndefined(b)) // true
console.log(_.isUndefined(c())) // true
console.log(_.isUndefined(d)) // true
console.log(_.isUndefined(e)) // true
console.log(_.isUndefined(f)) // false
console.log(_.isUndefined(g)) // true

對(duì)于一個(gè)對(duì)象上不存在的屬性

對(duì)于一個(gè)沒(méi)有返回值的函數(shù)

對(duì)于聲明和卻沒(méi)有賦值的標(biāo)量

對(duì)于直接賦值為undefined(非ie8以下)或者void 0

_.isUndefined都會(huì)返回true,其他情況全都是返回false

需要特別注意的是,有時(shí)候我們會(huì)這樣判斷一個(gè)變量是都存在,a = null
a = undefined都可以通難過(guò)判斷。

if (a == null) { 

}

但是_.isUndefined用的是三等強(qiáng)制判斷,所以null是通過(guò)不了的

_.isUndefined = function(obj) {
  return obj === void 0;
}
_.isNull(obj)

判斷obj等于null與否,是就返回true,反之false。

這個(gè)沒(méi)啥說(shuō)的,只有obj輸入null,結(jié)果輸出才為true,因?yàn)閮?nèi)部判斷也是用的三等判斷,不僅值要相等,類型也要相同。

_.noConflict()

防止全局變量沖突的一種常見解決方案,將_的使用權(quán)交換給上一個(gè)占用_坑位的人。

示例




console.log(_)

遇見重名的事不新鮮對(duì)吧,全國(guó)有多少個(gè)小明啊,我們從小到大課本里到處都是小明和小紅。

這里后面引入的underscore.js把lodash.js給覆蓋了,因?yàn)閮蓚€(gè)庫(kù)都想占用全局的_,結(jié)果后來(lái)者居上。

如果不想lodash被覆蓋怎么辦,總的有個(gè)先來(lái)后到啊。只需要調(diào)用noConflict方法便將占著的_坑位重新歸還給了lodash,而之后我們用my_即可訪問(wèn)所有underscore.js的方法。

let my_ = _.noConflict()

接下來(lái)我們看下源碼怎么實(shí)現(xiàn)的

var previousUnderscore = _ // 在源碼的頂部,保存了前一個(gè)占著_坑位的人
 _.noConflict = function() {
    root._ = previousUnderscore; // 將_重新賦值給前一個(gè)占著_坑位的人
    return this; // 并將_返回以供后續(xù)使用
  };
_.identity(value)

返回與傳入的參數(shù)value一樣的值

這個(gè)函數(shù)看起來(lái)沒(méi)有什么軟用,但是在后面能夠起非常大的作用,也正體現(xiàn)了,工具雖小,能量卻大

我們先來(lái)簡(jiǎn)單地看下它的應(yīng)用,在后續(xù)的源碼分析中遇到再仔細(xì)講解。

過(guò)濾一個(gè)數(shù)組中為"真"的值

let arr = ["a", "b", null, "false", 0, "c", "", false, {}]
let arr2 = arr.filter(_.identity) // ["a", "b", "false", "c", {}]

復(fù)制數(shù)組

let arr = ["a", "b", null, "false", 0, "c", "", false, {}]
let arr2 = arr.map(_.identity) // ["a", "b", null, "false", 0, "c", "", false, {}]
_.constant(value)

返回一個(gè)函數(shù)fn,fn執(zhí)行之后再返回當(dāng)初傳進(jìn)來(lái)的value

我們來(lái)看一段github上關(guān)于下劃線的一個(gè)issue,挺有意思的。也許我們比較難列舉出這個(gè)函數(shù)的應(yīng)用,但是至少下面這個(gè)例子是比較好的。

let age = 18
let cacheAge = _.constant(age)

age += 10
console.log(cacheAge()) // 18

為什么可以緩存住18,我們看下源碼大概就知道了,源碼創(chuàng)建了常見的閉包,閉包常見的作用之一就是讓外面通過(guò)函數(shù)調(diào)用的形式去訪問(wèn)內(nèi)部的變量,以及在一定的生命周期內(nèi),緩存住變量。

 _.constant = function(value) {
    return function() {
      return value;
    };
  };
_.noop()

一個(gè)空函數(shù),啥也不干,調(diào)用了就返回undefined給你,可以作為默認(rèn)的回調(diào)參數(shù)

又是一個(gè)看起來(lái)啥用都沒(méi)有的函數(shù),然而事實(shí)真的是這樣嗎?請(qǐng)移步以下幾個(gè)鏈接

What is the use of jQuery.noop() function?

What is the JavaScript convention for no operation?

例子不用多,總結(jié)一下

1. 給一個(gè)變量賦值為一個(gè)空函數(shù),在后續(xù)的調(diào)用中你不需要去檢測(cè)他是不是undefined

2. 為什么不給需要的變量重新設(shè)置一個(gè)空函數(shù)? _.noop已經(jīng)創(chuàng)建了一個(gè)函數(shù)空間,讓其他變量也指向這個(gè)函數(shù),可以減少js中不必要的花銷

_.times(n, iteratee, context)

調(diào)用給定的iteratee迭代函數(shù)n次,iteratee每次都接收一個(gè)索引值index,最后返回一個(gè)數(shù)組,數(shù)組中存著這幾次iteratee的回調(diào)結(jié)果

示例

let count = 0
let result = _.times(6, (i) => {
  console.log(++count)
  return `hello:${i}`
})

console.log(result) // ["hello:0", "hello:1", "hello:2", "hello:3", "hello:4", "hello:5"]

console.log(count) // 6

可以看到傳進(jìn)去的函數(shù)執(zhí)行執(zhí)行了6次,并將對(duì)應(yīng)的每次執(zhí)行的結(jié)果存在了數(shù)組中返回。

_.random(min, max)

返回一個(gè)[min, max]之間的隨機(jī)整數(shù),如果沒(méi)有傳max,則區(qū)間是[0, min]

示例

let num1 = _.random(10, 20) // maybe 13 or other
let num2 = _.random(10) // maybe 6 or other

源碼

_.random = function(min, max) {
  if (max == null) { // 如果只有一個(gè)參數(shù)
    max = min; // 就把第一個(gè)參數(shù)當(dāng)最大值
    min = 0; // 0作為最小值
  }
  return min + Math.floor(Math.random() * (max - min + 1));
  // 試想我們要求取[4, 10)之間的某個(gè)整數(shù)
  // (min) 就是保證最小值可以取到4
  // (max - min + 1) => (10 - 4 + 1) => 7
  // Math.random() * 7 => [0, 1) * 7 => [0, 7)
  // Math.floor([0, 7)) => 最小取0, 最大取6
  // 最后變成 4 + [0, 6] => [4, 10]
};

當(dāng)然啦,如果你傳入非整數(shù),或者max < min的數(shù),那結(jié)果就有可能不能按照預(yù)期出現(xiàn)了

_.uniqueId(prefix)

生成唯一的id,如果prefix不存在則直接將數(shù)字id返回,這個(gè)函數(shù)在給dom添加唯一的id的時(shí)候比較有用。

let pre = "qianlongo"
let id1 = _.uniqueId() // 1
let id2 = _.uniqueId(pre) // qianlongo2

源碼

var idCounter = 0;
_.uniqueId = function(prefix) {
  var id = ++idCounter + ""; // 轉(zhuǎn)成字符串
  return prefix ? prefix + id : id;
};
_.now()

一個(gè)優(yōu)化的方式來(lái)獲得一個(gè)當(dāng)前時(shí)間的整數(shù)時(shí)間戳。

直接看源碼

_.now = Date.now || function() { // 如果原生支持now就用原生的,否知自己實(shí)現(xiàn)一個(gè)
  return new Date().getTime();
};

結(jié)尾

暫時(shí)就介紹這些看起來(lái)并不起眼的工具函數(shù),在以后的文章和源碼分析中遇到其他的會(huì)陸續(xù)更新到這篇文章中來(lái)。寫一篇文章真夠耗費(fèi)時(shí)間的,陸陸續(xù)續(xù)用了好幾個(gè)小時(shí)才寫這么點(diǎn)。

不介意的話,在文章開頭的源碼地址那里點(diǎn)一個(gè)小星星吧?

不介意的話,在文章開頭的源碼地址那里點(diǎn)一個(gè)小星星吧?

不介意的話,在文章開頭的源碼地址那里點(diǎn)一個(gè)小星星吧?

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/50743.html

相關(guān)文章

  • 那些起眼的小工具?

    摘要:直接看源碼如果原生支持就用原生的,否知自己實(shí)現(xiàn)一個(gè)結(jié)尾暫時(shí)就介紹這些看起來(lái)并不起眼的工具函數(shù),在以后的文章和源碼分析中遇到其他的會(huì)陸續(xù)更新到這篇文章中來(lái)。 前言 原文鏈接 源碼地址 今天想寫一篇關(guān)于下劃線這個(gè)庫(kù)中一些小工具函數(shù)的故事,我們都聽過(guò)一句話,一個(gè)成功的男人背后一定有一個(gè)了不起的女人(?,其實(shí)也不一定,也許還有男人呢),那么一個(gè)經(jīng)久不衰,為程序猿們所稱道的庫(kù),框架的背后自然也有...

    tanglijun 評(píng)論0 收藏0
  • 那些起眼的小工具?

    摘要:直接看源碼如果原生支持就用原生的,否知自己實(shí)現(xiàn)一個(gè)結(jié)尾暫時(shí)就介紹這些看起來(lái)并不起眼的工具函數(shù),在以后的文章和源碼分析中遇到其他的會(huì)陸續(xù)更新到這篇文章中來(lái)。 前言 原文鏈接 源碼地址 今天想寫一篇關(guān)于下劃線這個(gè)庫(kù)中一些小工具函數(shù)的故事,我們都聽過(guò)一句話,一個(gè)成功的男人背后一定有一個(gè)了不起的女人(?,其實(shí)也不一定,也許還有男人呢),那么一個(gè)經(jīng)久不衰,為程序猿們所稱道的庫(kù),框架的背后自然也有...

    muddyway 評(píng)論0 收藏0
  • Flutter — 加快開發(fā)速度的 IDE 快捷操作#yyds干貨盤點(diǎn)#

    摘要:夏天加快開發(fā)速度的快捷操作干貨盤點(diǎn)快捷方式你可以用做更多神奇的事情選項(xiàng)返回這是您在中加快開發(fā)速度的魔杖。加快開發(fā)速度的快捷操作干貨盤點(diǎn)選項(xiàng)卡不喜歡小部件用魔術(shù)棒取下它。 Flutter — 加快開發(fā)速度的 IDE 快捷方式上一個(gè)關(guān)于??vscode 的插件??推薦大家看的過(guò)癮不,今天繼續(xù)給大家?guī)?lái)一些關(guān)于android s...

    番茄西紅柿 評(píng)論0 收藏2637
  • Eruda 一個(gè)可能被人遺忘的調(diào)試神器

    摘要:引言日常工作中再牛逼的大佬都不敢說(shuō)自己的代碼是完全沒(méi)有問(wèn)題的,既然有問(wèn)題,那就也就有調(diào)試,說(shuō)到調(diào)試工具,大家可能對(duì)于還有遠(yuǎn)程調(diào)試等比較熟悉,甚至有些是我可能也沒(méi)有用過(guò)的這里噴一句吧,誰(shuí)都別給我提啊,那個(gè)不叫調(diào)試工具,那叫坑爹神器,話說(shuō)最近不 showImg(https://segmentfault.com/img/bVbk8zn?w=1008&h=298); 引言 ?  日常工作中再牛...

    mingzhong 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<