面试题

1、请分析以下代码执行结果

['1', '3', '10'].map(parseInt);

map函数奖值与下标当成参数传个parseInt函数

[1,3,10].map(function (a,b) {
  return parseInt(a, b)
})

2、请分析以下代码执行结果

var number = 10;
function fn() {
  console.log(this.number);
}
var obj = {
  number: 2,
  show: function(fn) {
    this.number = 3;
    fn();
    arguments[0]();
  }
};
obj.show(fn);

this的指向问题fn第一个this指向window结果为10;第二个指向 arguments结果为undefined
比较经典的this指向问题

var length = 10;
function fn() {
  console.log(this.length)
}

var obj = {
  length: 5,
  method: function(fn) {
    fn();// this指向window
    arguments[0]()// this指向arguments => [fn, 1]
  }
}

obj.method(fn, 1)

3、手写一个深拷贝函数。

function isObject(obj) {
  return Object.prototype.toString.call(obj) === '[object Object]'
}
function deepCopy(source, hash = new WeakMap()){
  if(!isObject(source)) return source;
  if(hash.has(source)) return hash.get(source);

  let res = Array.isArray(source)?[]:{};
  hash.set(source, res)
  for(var key in source) {
    if(Object.prototype.hasOwnProperty.call(source, key)) {
      if(isObject(source[key])) {
        res[key] = deepCopy(source[key], hash)
      } else {
        res[key] = source[key]
      }
    }
  }
  return res
}

4、HTTP 状态码

2**开头 (请求成功)表示成功处理了请求的状态代码
200(成功)服务器已成功处理了请求。 通常,这表示服务器提供了请求的网页。
3** 开头 (请求被重定向)表示要完成请求,需要进一步操作。 通常,这些状态代码用来重
301 (永久移动) 请求的网页已永久移动到新位置。 服务器返回此响应(对 GET 或 HEAD 请求的响应)时,会自动将请求者转到新位置。
302 (临时移动) 服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。
304 (未修改) 自从上次请求后,请求的网页未修改过。 服务器返回此响应时,不会返回网页内容。
4**开头 (请求错误)这些状态代码表示请求可能出错,妨碍了服务器的处理。
400 (错误请求) 服务器不理解请求的语法。
401 (未授权) 请求要求身份验证。 对于需要登录的网页,服务器可能返回此响应。
403 (禁止) 服务器拒绝请求。
5**开头(服务器错误)这些状态代码表示服务器在尝试处理请求时发生内部错误。 这些错误可能是服务器本身的错误,而不是请求出错。
500 (服务器内部错误) 服务器遇到错误,无法完成请求。

5、手写发布订阅模式 EventEmitter

class EventEmitter {
  constructor() {
    this._envents = {}
  }
  on(eventname, callback) {
    let callbacks = this._envents[eventname] || []
    callbacks.push(callback)
    this._envents[eventname] = callbacks;
  }
  off(eventname, callback) {
    let callbacks = this._envents[eventname]
    this._envents[eventname] = callbacks && callbacks.filter(fn => fn!==callback)
  }
  once(eventname, callback) {
    let wrapFunc = (...args) => {
      callback.apply(this, args)
      this.off(eventname, wrapFunc)
    }
    this.on(eventname, wrapFunc)
    return this
  }
  emit(eventname, ...args) {
    const callbacks = this._envents[eventname]
    callbacks.forEach(fn => fn.apply(this,args))
  }
}

你可能感兴趣的:(面试题)