diff --git a/lib/events.js b/lib/events.js index c4ab9d80a0a..fe7c048738f 100644 --- a/lib/events.js +++ b/lib/events.js @@ -228,15 +228,8 @@ EventEmitter.prototype.removeAllListeners = function(type) { return this; } - var events = this._events && this._events[type]; - if (!events) return this; - - if (isArray(events)) { - events.splice(0); - } else { - this._events[type] = null; - } - + // does not use listeners(), so no side effect of creating _events[type] + if (type && this._events && this._events[type]) this._events[type] = null; return this; }; diff --git a/test/simple/test-event-emitter-remove-all-listeners.js b/test/simple/test-event-emitter-remove-all-listeners.js index 6e27f3eb702..38cfb79c67e 100644 --- a/test/simple/test-event-emitter-remove-all-listeners.js +++ b/test/simple/test-event-emitter-remove-all-listeners.js @@ -39,10 +39,15 @@ e1.removeAllListeners('baz'); assert.deepEqual(e1.listeners('foo'), [listener]); assert.deepEqual(e1.listeners('bar'), []); assert.deepEqual(e1.listeners('baz'), []); -// identity check, the array should not change -assert.equal(e1.listeners('foo'), fooListeners); -assert.equal(e1.listeners('bar'), barListeners); -assert.equal(e1.listeners('baz'), bazListeners); +// after calling removeAllListeners, +// the old listeners array should stay unchanged +assert.deepEqual(fooListeners, [listener]); +assert.deepEqual(barListeners, [listener]); +assert.deepEqual(bazListeners, [listener, listener]); +// after calling removeAllListeners, +// new listeners arrays are different from the old +assert.notEqual(e1.listeners('bar'), barListeners); +assert.notEqual(e1.listeners('baz'), bazListeners); var e2 = new events.EventEmitter(); e2.on('foo', listener);