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))
}
}
