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

資訊專欄INFORMATION COLUMN

underscore 系列之防沖突與 Utility Functions

qiangdada / 2029人閱讀

摘要:你可以輕松為你的函數(shù)庫(kù)添加防沖突功能。系列系列目錄地址。如果有錯(cuò)誤或者不嚴(yán)謹(jǐn)?shù)牡胤?,?qǐng)務(wù)必給予指正,十分感謝。

防沖突

underscore 使用 _ 作為函數(shù)的掛載對(duì)象,如果頁(yè)面中已經(jīng)存在了 _ 對(duì)象,underscore 就會(huì)覆蓋該對(duì)象,舉個(gè)例子:

var _ = {value: 1 }

// 引入 underscore 后
console.log(_.value); // undefined

所以 underscore 提供了 noConflict 功能,可以放棄 underscore 的控制變量 _,返回 underscore 對(duì)象的引用。

var _ = {value: 1 }

// 引入 underscore 后

// 放棄 "_",使用 "$"
var $ = _.noConflict();

console.log(_.value); // 1

// 使用 underscore 的方法
$.each([1, 2, 3], alert);

那么 noConflict 函數(shù)是如何實(shí)現(xiàn)的呢?

首先,在 underscore 執(zhí)行的時(shí)候,會(huì)儲(chǔ)存之前的 _ 對(duì)象,然后當(dāng)執(zhí)行 noConflict 函數(shù)的時(shí)候,再將之前儲(chǔ)存的 _ 對(duì)象賦給全局對(duì)象,最后返回 underscore 對(duì)象。這樣,我們就可以利用返回的 underscore 對(duì)象使用 underscore 提供的各種方法。

// 源碼一開始的時(shí)候便儲(chǔ)存之前的 _ 對(duì)象
var previousUnderscore = root._;

_.noConflict = function() {
    root._ = previousUnderscore;
    return this;
};

是的,就是這么簡(jiǎn)單。你可以輕松為你的函數(shù)庫(kù)添加防沖突功能。

接下來(lái)我們看 underscore 中的一些功能函數(shù)。

_.identity
_.identity = function(value) {
    return value;
};

看起來(lái)匪夷所思的一個(gè)函數(shù),傳入一個(gè)值,然后返回該值,為什么不直接使用該值呢?

還記得我們?cè)凇秛nderscore 系列之內(nèi)部函數(shù) cb 和 optimizeCb》中接觸過(guò)這個(gè)函數(shù)嗎?

如果我們自己編寫了一個(gè) _.map 函數(shù):

_.map = function(arr, iteratee){
    return arr.map(iteratee)
}

然而當(dāng)我們這樣使用 _.map([1, 2, 3]) 時(shí)便會(huì)報(bào)錯(cuò),因?yàn)槲覀儧]有傳入 iteratee 函數(shù),然而使用 underscore 卻沒有問題,結(jié)果是返回一個(gè)相同的新數(shù)組,原因就在于當(dāng) iteratee 為 undefined 的時(shí)候,underscore 視為傳入了 _.identity 函數(shù)。就相當(dāng)于:

_.map = function(arr, iteratee){
    if (!iteratee) iteratee = _.identity
    return arr.map(iteratee)
}

簡(jiǎn)而言之,如果我們想要復(fù)制一個(gè)數(shù)組:

var clonedArr = [1, 2, 3].map(_.identity) // [1, 2, 3]
_.constant
_.constant = function(value) {
    return function() {
        return value;
    };
};

該函數(shù)傳入一個(gè) value,然后返回一個(gè)返回該 value 的函數(shù),這又有什么用呢?我們來(lái)看個(gè) demo:

var value = 1;
var getValue = _.constant(value);

value = 2;

getValue(); // 1
getValue(); // 1

這很容易讓人想到 ES6 的 const,我一開始以為就是用來(lái)表示 ES6 的 const ,后來(lái)看了這個(gè)函數(shù)起源的 issue,才發(fā)現(xiàn)并非如此,它其實(shí)像下面的 _.noop 函數(shù)一樣可以作為默認(rèn)函數(shù)使用。

舉個(gè)例子:

_.select(collection, filterFunction || function() { return true; })

我們根據(jù) filterFunction 篩選 collection 中符合條件的元素,如果沒有傳 filterFunction,我們就返回所有的元素,如果有 _.constant 函數(shù),我們可以將其簡(jiǎn)化為:

_.select(collection, filterFunction || _.constant(true))

盡管沒有什么大的改變,但是語(yǔ)義更加明確。

_.noop
_.noop = function(){};

一個(gè)空函數(shù),看起來(lái)依舊沒什么用……

noop 函數(shù)可以用于作為默認(rèn)值,這樣就可以省去是否存在的判斷,舉個(gè)例子:

// 不使用 noop
function a(value, callback){
    // 每次使用 callback 都要判斷一次
    _.isFunction(callback) && callback()
}

// 使用 noop
function a(value, callback) {
    // 判斷一次
    if(!_.isFunction(callback)) callback = _.noop;

    // 以后都可以直接使用
    callback()
}
deepGet
var deepGet = function(obj, path) {
    var length = path.length;
    for (var i = 0; i < length; i++) {
        if (obj == null) return void 0;
        obj = obj[path[i]];
    }
    return length ? obj : void 0;
};

deepGet 用于獲得對(duì)象深層次的值。舉個(gè)例子:

var obj = { 
    value: { 
        deepValue: 2
    } 
}

console.log(deepGet(obj, ["value", "deepValue"]))

使用這個(gè)函數(shù),可以避免深層次取值時(shí),因?yàn)闆]有其中的一個(gè)屬性,導(dǎo)致的報(bào)錯(cuò)。

shallowProperty
var shallowProperty = function(key) {
    return function(obj) {
      return obj == null ? void 0 : obj[key];
    };
};

shallowProperty 也是用于獲取對(duì)象的屬性,也許你會(huì)好奇在開發(fā)中,直接使用. 不就可以獲取對(duì)象的屬性了,為什么還要寫成這樣呢?我們來(lái)舉個(gè)例子:

// 獲取 arr 所有元素的 name 屬性
var arr = [
    {
        value: 1,
        name: "Kevin"
    },
    {
        value: 2,
        name: "Daisy"
    }
]

// 普通方式
var names = arr.map(function(item){
    return item.name;
})

// 使用 shallowProperty
var names = arr.map(shallowProperty("name"))
_.property
_.property = function(path) {
    if (!_.isArray(path)) {
      return shallowProperty(path);
    }
    return function(obj) {
      return deepGet(obj, path);
    };
};

_.property 結(jié)合了 deepGet 和 shallowProperty,可以獲取元素深層次的值。上面一個(gè)例子也可以寫成:

var names = arr.map(_.property("name"))
_.propertyOf
_.propertyOf = function(obj) {
    if (obj == null) {
        return function(){};
    }
    return function(path) {
        return !Array.isArray(path) ? obj[path] : deepGet(obj, path);
    };
};

_.property 返回一個(gè)函數(shù),這個(gè)函數(shù)返回任何傳入的對(duì)象的指定屬性。

_.propertyOf_.property 相反。需要一個(gè)對(duì)象,并返回一個(gè)函數(shù),這個(gè)函數(shù)將返回一個(gè)提供的屬性的值。

我們寫個(gè)例子:

// 獲取 person 對(duì)象的所有屬性值
var person = {
    name: "Kevin",
    age: "18"
};

// 普通方式
var values = Object.keys(person).map((key) => person[key]); // ["Kevin", "18"]

// 使用 _.propertyOf
var values = Object.keys(person).map(_.propertyOf(person)); // ["Kevin", "18"
_.random

返回一個(gè) min 和 max 之間的隨機(jī)整數(shù)。如果你只傳遞一個(gè)參數(shù),那么將返回 0 和這個(gè)參數(shù)之間的整數(shù)。

_.random = function(min, max) {
    if (max == null) {
      max = min;
      min = 0;
    }
    return min + Math.floor(Math.random() * (max - min + 1));
  };

注意:該隨機(jī)值有可能是 min 或 max。

underscore 系列

underscore 系列目錄地址:https://github.com/mqyqingfeng/Blog。

underscore 系列預(yù)計(jì)寫八篇左右,重點(diǎn)介紹 underscore 中的代碼架構(gòu)、鏈?zhǔn)秸{(diào)用、內(nèi)部函數(shù)、模板引擎等內(nèi)容,旨在幫助大家閱讀源碼,以及寫出自己的 undercore。

如果有錯(cuò)誤或者不嚴(yán)謹(jǐn)?shù)牡胤?,?qǐng)務(wù)必給予指正,十分感謝。如果喜歡或者有所啟發(fā),歡迎 star,對(duì)作者也是一種鼓勵(lì)。

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

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

相關(guān)文章

  • underscore 的源碼該如何閱讀?

    摘要:所以它與其他系列的文章并不沖突,完全可以在閱讀完這個(gè)系列后,再跟著其他系列的文章接著學(xué)習(xí)。如何閱讀我在寫系列的時(shí)候,被問的最多的問題就是該怎么閱讀源碼我想簡(jiǎn)單聊一下自己的思路。感謝大家的閱讀和支持,我是冴羽,下個(gè)系列再見啦 前言 別名:《underscore 系列 8 篇正式完結(jié)!》 介紹 underscore 系列是我寫的第三個(gè)系列,前兩個(gè)系列分別是 JavaScript 深入系列、...

    weknow619 評(píng)論0 收藏0
  • underscore 源碼解讀】Object Functions 相關(guān)源碼拾遺 & 小結(jié)

    摘要:直接來(lái)看例子一目了然,第一個(gè)參數(shù)是對(duì)象,第二個(gè)參數(shù)可以是一系列的值,也可以是數(shù)組數(shù)組中含,也可以是迭代函數(shù),我們根據(jù)值,或者迭代函數(shù)來(lái)過(guò)濾中的鍵值對(duì),返回新的對(duì)象副本。 Why underscore 最近開始看 underscore.js 源碼,并將 underscore.js 源碼解讀 放在了我的 2016 計(jì)劃中。 閱讀一些著名框架類庫(kù)的源碼,就好像和一個(gè)個(gè)大師對(duì)話,你會(huì)學(xué)到很多。...

    neuSnail 評(píng)論0 收藏0
  • underscore.js 源碼學(xué)習(xí) 讀書筆記(一)

    摘要:所以經(jīng)常會(huì)在一個(gè)源碼中看到寫法吧立即執(zhí)行函數(shù)創(chuàng)建變量,保存全局根變量。 // ================立即執(zhí)行函數(shù)================ // 使用(function(){}())立即執(zhí)行函數(shù),減少全局變量 // ----????----函數(shù)聲明 function (){} 與函數(shù)表達(dá)式 var funName = function(){}----????---- /...

    lx1036 評(píng)論0 收藏0
  • underscore函數(shù)

    摘要:提供如下函數(shù),很是方便提供了常用的函數(shù)。建議使用,性能優(yōu)異很多的實(shí)現(xiàn)。補(bǔ)充了缺少的對(duì)字符串的操作,不過(guò)有些其實(shí)原生就帶了。與配合使用無(wú)壓力。其他語(yǔ)言被移植到了其他語(yǔ)言,例如和。 underscore提供如下函數(shù),很是方便: Underscore 提供了常用的函數(shù)。 Collections each map reduce reduceRight find filter whe...

    DevYK 評(píng)論0 收藏0
  • underscore.php

    摘要:是前端常用的庫(kù),最近無(wú)意中發(fā)現(xiàn)原來(lái)它還有的移植?;窘榻B絕大部分函數(shù)都移植過(guò)來(lái)了。用的是,可是這個(gè)在中已經(jīng)用來(lái)表示了,所以改成了,雙下劃線。函數(shù)一覽絕大部分都移植過(guò)來(lái)了我自己更習(xí)慣寫原生。 underscore是前端常用的javascript庫(kù),最近無(wú)意中發(fā)現(xiàn)原來(lái)它還有PHP的移植。 基本介紹 絕大部分函數(shù)都移植過(guò)來(lái)了。underscore.js用的是_,可是這個(gè)在PHP中已經(jīng)用來(lái)...

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

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

0條評(píng)論

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