web前端面試4

1 ES6中的map和原生的對象有什么區(qū)別

JavaScript 的對象(Object)菩颖,本質(zhì)上是鍵值對的集合(Hash 結(jié)構(gòu)),但是傳統(tǒng)上只能用字符串當(dāng)作鍵为障。這給它的使用帶來了很大的限制晦闰。
ES6 提供了 Map 數(shù)據(jù)結(jié)構(gòu)。它類似于對象鳍怨,也是鍵值對的集合呻右,但是“鍵”的范圍不限于字符串,各種類型的值(包括對象)都可以當(dāng)作鍵鞋喇。也就是說声滥,Object 結(jié)構(gòu)提供了“字符串—值”的對應(yīng),Map 結(jié)構(gòu)提供了“值—值”的對應(yīng)侦香,是一種更完善的 Hash 結(jié)構(gòu)實現(xiàn)落塑。如果你需要“鍵值對”的數(shù)據(jù)結(jié)構(gòu)纽疟,Map 比 Object 更合適。

2 sum(2, 3)實現(xiàn)sum(2)(3)的效果

function sum(){
    var num = arguments[0];
    if(arguments.length==1){
        return function(sec){
            return num+sec;
        }
    }else{
        var num = 0;
        for(var i = 0;i<arguments.length;i++){
            num = num + arguments[i];
        }
    return num;
    }
}

3 兩個對象如何比較

 
function isFunction(obj) {
    return toString.call(obj) === '[object Function]'
}
 
function eq(a, b, aStack, bStack) {
 
    // === 結(jié)果為 true 的區(qū)別出 +0 和 -0
    if (a === b) return a !== 0 || 1 / a === 1 / b;
 
    // typeof null 的結(jié)果為 object 憾赁,這里做判斷污朽,是為了讓有 null 的情況盡早退出函數(shù)
    if (a == null || b == null) return false;
 
    // 判斷 NaN
    if (a !== a) return b !== b;
 
    // 判斷參數(shù) a 類型,如果是基本類型龙考,在這里可以直接返回 false
    var type = typeof a;
    if (type !== 'function' && type !== 'object' && typeof b != 'object') return false;
 
    // 更復(fù)雜的對象使用 deepEq 函數(shù)進行深度比較
    return deepEq(a, b, aStack, bStack);
};
 
function deepEq(a, b, aStack, bStack) {
 
    // a 和 b 的內(nèi)部屬性 [[class]] 相同時 返回 true
    var className = toString.call(a);
    if (className !== toString.call(b)) return false;
 
    switch (className) {
        case '[object RegExp]':
        case '[object String]':
            return '' + a === '' + b;
        case '[object Number]':
            if (+a !== +a) return +b !== +b;
            return +a === 0 ? 1 / +a === 1 / b : +a === +b;
        case '[object Date]':
        case '[object Boolean]':
            return +a === +b;
    }
 
    var areArrays = className === '[object Array]';
    // 不是數(shù)組
    if (!areArrays) {
        // 過濾掉兩個函數(shù)的情況
        if (typeof a != 'object' || typeof b != 'object') return false;
 
        var aCtor = a.constructor,
            bCtor = b.constructor;
        // aCtor 和 bCtor 必須都存在并且都不是 Object 構(gòu)造函數(shù)的情況下蟆肆,aCtor 不等于 bCtor, 那這兩個對象就真的不相等啦
        if (aCtor !== bCtor && !(isFunction(aCtor) && aCtor instanceof aCtor && isFunction(bCtor) && bCtor instanceof bCtor) && ('constructor' in a && 'constructor' in b)) {
            return false;
        }
    }
 
 
    aStack = aStack || [];
    bStack = bStack || [];
    var length = aStack.length;
 
    // 檢查是否有循環(huán)引用的部分
    while (length--) {
        if (aStack[length] === a) {
            return bStack[length] === b;
        }
    }
 
    aStack.push(a);
    bStack.push(b);
 
    // 數(shù)組判斷
    if (areArrays) {
 
        length = a.length;
        if (length !== b.length) return false;
 
        while (length--) {
            if (!eq(a[length], b[length], aStack, bStack)) return false;
        }
    }
    // 對象判斷
    else {
 
        var keys = Object.keys(a),
            key;
        length = keys.length;
 
        if (Object.keys(b).length !== length) return false;
        while (length--) {
 
            key = keys[length];
            if (!(b.hasOwnProperty(key) && eq(a[key], b[key], aStack, bStack))) return false;
        }
    }
 
    aStack.pop();
    bStack.pop();
    return true;
 
}
 
console.log(eq(0, 0)) // true
console.log(eq(0, -0)) // false
 
console.log(eq(NaN, NaN)); // true
console.log(eq(Number(NaN), Number(NaN))); // true
 
console.log(eq('Curly', new String('Curly'))); // true
 
console.log(eq([1], [1])); // true
console.log(eq({ value: 1 }, { value: 1 })); // true
 
var a, b;
 
a = { foo: { b: { foo: { c: { foo: null } } } } };
b = { foo: { b: { foo: { c: { foo: null } } } } };
a.foo.b.foo.c.foo = a;
b.foo.b.foo.c.foo = b;
 
console.log(eq(a, b)) // true

4 如何設(shè)計Promise.all()

  return new Promise(function(resolve, reject) {
    if (!isArray(promises)) {
      return reject(new TypeError('arguments must be an array'));
    }
    var resolvedCounter = 0;
    var promiseNum = promises.length;
    var resolvedValues = new Array(promiseNum);
    for (var i = 0; i < promiseNum; i++) {
      (function(i) {
        Promise.resolve(promises[i]).then(function(value) {
          resolvedCounter++
          resolvedValues[i] = value
          if (resolvedCounter == promiseNum) {
            return resolve(resolvedValues)
          }
        }, function(reason) {
          return reject(reason)
        })
      })(i)
    }
  })
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末洲愤,一起剝皮案震驚了整個濱河市颓芭,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌柬赐,老刑警劉巖亡问,帶你破解...
    沈念sama閱讀 216,997評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異肛宋,居然都是意外死亡州藕,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,603評論 3 392
  • 文/潘曉璐 我一進店門酝陈,熙熙樓的掌柜王于貴愁眉苦臉地迎上來床玻,“玉大人,你說我怎么就攤上這事沉帮⌒馑溃” “怎么了?”我有些...
    開封第一講書人閱讀 163,359評論 0 353
  • 文/不壞的土叔 我叫張陵穆壕,是天一觀的道長待牵。 經(jīng)常有香客問我,道長喇勋,這世上最難降的妖魔是什么缨该? 我笑而不...
    開封第一講書人閱讀 58,309評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮川背,結(jié)果婚禮上贰拿,老公的妹妹穿的比我還像新娘。我一直安慰自己熄云,他們只是感情好膨更,可當(dāng)我...
    茶點故事閱讀 67,346評論 6 390
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著缴允,像睡著了一般询一。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,258評論 1 300
  • 那天健蕊,我揣著相機與錄音,去河邊找鬼踢俄。 笑死缩功,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的都办。 我是一名探鬼主播嫡锌,決...
    沈念sama閱讀 40,122評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼琳钉!你這毒婦竟也來了势木?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,970評論 0 275
  • 序言:老撾萬榮一對情侶失蹤歌懒,失蹤者是張志新(化名)和其女友劉穎啦桌,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體及皂,經(jīng)...
    沈念sama閱讀 45,403評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡甫男,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,596評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了验烧。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片板驳。...
    茶點故事閱讀 39,769評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖碍拆,靈堂內(nèi)的尸體忽然破棺而出若治,到底是詐尸還是另有隱情,我是刑警寧澤感混,帶...
    沈念sama閱讀 35,464評論 5 344
  • 正文 年R本政府宣布端幼,位于F島的核電站,受9級特大地震影響浩习,放射性物質(zhì)發(fā)生泄漏静暂。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,075評論 3 327
  • 文/蒙蒙 一谱秽、第九天 我趴在偏房一處隱蔽的房頂上張望洽蛀。 院中可真熱鬧,春花似錦疟赊、人聲如沸郊供。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,705評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽驮审。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間疯淫,已是汗流浹背地来。 一陣腳步聲響...
    開封第一講書人閱讀 32,848評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留熙掺,地道東北人未斑。 一個月前我還...
    沈念sama閱讀 47,831評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像币绩,于是被迫代替她去往敵國和親蜡秽。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,678評論 2 354

推薦閱讀更多精彩內(nèi)容