如何判断给定值是否可以进行Proxy创建

在翻看immer.js的源码(v0.4.0)时,发现其中有一个方法用来判断给定值,是否可以创建代理对象,源码如下

function isProxyable(value) {
  if (!value) return false
  if (typeof value !== "object") return false
  if (Array.isArray(value)) return true
  const proto = Object.getPrototypeOf(value)
  return (proto === proto) === null || Object.prototype
}

最后的语句死活看不懂,调试后也是返回Object.prototype, 最后交给ChatGPT来解释,gpt给的答案是源码写错了, 应该是判断proto === null || proto === Object.prototype;

对于判断proto === Object.prototype是能理解的,因为字面量的对象,原型就是Object.prototype, 但是为什么要增加proto === null的判断呢?

说明Object.create(null)也是能创建出类似字面量对象那样的值,尝试如下代码

const v = Object.create(null); // {}
v.name = 'v'; // { name: 'v' }
Object.getPrototypeOf(v); // null

因此,对于类似字面量对象的值,其原型有两种可能:

  • Object.prototype
  • null

对于immer.js v0.4.0版本,创建代理对象而言,目标对象仅限于Plain Object,因为immer.js要解决的问题就是plain object的数据更新问题,不解决原型链复杂的对象更新问题。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
proxy_qlen是一个Linux内核中的网络模块,其作用是限制网络数据包的队列长度。其源码位于文件路径为`net/sched/sch_api.c`和`include/net/sch_generic.h`。下面是其源码的分析: 1.在`sched/sch_api.c`中,proxy_qlen的实现是通过调用函数`qdisc_create_dflt()`来创建一个默认的队列规则,并将其作为子规则添加到给定的网络设备的根规则中。其中的`qdisc`是队列规则的数据结构,包含了队列的一些参数和操作函数。 2.`qdisc_create_dflt()`函数首先通过调用`qdisc_create()`函数来创建一个队列规则,并初始化其参数和操作函数。然后,它调用`qdisc_add()`函数将该队列规则添加到给定的父规则中。在proxy_qlen的实现中,父规则是网络设备的根规则。 3.`qdisc`的操作函数包括了队列的入队和出队操作,以及队列的状态查询等操作。在proxy_qlen中,其主要操作函数是`proxy_qlen_enqueue()`和`proxy_qlen_dequeue()`,用来限制数据包的队列长度。 4.`proxy_qlen_enqueue()`函数在将数据包加入队列之前,首先检查队列长度是否超过了设定的最大。如果超过了,就将队列中最早的数据包删除。然后再将新的数据包加入队列。 5.`proxy_qlen_dequeue()`函数则是在从队列中取出数据包时,将队列长度减1。 6.在`include/net/sch_generic.h`中,定义了`struct Qdisc`和`struct sk_buff`等数据结构,以及`proxy_qlen_enqueue()`和`proxy_qlen_dequeue()`等操作函数的原型。 总之,proxy_qlen是一个简单但实用的网络模块,可以限制网络数据包的队列长度,避免过长的队列导致网络性能下降。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值