assert.js rule 7.4 (similar to CJS rule 7.3)

  • Version: v6.1.0
  • Platform: Linux ███ 3.13.0-97-generic #144-Ubuntu SMP Thu Sep 22 16:23:22 UTC 2016 i686 i686 i686 GNU/Linux
  • Subsystem: assert

Hi,

I'm developing an assert lib and it disagrees with node's. While debugging, I found rule 7.4 in master/lib/assert.js @ d4061a6 that to me sounds very similar to rule 7.3 in the CJS spec:

  // 7.4. Other pairs that do not both pass typeof value == 'object',
  // equivalence is determined by ==.
  } else if ((actual === null || typeof actual !== 'object') &&
    (expected === null || typeof expected !== 'object')) {

I think the condition tests both values for being primitives, aka not objects. Firefox seems to agree:

var actual = true, expected = [ 1 ];
console.log([ (actual === null || typeof actual !== 'object'), '&&',
    (expected === null || typeof expected !== 'object') ]);
// -> Array [ true, "&&", false ]

So one passes the object check, the other does not, as expected.
Is it a pair where both values pass the object check? No.
So shouldn't it count as a "[pair] that do not both pass typeof […] object"?
If the partial conditions negate the object check and check for being primiteves instead, shouldn't the binary operator change to ||?

Pre-emptive: In case anyone feels inclined to discuss the quality of the CJS UT spec and/or how much better deepStrictEqual is, please make another issue for that.