比较 2 个变量时给出与 === 相同的结果的最短函数

Shortest function that gives same result as === when comparing 2 variables

提问人:juan manuel taboada álvarez 提问时间:10/13/2021 最后编辑:juan manuel taboada álvarez 更新时间:10/13/2021 访问量:60

问:

这是我的看法。有没有可能让它更短?(不仅仅是把它变成一个箭头函数) 不得使用任何 ===

这是我的第三次尝试,我现在真的不知道是否有可能进一步缩短它

function strictEquals(a, b) {
  if ([a, b].every(isNaN)) return false;
  return Object.is(a + 0, b + 0) || Object.is(a, b);
}

第二次尝试。

function strictEquals(a, b) {
  if (Number.isNaN(a) && Number.isNaN(b)) {
    return false;
  }
  if (
    (Object.is(a, 0) && Object.is(b, -0)) ||
    (Object.is(a, -0) && Object.is(b, 0))
  ) {
    return true;
  }
  return Object.is(a, b);
}

您可以使用这一系列测试来测试您的测试

console.log('(1, 1), expected true', strictEquals(1, 1));
console.log('(NaN, NaN), expected false', strictEquals(NaN, NaN));
console.log('(0, -0), expected true', strictEquals(0, -0));
console.log('(-0, 0), expected true', strictEquals(-0, 0));
console.log("(1, '1'),expected false", strictEquals(1, '1'));
console.log('(true, false), expected false',strictEquals(true,false));
console.log('(false, false), expected true', strictEquals(false,false));
console.log("('Water', 'Oil'), expected false", strictEquals('Water', 'Oil'));
console.log('(Undefined, NaN), expected false', strictEquals(undefined, NaN));

这是一个错误(我的第一次尝试)

function strictEquals(a, b) { if ((Number.isNaN(a) && Number.isNaN(b)) || !Object.is(a, b)) return false; return Object.is(a + 1, b + 1); }
JavaScript 比较 相等 iequalitycomparer

评论


答:

0赞 Roman Kurbatov 10/13/2021 #1

修改版本:

function strictEqual(a,b) {
  return (Object.is(a, b) || Object.is(a+1, b+1)) && !Number.isNaN(a)
}

评论

0赞 juan manuel taboada álvarez 10/13/2021
这是一个很好的尝试,但我需要在没有 === 的情况下这样做
0赞 Roman Kurbatov 10/13/2021
好的,然后将 === a 替换为 ,它仍然比你的短!Number.isNaN(a)
0赞 juan manuel taboada álvarez 10/13/2021
我编辑了我的,因为它给出了误报。你也是。这个效果很好