Проверка Javascript на свободное сравнение, за исключением ложных значений

Я посмотрел некоторое время, но, к моему удивлению, не нашел ответа конкретно на это.

Я хотел бы проверить, изменились ли значения в нашем инструменте набора данных. Для этого я хотел бы использовать свободное сравнение, чтобы эквивалентные числа, преобразованные в строку (просто пример), не были обнаружены измененными:

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)

Есть ли эффективный способ сделать это, не перечисляя все случаи вручную?

Ну, я думаю, вам не повезло, и вам нужно что-то закодировать, чтобы сделать проверки для вас. Почему бы вам не преобразовать его в строки или числа для начала и не полагаться на сравнение, чтобы изменить его.

epascarello 11.02.2019 15:44

это делает другой составитель, который я бы предпочел пока не рассматривать из-за его сложности, это для временного исправления

Kaddath 11.02.2019 15:45
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
2
55
2

Ответы 2

вы можете использовать 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) != '' является ложным:/

Kaddath 11.02.2019 15:55

как насчет проверки типа? используя !== вместо != (обновленный ответ)

Taki 11.02.2019 15:59

это идея, я проверю это, спасибо за ответ

Kaddath 11.02.2019 16:02

к сожалению, это не проходит в другом порядке: parseInt('0') !== 0 ложно, но parseInt(0) !== '0' верно ... но я не был достаточно исчерпывающим в своих примерах, так что это не ваша вина, еще раз спасибо, добавил решение, которое мне подходит

Kaddath 12.02.2019 16:04

о боже, нужно просмотреть мои вещи, они с треском проваливаются для того же случая, что и ваш :D

Kaddath 12.02.2019 16:17

После некоторых тестов (многие провалились, потому что 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);

Другие вопросы по теме