Я посмотрел некоторое время, но, к моему удивлению, не нашел ответа конкретно на это.
Я хотел бы проверить, изменились ли значения в нашем инструменте набора данных. Для этого я хотел бы использовать свободное сравнение, чтобы эквивалентные числа, преобразованные в строку (просто пример), не были обнаружены измененными:
42 != "42" // -> false
Однако по понятным причинам я хотел бы, чтобы ложные сравнения строго сравнивались, за исключением случаев, когда они эквивалентны, например:
'' != 0 // -> false, i'd like true
'0' != 0 // -> false, and that's OK
null != false // -> true, and that's OK
undefined != null // -> false, but should be true (this case is not the priority)
Есть ли эффективный способ сделать это, не перечисляя все случаи вручную?
это делает другой составитель, который я бы предпочел пока не рассматривать из-за его сложности, это для временного исправления



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


вы можете использовать parseInt
const a = parseInt('') !== 0 // -> false, i'd like true
const b = parseInt('0') !== 0 // -> false, and that's OK
const c = parseInt(null) !== false // -> true, and that's OK
const d = parseInt(undefined) !== null // -> false, but should be true (this case is not the priority)
const x = parseInt(0) !== ''
console.info(a, b, c, d, x);это могло бы сделать часть трюка, за исключением того, что значения не в определенном порядке (строковая часть может быть с любой стороны): parseInt(0) != '' является ложным:/
как насчет проверки типа? используя !== вместо != (обновленный ответ)
это идея, я проверю это, спасибо за ответ
к сожалению, это не проходит в другом порядке: parseInt('0') !== 0 ложно, но parseInt(0) !== '0' верно ... но я не был достаточно исчерпывающим в своих примерах, так что это не ваша вина, еще раз спасибо, добавил решение, которое мне подходит
о боже, нужно просмотреть мои вещи, они с треском проваливаются для того же случая, что и ваш :D
После некоторых тестов (многие провалились, потому что null не имеет свойств, поэтому нет .toString и тому подобного) я нашел то, что подходит, благодаря помощи ответа Таки, parseInt был ключом благодаря NaN преобразование. Первоначальная идея заключалась в простом переводе самого вопроса в код: (a && a != b) || (!a && a !== b), но с 0 и '0' именно в таком порядке это не работает. Итак, я пошел с этим (проверка на правдивость не кажется необходимой): (a != b) || (!a && parseInt(a) !== parseInt(b))
function test(a, b){
return (a != b) || (!a && parseInt(a) !== parseInt(b));
}
var a = test('', 0), // -> false, i'd like true
b = test(0, ''),
c = test(0, '0'), // -> false, and that's OK
d = test('0', 0),
e = test(null, false), // -> true, and that's OK
f = test(false, null),
g = test(undefined, null), // -> false, but should be true (this case is not the priority)
h = test(null, undefined),
i = test('', undefined), //all following are falsey and different, so true
j = test(undefined, ''),
k = test('', null),
l = test(null, ''),
m = test('0', undefined),
n = test(undefined, '0'),
o = test(null, '0'),
p = test('0', undefined),
q = test('1', true), //was not specified, but true is 1 in our DB, so false is OK
r = test(true, '1'),
s = test('42', 42), //also false, no change
t = test(42, '42');
console.info(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t);
Ну, я думаю, вам не повезло, и вам нужно что-то закодировать, чтобы сделать проверки для вас. Почему бы вам не преобразовать его в строки или числа для начала и не полагаться на сравнение, чтобы изменить его.