成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

開開心心做幾道JavaScript機試題 - 02

seal_de / 2040人閱讀

摘要:前集回顧我們在開開心心做幾道機試題中吐了槽,也順勢展開了機試題之旅,本章我們暫時壓抑自己的吐槽之心,繼續(xù)就題目前行。其實和都是構(gòu)造函數(shù),可以直接調(diào)用的。請嘗試完成一個解析模塊本題考查對的理解,各部分都是什么意思。

前集回顧

我們在開開心心做幾道JavaScript機試題 - 01中吐了槽,也順勢展開了機試題之旅,本章我們暫時壓抑自己的吐槽之心,繼續(xù)就題目前行。仍然希望對各位正確認識JavaScript這門語言,已經(jīng)在面試過程中遇到這些問題時,如何思考!

項目地址:fe-interview

答題之路 11 - 請嘗試完成一個類似"_.find"的模塊

本題主要考查對數(shù)組的工具函數(shù)的理解、認識。很多朋友習慣了遇事兒就噴一堆for loop在那惡心人,忽略變量污染、不必要的遍歷操作、含義模糊等問題可能帶來的潛在隱患。對抱有這種錯誤認識的朋友,只要考考這些常見的數(shù)組快捷函數(shù)的實現(xiàn)原理,原形畢露!^^

答案:

var find = function(array, func) {
    for (var i = 0; i < array.length; i++) {
        if (func(array[i], i)) {
            return array[i];
        }
    }
};

module.exports = find;

關(guān)于這一點,可以閱讀:Functional programming in Javascript: map, filter and reduce

12 - 請嘗試完成一個類似"_.findlast"的模塊

本題和上題的唯一區(qū)別在于,尋找最后一個符合條件的指定元素

答案:

var findlast = function(array, func) {
    for (var i = array.length - 1; i > -1; i--) {
        if (func(array[i], i)) {
            return array[i];
        }
    }
};

module.exports = findlast;
13 - 請嘗試完成一個查找出現(xiàn)頻率最高元素的模塊

這個考察的就是對數(shù)組和literal object的組合使用

答案:

var findmost = function(array, identity) {
    var occurrence = {};
    var most;
    for (var i = 0; i < array.length; i++) {
        var item = array[i];
        var id = identity ? identity(item) : item;
        if (!occurrence[id]) {
            occurrence[id] = {count: 1, raw: item};
        } else {
            occurrence[id].count++;
        }
        if (!most || (most !== id && occurrence[id].count > occurrence[most].count)) {
            most = id;
        }
    }
    return occurrence[most].raw;
};

module.exports = findmost;

我只用了for loop形式,歡迎更簡潔寫法的PR

14 - 請嘗試完成一個類似"_.difference"的模塊

本題考查了兩個數(shù)組的比較,查找第二數(shù)組里沒有出現(xiàn)的第一個數(shù)組的元素。其中對isNaN有比較細節(jié)的針對

答案:

var isNaN = Number.isNaN;
var difference = function(arr1, arr2) {
    return arr1.reduce(function(previous, i) {
        var found = arr2.findIndex(function(j) {
            return j === i || (isNaN(i) && isNaN(j));
        });
        return (found < 0 && previous.push(i), previous);
    }, []);
};

module.exports = difference;

我的答案用了reduce來獲取最終結(jié)果;如果有朋友對found < 0 && previous.push(i)不明白,可以看:短路求值。如果對,的使用不了解,那說明你沒看上一章

15 - 請嘗試完成一個類似"_.camelCase"的模塊

本題考查對字符串的各種處理手段

答案:

var camelcase = function(str) {
    return str.toLowerCase()
        .replace(/(s+|-+)(.)/g, function(matched, separator, letter) {
            return letter.toUpperCase();
        });
};

module.exports = camelcase;

我這里用了一套組合技,先toLowerCase,再配合正則表達式,用一個replace結(jié)束戰(zhàn)斗

16 - 請嘗試完成一個類似"_.times"的模塊

本題考查了對數(shù)組便捷函數(shù)的理解認識,重點在于第二個參數(shù)是callback,很多人都被StringBoolean給嚇到了,想不通為什么結(jié)果會是那個樣子。其實String和Boolean都是構(gòu)造函數(shù),可以直接調(diào)用的。

答案:

var times = function(n, func) {
    return Array
        .apply([], new Array(n))
        .map(function(item, index) {
            return func(index);
        });
};

module.exports = times;
17 - 請嘗試完成一個類似"_.filter"的模塊

不多說了,依舊圍繞數(shù)組。雖然數(shù)組的題比較多,但在面試過程中可以選擇做答,不必全部都寫

答案:

var filter = function(arr, iteratee) {
    return arr.reduce(function(previous, item) {
        return (iteratee(item) && previous.push(item), previous);
    }, []);
};

module.exports = filter;

我的答案仍然利用了reduce和短路求值

18 - 請嘗試完成一個簡單的thunkify函數(shù)

這個題目對部分朋友來說,可能又過分了。但相信我,題目不是為了羞辱誰,而是考察關(guān)于JavaScript,你到底知道多少?函數(shù)式編程不是寫Javascript的必需條件,但函數(shù)式表達的簡潔性,對于代碼更深入的理解還是很有幫助的。

關(guān)于什么是thunk?我們先來看看簡單定義:“一個封裝了特定行為使其可以延遲執(zhí)行的函數(shù),通常我們稱之為thunk”,如果希望了解更多關(guān)于thunk的內(nèi)容,看Thoughts On Thunks

答案:

var thunkify = function(func) {
    return function() {
        var _this = this;
        var args = Array.prototype.slice.call(arguments);
        return function(cb) {
            try {
                func.apply(_this, args.concat([cb]));
            } catch (e) {
                cb(e);
            }
        };
    };
};

module.exports = thunkify;

關(guān)于arguments為什么需要Array.prototype.slice.call(arguments)轉(zhuǎn)換成Array,看arguments

19 - 請嘗試完成一個類似"_.zipObject"的模塊

答案:

var zipobject = function(arr1, arr2) {
    return arr1.reduce(function(previous, key, index) {
        return (previous[key] = arr2[index], previous);
    }, {});
};

module.exports = zipobject;

本題考查數(shù)組合并/壓縮,我用了reduce來處理。通過最近這幾題可以看出來,reduce真的能做很多事情哦!

20 - 請嘗試完成一個類似"_.once"的模塊

本題考查對“緩存”的理解,很多人會被這個概念唬住,以為又是什么瀏覽器緩存啦,服務(wù)器緩存啦,甚至有人想到了redis、memcached等工具,然后被嚇得半死。其實沒那么牛逼,你就是寫一個變量,只要不銷毀,都可以叫緩存。

答案:

var once = function(func) {
    var value,
        executed;
    return function() {
        var args = Array.prototype.slice.call(arguments);
        if (!executed) {
            executed = true;
            value = func.apply(this, args);
            return value;
        }
        return value;
    };
};

module.exports = once;

通過設(shè)置一個executed的標記來判斷該函數(shù)是否已經(jīng)執(zhí)行過了

21 - 請嘗試完成一個類似"_.flatMap"的模塊

本題考查對map的理解。

答案:

var flatmap = function(array, iteratee) {
    return Array.prototype.concat.apply([], array.map(iteratee));
};

module.exports = flatmap;

一個小技巧,對于二維數(shù)組,利用concat函數(shù)處理,代碼更簡潔

22 - 請嘗試完成一個簡單的middleware模塊

多少人寫了很久的express,結(jié)果搞不清middleware是什么,怎么工作的,如何書寫middleware,怎么使用middleware。這一切都源于對“中間件”這個概念的模糊,以及對express中“中間件”的實現(xiàn)原理的不解

答案:

var Middleware = function() {
    this.pool = [];
};

Middleware.prototype.use = function(cb) {
    this.pool.push(cb.bind(this));
};

Middleware.prototype.start = function(cb) {
    var _this = this;

    var pullOut = function() {
        if (_this.pool.length === 0) {
            return cb.call(_this);
        }
        _this.pool.shift()(pullOut);
    };

    pullOut();
};

module.exports = Middleware;

關(guān)于middleware的詳細介紹,可以看guide。

23 - 請嘗試完成一個URL解析模塊

本題考查對URl的理解,各部分都是什么意思。在我們過往的經(jīng)歷中,經(jīng)常發(fā)現(xiàn)候選人搞錯一些概念,譬如:什么是query parameter,protocol指的是哪一段,domain又是哪一段,我們常說的hash/fragment是什么?分清楚各部分是什么,方便分解這道題

關(guān)于URL,你可能想看到如下圖解:

答案:

var urlparser = function(url) {
    var result = /^(?:(https?):)//([.-w]+)(?:([/w]+))?(?:?([w=&]+))?$/.exec(url);

    var parsed = {protocol: result[1], host: result[2]};

    if (result[3]) {
        parsed.path = result[3];
    }

    if (result[4]) {
        parsed.query = result[4].split("&")
            .map((query) => query.split("="))
            .reduce((params, pairs) => (params[pairs[0]] = pairs[1], params), {});
    }

    return parsed;
};

module.exports = urlparser;

這個答案我用了正則和map、reduce,略顯臃腫。強烈歡迎更優(yōu)解法

24 - 請嘗試完成一個類似"_.throttle"的模塊

這又是個有故事的題,關(guān)于“節(jié)流閥”,是一種降低計算頻率的處理。最常見的使用場景:當頁面滾動時計算某一個值,相信如果你直白的在onScroll里寫了計算行為后會發(fā)現(xiàn),每移動一個像素都會觸發(fā)一次計算,如果計算量還有一點大的話,卡不死你。這時候就用到了節(jié)流閥的技巧。關(guān)于“節(jié)流閥”更多詳情,請看throttle

答案:

var throttle = function(func, wait) {
    var last,
        timer;
    return function() {
        var args = Array.prototype.slice.call(arguments);
        var _this = this,
            now = new Date().getTime();
        if (typeof last === "undefined") {
            last = now;
            return func.apply(_this, args);
        }
        clearTimeout(timer);
        if (now - last > wait) {
            last = new Date().getTime();
            return func.apply(_this, args);
        }
        timer = setTimeout(function() {
            last = new Date().getTime();
            func.apply(_this, args);
        }, wait + last - now);
    };
};

module.exports = throttle;
25 - 請嘗試完成一個類似angularjs的依賴注入模塊

用過AngularJS的朋友肯定都見識到了“依賴注入”的威力(當然如果你是java轉(zhuǎn)型的程序員,更應(yīng)該有體會),依賴注入是一種解藕手段,我們在java中通常如是介紹:“依賴注入是實現(xiàn)IoC(控制反轉(zhuǎn))一種方式”。關(guān)于依賴注入,你也可以看手寫依賴注入

答案:

var Di = function() {
    this.instanceStore = {};
};

Di.prototype.register = function(name, inst) {
    this.instanceStore[name] = inst;
};

Di.prototype.run = function(arr) {
    var _this = this,
        lastIndex = arr.length - 1;

    arr[lastIndex].apply(null,
        arr.slice(0, lastIndex)
            .map(function(name) {
                var Inst = _this.instanceStore[name];
                if (!Inst) {
                    throw new Error("You are expecting a non-exist instance");
                }
                return typeof Inst === "function" ? new Inst() : Inst;
            }));
};

module.exports = Di;

注意我在run實現(xiàn)里的typeof Inst === "function" ? new Inst() : Inst;使得如果注冊的是一個構(gòu)造函數(shù),那么每次使用都會注入一個新的實例,這和AngularJS里使用單例的策略不同,這里留下一個問題,如果我希望使用單例策略,答案要做如何修改?

這是余下的15個題目,隨時歡迎PR,歡迎指正,歡迎優(yōu)化。

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

轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/79879.html

相關(guān)文章

  • 開開心心幾道JavaScript試題 - 01

    摘要:碰到這種面試官,你只有是個題霸,再加上眼緣夠才能順利入圍。只要按照我題目的思路,甚至打出來測試用例看看,就能實現(xiàn)這個題目了。答案根據(jù)的,對答案做出修正。另我的答案絕不敢稱最佳,隨時歡迎優(yōu)化修正。但了解總歸是好的。 我們在長期的面試過程中,經(jīng)歷了種種苦不堪言,不訴苦感覺不過癮(我盡量控制),然后主要聊聊常見JavaScript面試題的解法,以及面試注意事項 憶苦 面試第一苦,面試官的土 ...

    liujs 評論0 收藏0
  • JavaScript | 計時器參數(shù)剖析與真題

    摘要:學堂碼匠計時器的第一個參數(shù),包含幾種不同的書寫方法,可以是函數(shù)名,匿名函數(shù),代碼字符串,還有一些面試題當中會出現(xiàn)函數(shù)調(diào)用的書寫方式。 HTML5學堂-碼匠:計時器的第一個參數(shù),包含幾種不同的書寫方法,可以是函數(shù)名,匿名函數(shù),JS代碼字符串,還有一些面試題當中會出現(xiàn)函數(shù)調(diào)用的書寫方式。 那么,這些不同的書寫方法分別表示什么呢?在計時器中出現(xiàn)的第一個參數(shù),作用域又是在哪里創(chuàng)建的? 計時器第...

    Jenny_Tong 評論0 收藏0
  • JavaScript 關(guān)于this的幾道試題及介紹

    摘要:對象方法中的當以對象里的方法的方式調(diào)用函數(shù)時,它們的是調(diào)用該函數(shù)的對象。注意,在何處或者如何定義調(diào)用函數(shù)完全不會影響到的行為。在這次執(zhí)行期間,函數(shù)中的將指向。 原文鏈接 與其他語言相比,函數(shù)的this關(guān)鍵字在JavaScript中的行為略有不同。并且它在嚴格模式和非嚴格模式之間也有一些區(qū)別。 在絕大多數(shù)情況下,函數(shù)的調(diào)用方式?jīng)Q定了this的值。this不能在執(zhí)行期間被賦值,在每次函數(shù)被...

    lifefriend_007 評論0 收藏0
  • 倆年的這五十篇技術(shù)博客,送給不忘初心的你。

    摘要:年開始的前三個學期有篇的產(chǎn)出。從技術(shù)角度來看,編程節(jié)奏加緊。十年文學,我等你。寫給即將二十歲的你此你非彼你,寫給一直伴我的你。巧合遇到你后的這段光陰,無比的充實與激情飽滿。編程技術(shù)獨立的挑戰(zhàn)鼓勵你。希望足以承擔我愛你。 showImg(https://segmentfault.com/img/remote/1460000011417994); 這倆年通過體驗博客園、常駐簡書、甚至搭建靜...

    tuantuan 評論0 收藏0

發(fā)表評論

0條評論

閱讀需要支付1元查看
<