面试代码题整理与答案

173 阅读2分钟

1.Q:

function get() {
  // 请补全函数参数和实现逻辑
}
const obj = { selector: { to: { toutiao: 'FE coder' } }, target: [1, 2, { name: 'byted' }] };
// 运行代码
get(obj, 'selector.to.toutiao', 'target[0]', 'target[2].name')
//  输出结果:
// ['FE coder', 1, 'byted']

A:

get(obj,...args) {
    let arr=[]
    args.forEach(item=>{
        item=item.replace("]","").replace("[",".")
        arr.push(this.path(obj,item))
    })
    return arr
},
 path(obj,str){
    let strArr=str.split('.')
    return strArr.reduce((sum,cur)=>{
       return sum[cur]
    },obj)
},

2.Q 事件管理器实现 A:

let events={} 
class Event 
{ 
    constructor(){
        this.events={} 
    } 
    on(eventName,callBack){ 
        // this.callbacks[eventName] = this.callbacks[eventName] || []
        // this.callbacks[eventName].push(callBack)
        if(this.events[eventName]) { 
            this.events[eventName].push(callBack) 
        } else { 
            this.events[eventName]=[callBack] 
        } 
    } 
    emit(eventName,params){ 
        if(this.events[eventName]){ 
            this.events[eventName].map((callBack)=>{ 
                callBack(params) 
            }) 
        } 
    }
    delete(eventName,callBack){
        if(this._events[eventName] === undefined){
            throw new NoEventException(
                `Can not unregister method, the event named "${event}" is not existed!`
            );
        }
        const index = this.events[eventName].indexOf(callBack);
        if(index === -1){
            throw new NoEventException(
                `Can not unregister method, the method named "${method}" is not in event "${events}"!`);
        }
        this.events[event].splice(index, 1);
        if(this.events[event].length === 0){
            delete this.events[event];
        }
    }
} 
export default Event;

3.背包问题 求给定数组中 N 个数相加之和为 sum 所有可能集合,请补充以下代码

function findSumNumbers(array, n, sum) {
  // 枚举所有n个数的组合,判断组合的和等于sum
  let result = [];
  const generateAll = function( collection, arr) {
    if (collection.length === n) {
      const s = collection.reduce((acc, c) => acc += c, 0);
      if (s === sum) {
        result.push(collection);
      }
      return;
    }
    for (let i = 0; i < arr.length; i++) {
      generateAll( collection.concat(arr[i]), arr.slice(i + 1));
    }
  }
  generateAll( [], array.slice(0));
  return result;
}

值为[{"京酱肉丝":20.5},{"麻婆豆腐":10.7},{'北京烤鸭':101},{"数组与":80.5},{"luand1":101}]

function findSumNumbers(array, n, sum) {
  // 枚举所有n个数的组合,判断组合的和等于sum
  let result = [];
  const generateAll = function( collection, arr) { 
    if (collection.length === n) {
      const s = collection.reduce((acc, c) => acc += Object.values(c)[0], 0); 
      if (s === sum) {
        result.push(collection);
      } 
      return;
    } 
    for (let i = 0; i < arr.length; i++) {
      generateAll( collection.concat(arr[i]), arr.slice(i + 1));
    }
  }
  generateAll([], array.slice(0));
  return result;
}

不限制n

function findSumNumbers(array, sum) {
  // 枚举所有n个数的组合,判断组合的和等于sum
  let result = [];
  const generateAll = function( collection, arr) { 
      const s = collection.reduce((acc, c) => acc += Object.values(c)[0], 0); 
      if (s === sum) {
        result.push(collection);
      } 
    for (let i = 0; i < arr.length; i++) {
      generateAll( collection.concat(arr[i]), arr.slice(i + 1));
    }
  }
  generateAll([], array.slice(0));
  return result;
}

4.深拷贝

const isComplexDataType = obj => (typeof obj === 'object' || typeof obj === 'function') && (obj !== null)
const deepClone = function (obj, hash = new WeakMap()) {
  if (obj.constructor === Date) 
      return new Date(obj)       // 日期对象直接返回一个新的日期对象
  if (obj.constructor === RegExp)
      return new RegExp(obj)     //正则对象直接返回一个新的正则对象
  //如果循环引用了就用 weakMap 来解决
  if (hash.has(obj)) return hash.get(obj)
  let allDesc = Object.getOwnPropertyDescriptors(obj)
  //遍历传入参数所有键的特性
  let cloneObj = Object.create(Object.getPrototypeOf(obj), allDesc)
  //继承原型链
  hash.set(obj, cloneObj)
  for (let key of Reflect.ownKeys(obj)) { 
    cloneObj[key] = (isComplexDataType(obj[key]) && typeof obj[key] !== 'function') ? deepClone(obj[key], hash) : obj[key]
  }
  return cloneObj
}

5.使用localstorage实现一个支持过期时间的缓存

//缓存
var cache={

    /**
     * 设置缓存
     * @param key
     * @param value
     * @param expiredTimeMS  过期时间,单位ms
     */
    "set":function (key,value,expiredTimeMS) {
        console.log("cache set: key="+key +  " value = " + value + " expiredTimeMS = " + expiredTimeMS)
        if((expiredTimeMS == 0 )  || (expiredTimeMS == null)){
            localStorage.setItem(key,value);
        }
        else {

            localStorage.setItem(key,JSON.stringify(value));
            localStorage.setItem(key+'EXPIREDTIME',expiredTimeMS+Number(new Date().getTime()));
        }

    },
    /**
     *  获取键
     * @param key
     * @returns {*} key存在,返回对象;不存在,返回null
     */
    "get":function (key) {

        var expiredTime = localStorage.getItem(key+'EXPIREDTIME');
        var curTime = new Date().getTime();

        if((expiredTime) > curTime){
            console.log("cache-缓存["+key+"]存在!");
            return  JSON.parse(localStorage.getItem(key));
        }
        else {
            console.log("cache-缓存["+key+"]不存在!");
            cache.remove(key);
            return null;
        }



    },
    /**
     *  移除键
     * @param key
     */
    "remove":function (key) {
        localStorage.removeItem(key);
        localStorage.removeItem(key+'EXPIREDTIME');
    },
    /**
     * 对键重新更新过期时间
     * @param key
     * @param expiredTimeMS  过期时间ms
     */
    "expired":function (key,expiredTimeMS) {

        if(cache.get(key)!=null){
            localStorage.setItem(key+'EXPIREDTIME',expiredTimeMS+Number(new Date().getTime()));
        }

    },
    /**
     * 清除所有缓存
     */
    "clear":function () {
        localStorage.clear();
    }

}

www.cnblogs.com/qianxiaox/p… 5.JavaScript 实现每次调用一个函数自动加1

var getId = (function () {
  
   // "use strict";

    var i = 0;
    return function () {
        return ++i;
    };
    
})();

console.log(getId()); 	//1
console.log(getId());	//2
原文链接:https://blog.csdn.net/weixin_43971228/article/details/89146656