前端学习

前端学习

@色少1年前

03/21
19:52
js基础 面经

JS遍历对象的七种方法

for…in

for…in 可以遍历对象的所有可枚举属性,包括对象本身的和对象继承来的属性

Object.keys()

Object.keys()方法可以遍历到所有对象本身的可枚举属性,但是其返回值为数组

Object.values()

Object.values()Object.keys()遍历对象的特性是相同的,但是其返回的结构是以遍历的属性值构成的数组

Object.entries()

Object.entries()的返回值为Object.values()Object.keys()的结合,也就是说它会返回一个嵌套数组,数组内包括了属性名与属性值

Object.getOwnPropertyNames()

其返回结果与Object.keys()对应,但是他得特性与其相反,会返回对象得所有属性,包括了不可枚举属性

Object.getOwnPropertySymbols()

Object.getOwnPropertySymbols()会返回对象内的所有Symbol属性,返回形式依旧是数组,值得注意的是,在对象初始化的时候,内部是不会包含任何Symbol属性

Reflect.ownKeys()

Reflect.ownKeys()返回的是一个大杂烩数组,即包含了对象的所有属性,无论是否可枚举还是属性是symbol,还是继承,将所有的属性返回

根据遍历目标区分

遍历目标 方法
遍历对象本身的可枚举属性不包含继承来的属性(不包括Symbol() Object.keys()
Object.values()
Object.entries()
遍历对象本身的可枚举属性包括继承来的属性(不包括Symbol() for…in
遍历对象本身的所有属性(不包括Symbol() Object.getOwnPropertyNames()
遍历对象的Symbol()属性 Object.getOwnPropertySymbols()
遍历对象的所有属性 Reflect.ownKeys()

根据返回值区分

返回值 方法
返回数组 Object.keys()
Object.values()
Object.entries()
Object.getOwnPropertyNames()
Object.getOwnPropertySymbols()
Reflect.ownKeys()
不返回值 for…in

根据遍历值区分

遍历值 方法
遍历属性 Reflect.ownKeys()
Object.getOwnPropertyNames()
Object.keys()
遍历属性值 Object.getOwnPropertySymbols()
Object.values()
遍历全部 for…in
Object.entries()

JS遍历对象的七种方法

@色少1年前

03/19
16:20
js手写题 面经

实现new方法

new 运算符创建一个用户定义的对象类型的实例或具有构造函数的内置对象类型之一

实现new,首先就要知道 new 操作,里面到底做了些啥?

  • 创建一个空对象,将它的引用赋给this,继承函数的原型。
  • 通过 this 将属性和方法添加至这个对象
  • 最后返回 this 指向的新对象,也就是实例(如果没有手动返回其他的对象)

实现方法

function myNew(Parent, ...args) {
  // 创建一个空对象,基础父级的原型
  let obj = Object.create(Parent.prototype)
  // 把this对象和剩余参数给构造函数
  let result = Parent.apply(obj, args)
  // 最后返回对象
  return typeof result === 'object' ? result : obj
}

// new构造函数的模拟实现
const _new = function(){
    let obj = new Object();
    let _constructor = [].shift.call(arguments);

    // 使用中间函数来维护原型关系
    const F = function(){};
    F.prototype = _constructor.prototype;
    obj = new F();

    let res = _constructor.apply(obj,arguments);
    return typeof res === 'object' ? res || obj : obj;
}

实现new方法

@色少1年前

03/18
16:54
面经

HTTP 状态消息 200 302 304 403 404 500 分别表示什么?

状态码【200】表示【请求成功】,一般在GET和POST请求中可以见到;

状态码【302】表示【资源临时移动】;

状态码【304】表示【所请求的资源并未修改】;

状态码【403】表示【服务器拒绝执行客户端的请求】通常表示用户通过了身份验证,但缺少权限对给定的资源进行访问或者操作;场景:用户登录成功,但是无权进行读写操作。

状态码【404】表示【服务器找不到客户端所请求的资源(网页)】;

状态码【500】表示【服务器内部错误】。

状态码【401】表示【请求没有被认证或者认证失败】
通常由web服务器返回,而不是web应用。
场景:token失效、token缺失、token伪造,导致服务端无法识别身份。

总结
401和403的主要区别在于

重点不同:401着重于认证,403着重于授权
返回对象不同:401通常由web服务器返回,403由web应用返回
场景不同:401表示用户未通过身份授权、验证,403表示用户可能通过了身份验证,但缺少指定权限

HTTP 状态消息 200 302 304 403 404 500 分别表示什么?