Javascript RemoveAllListeners()是否不删除$events属性?

Javascript RemoveAllListeners()是否不删除$events属性?,javascript,node.js,socket.io,Javascript,Node.js,Socket.io,我构建了一个简单的客户端记录器,它在我的页面上打印所有当前活动的socket.io侦听器。我直接从套接字对象和内部$events对象获取此信息 $events对象在chrome中的示例如下所示: $events: Object news: function (data) { __proto__: Object 但是,当使用socket.removeAllListeners'news删除事件的侦听器时,它如下所示: $events: Object news: null

我构建了一个简单的客户端记录器,它在我的页面上打印所有当前活动的socket.io侦听器。我直接从套接字对象和内部$events对象获取此信息

$events对象在chrome中的示例如下所示:

$events: Object
    news: function (data) {
    __proto__: Object
但是,当使用socket.removeAllListeners'news删除事件的侦听器时,它如下所示:

$events: Object
    news: null
    __proto__: Object
$events: Object
    __proto__: Object
属性保持不变,但作为值获取null。为什么不完全删除

当您使用socket.once并获取从服务器发出的侦听器时,或者当您直接使用socket.removeListener删除具体侦听器时,该属性将被删除,如下所示:

$events: Object
    news: null
    __proto__: Object
$events: Object
    __proto__: Object

我真的很想知道它为什么会这样。它是否仍在侦听值为null的事件,但不调用任何函数?

每当对象上发生特定事件类型的事件时,节点都需要手动查找该类型,以查看是否有任何相关函数。如果该事件类型的属性存在时为null,或者该属性不存在时使其未定义,则实际上并不重要。无论哪种方式,Node都会发现没有函数,因此没有可调用的处理程序。不删除属性的一个原因是,使用null会比使用null慢,因为V8使用隐藏类来优化对象访问,但如果不询问socketio作者,就很难说。有一个已定义的结构,而不是不断地切换现有属性,也会更容易。