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

資訊專欄INFORMATION COLUMN

阿里校招前端筆試題小結(jié)

PascalXie / 1544人閱讀

摘要:阿里前端筆試題,題目不多,難度也不大,我只記錄了兩道稍微有點(diǎn)難度的編程題。題目如下的功能是,將一個(gè)字面量對(duì)象轉(zhuǎn)化為一個(gè)格式的字符串。

阿里前端筆試題,題目不多,難度也不大,我只記錄了兩道稍微有點(diǎn)難度的編程題。題目如下:
1.JSON.stringify 的功能是,將一個(gè) JavaScript 字面量對(duì)象轉(zhuǎn)化為一個(gè) JSON 格式的字符串。例如:

const obj = {a:1, b:2}
JSON.stringify(obj) // => "{"a":1,"b":2}"

當(dāng)要轉(zhuǎn)化的對(duì)象有“環(huán)”存在時(shí)(子節(jié)點(diǎn)屬性賦值了父節(jié)點(diǎn)的引用),為了避免死循環(huán),JSON.stringify 會(huì)拋出異常,例如:

const obj = {
  foo: {
    name: "foo",
    bar: {
      name: "bar"
      baz: {
        name: "baz",
        aChild: null // 待會(huì)將指向obj.bar
      }
    }
  }
}
obj.foo.bar.baz.aChild = obj.foo // foo->bar->baz->aChild->foo形成環(huán)
JSON.stringify(obj) // => TypeError: Converting circular personucture to JSON

請(qǐng)完善以下“環(huán)”檢查器函數(shù) cycleDetector,當(dāng)入?yún)?duì)象中有環(huán)時(shí)返回 true,否則返回 false。

function cycleDetector(obj) {   
  // 請(qǐng)?zhí)砑哟a
}

解題思路:首先很容易想到要遍歷這個(gè)對(duì)象,然后判斷屬性值是否為一個(gè)對(duì)象,如果是,則遞歸遍歷這個(gè)屬性值,但難點(diǎn)是該如何判斷這個(gè)屬性值是否為某個(gè)父節(jié)點(diǎn)的引用,要怎樣拿到父節(jié)點(diǎn)的引用呢???
其實(shí)我們可以先用一個(gè)數(shù)組cache用來保存對(duì)象類型的屬性值,再用一個(gè)標(biāo)記變量來標(biāo)記是否有環(huán),然后遍歷時(shí)判斷這個(gè)屬性值類型是否為一個(gè)對(duì)象,如果是,則判斷這個(gè)屬性值是否在那個(gè)cache數(shù)組里,如果在,則表明有環(huán),如果不在,則把這個(gè)屬性值添加到數(shù)組里,再遞歸遍歷這個(gè)屬性值即可。

具體代碼如下:

function cycleDetector(obj) {
    let hasCircle = false, //用一個(gè)變量去標(biāo)記是否有環(huán)
        cache = []; //保存值為對(duì)象的屬性值
    (function(obj) {
        Object.keys(obj).forEach(key => {
            const value = obj[key]
            if (typeof value == "object" && value !== null) {
                const index = cache.indexOf(value)
                if (index !== -1) { //如果cache中存在這個(gè)value,則表示有環(huán)
                    hasCircle = true
                    return
                } else {
                    cache.push(value)
                    arguments.callee(value)
                }
            }
        })
    })(obj)
    return hasCircle
}

2.實(shí)現(xiàn)一個(gè)EventEmitter類,這個(gè)類包含以下方法:
on(監(jiān)聽事件,該事件可以被觸發(fā)多次)
once(也是監(jiān)聽事件,但只能被觸發(fā)一次)
fire(觸發(fā)指定的事件)
off(移除指定事件的某個(gè)回調(diào)方法或者所有回調(diào)方法)

class EventEmitter {
  /**請(qǐng)補(bǔ)充你的代碼***/
}
const event = new EventEmitter()
const drank = (person) => {
  console.log(person + "喝水")
}
event.on("drank", drank)
event.on("eat", (person) => {
  console.log(person + "吃東西")
})
event.once("buy", (person) => {
  console.log(person + "買東西")
})
event.fire("drank", "我")   // 我喝水  
event.fire("drank", "我")   // 我喝水  
event.fire("eat", "其它人")   // 其它人吃東西
event.fire("eat", "其它人")   // 其它人吃東西
event.fire("buy", "其它人")  //其它人買東西
event.fire("buy", "其它人")  //這里不會(huì)再次觸發(fā)buy事件,因?yàn)閛nce只能觸發(fā)一次
event.off("eat")  //移除eat事件
event.fire("eat", "其它人")  //這里不會(huì)觸發(fā)eat事件,因?yàn)橐呀?jīng)移除了

解題思路:這題其實(shí)就是實(shí)現(xiàn)發(fā)布-訂閱模式了,難點(diǎn)在于怎樣實(shí)現(xiàn)once事件,即只觸發(fā)一次。其實(shí)也就是要實(shí)現(xiàn)兩種類型的事件,我們可以用不同的對(duì)象去保存這兩種類型的事件,然后在fire的時(shí)候,這兩種事件都要被處理即可。
具體代碼如下:

class EventEmitter {
    constructor() {
        this.queue = {} //可觸發(fā)多次的事件
        this.onceQueue = {} //只能觸發(fā)一次的事件
    }
    on(event, fn) {  //監(jiān)聽事件,可以觸發(fā)多次
        if (!this.queue[event]) this.queue[event] = []
        this.queue[event].push(fn)
    }
    once(event, fn) {   //監(jiān)聽事件,只能觸發(fā)一次
        if (!this.onceQueue[event]) {
            this.onceQueue[event] = {
                fns: [],
                hasFired: false
            }
        }
        this.onceQueue[event].fns.push(fn)
    }
    fire() {  //觸發(fā)指定的事件
        const event = [].shift.call(arguments), //取得事件名稱
            fns = this.queue[event],  //取得該事件里所有的回調(diào)函數(shù)(可以觸發(fā)多次的事件)
            onceFns = this.onceQueue[event]  //取得該事件里所有的回調(diào)函數(shù)(只能觸發(fā)一次的事件)
        if (fns && fns.length != 0) {
            let i = 0,fn
            while (fn = fns[i++]) {
                fn.apply(this, arguments)
            }
        }
        if (onceFns && !onceFns.hasFired) {
            let i = 0,fn
            while (fn = onceFns.fns[i++]) {
                fn.apply(this, arguments)
            }
            this.onceQueue[event].hasFired = true
        }
    }
    off(event, fn = null) { //可移除特定事件里的某個(gè)回調(diào)函數(shù)或者所有回調(diào)函數(shù)
        const fns = this.queue[event]
        if (!fns || fns.length == 0) return
        if (fn) { //移除該事件特定的回調(diào)
            this.queue[event] = fns.filter(item => {
                return item !== fn
            })
        } else { //移除該事件所有的回調(diào)
            this.queue[event] = []
        }
    }
}

原文地址:https://lenshen.com/2017/08/2...
最后,我的github:https://github.com/lensh

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

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

相關(guān)文章

  • 【回顧九月份第二周】 前端你該知道的事兒

    摘要:順便一說,這首歌的原唱是秋田,中島當(dāng)年嗓子壞了,才有這歌。中文是直接翻譯來的,作曲是秋田。一部電影春夏秋冬又一春春夏秋冬又一春是由金基德執(zhí)導(dǎo),金英民吳英秀金基德主演的一部韓國(guó)電影。年月日于韓國(guó)上映。 原鏈接: http://bluezhan.me/weekly/#/9-2 1、web前端 Angular vs. React vs. Vue: A 2017 comparison 9 S...

    sixgo 評(píng)論0 收藏0
  • 【回顧九月份第二周】 前端你該知道的事兒

    摘要:順便一說,這首歌的原唱是秋田,中島當(dāng)年嗓子壞了,才有這歌。中文是直接翻譯來的,作曲是秋田。一部電影春夏秋冬又一春春夏秋冬又一春是由金基德執(zhí)導(dǎo),金英民吳英秀金基德主演的一部韓國(guó)電影。年月日于韓國(guó)上映。 原鏈接: http://bluezhan.me/weekly/#/9-2 1、web前端 Angular vs. React vs. Vue: A 2017 comparison 9 S...

    levius 評(píng)論0 收藏0
  • 2017-08-26 前端日?qǐng)?bào)

    摘要:前端日?qǐng)?bào)精選譯中一些超級(jí)好用的內(nèi)置方法漫談組件庫(kù)開發(fā)一多層嵌套彈層組件高階組件淺析的工廠函數(shù)打包優(yōu)化之速度篇中文教程用純實(shí)現(xiàn)跳跳球動(dòng)畫眾成翻譯個(gè)幫助你學(xué)習(xí)的快速且久經(jīng)考驗(yàn)的技巧眾成翻譯自定義屬性使用進(jìn)行動(dòng)態(tài)更改眾成翻譯真假值知多 2017-08-26 前端日?qǐng)?bào) 精選 【譯】ES6中一些超!級(jí)!好!用!的內(nèi)置方法漫談 React 組件庫(kù)開發(fā)(一):多層嵌套彈層組件React 高階組件淺析...

    lykops 評(píng)論0 收藏0
  • 2018.11.19秋招末第二波前端實(shí)習(xí)/校招小結(jié)

    摘要:背景個(gè)人背景就讀于東北某普通二本院校計(jì)算機(jī)軟件工程專業(yè),現(xiàn)大四,北京實(shí)習(xí)前端方向,自學(xué),技術(shù)棧時(shí)間背景大概是在月日準(zhǔn)備好簡(jiǎn)歷開始投遞秋招差不多已經(jīng)結(jié)束招聘崗位不多,投遞對(duì)象為大一些的互聯(lián)網(wǎng)公司事件背景第一個(gè)入職的是好未來的前端實(shí)習(xí)崗,待遇工 背景 個(gè)人背景 就讀于東北某普通二本院校計(jì)算機(jī)軟件工程專業(yè),現(xiàn)大四,北京實(shí)習(xí) 前端方向,自學(xué),vue技術(shù)棧 時(shí)間背景 大概是在11月9日準(zhǔn)備...

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

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

0條評(píng)論

閱讀需要支付1元查看
<