Равномерность равенства Javascript равно, но что больше, чем и меньше?
Я объяснял коллеге, что вы должны использовать ===
и !==
(и >==
и <==
, конечно) при сравнении переменных в JavaScript, чтобы он не принуждал аргументы и не делал все зависание и запутались, но они задали мне вопрос из двух частей, на который я не знал ответа, и подумал, что я попрошу экспертов здесь, а именно:
Как насчет >
и <
- когда они сравнивают, они также принуждают аргументы или нет - почему нет какого-то оператора >>
и <<
(вероятно, должен быть какой-то другой синтаксис как Я бы предположил, что они будут операциями смены битов, если они идут по всему стилю C, но вы получаете суть)?
Поэтому я могу написать тест, чтобы найти ответ на первую часть, что я и сделал, вот он:
// Demo the difference between == and ===
alert(5 == "5");
alert(5 === "5");
// Check out what happens with >
alert(5 > "4");
alert(5 > 4);
и он вернул:
true
false
true
true
поэтому он выглядит так, как >
делает принуждение, так как > "4"
и > 4
возвращают тот же результат. так как насчет второй части...
Есть ли какой-то оператор для >
и <
, которые не принуждают тип (или как я могу изменить свой тест для безопасного тестирования)?
Ответы
Ответ 1
Нет, нет необходимости в таких операторах. Проверка типов, выполняемая для этих реляционных операторов, отличается от проверки равенства и неравенства. (edit — возможно, это немного сильное, чтобы сказать, что там "нет необходимости", это верно только потому, что JavaScript считает это так: -)
В частности, операторы >
и <
и >=
и <=
работают либо на двух числовых значениях, либо на двух строках, предпочитая числовые значения. То есть, если одно значение является числом, то другое рассматривается как число. Если нечетное число не может быть чисто преобразовано в число (то есть, если оно заканчивается как NaN
), то результатом сравнения является undefined
. (Это немного проблематично, потому что undefined
будет выглядеть как false
в контексте оператора if
.)
Если оба значения являются строками, вместо этого выполняется сравнение строк сортировки.
Если вы думаете об этом, эти сравнения не имеют никакого смысла для экземпляров объектов; что означает, что объект "больше" другого? Полагаю, возможно, что это означает, что если вы обнаружите, что ценности сравниваемых типов сравниваются таким образом и что вызывают проблемы, то да, вы должны сами определить ситуацию. Мне кажется, что было бы хорошо работать вверх по течению и думать о том, есть ли что-то подозрительное в коде, ведущем к такой ситуации.
Ответ 2
Существует ли какой-то оператор для > и < которые не принуждают тип
Нет.
как я могу изменить свой тест для безопасного тестирования
Вам нужно будет явно протестировать типы:
typeof a === typeof b && a > b
Ответ 3
Я ссылался на Flanagan JavaScript: The Definitive Guide (5-е изд.) и, похоже, не являются операторами, не связанными с принуждением.
Вы правы, говоря, что < и → действительно являются побитовыми операторами, так что это не сработает.
Я бы посоветовал вам преднамеренно принуждать себя:
var num_as_string = '4';
var num = +num_as_string;
if (5 > num) { ... }
Ответ 4
12 > '100' // false
'12' > 100 // false
'12' > '100' // true
Как упоминалось выше, если один из чисел, то другой передается на число. То же правило применяется и к этим случаям:
null > 0 // false
null < 0 // false
null >= 0 // true
Однако могут быть случаи, когда вам понадобится null >= 0
, чтобы дать false
(или любой из приведенных выше примеров сравнения строк), поэтому действительно необходимо иметь строгое сравнение >==
или <==
,
Например, я пишу compareFunction
для Array.prototype.sort()
, а выражение типа x>=0
будет относиться к значениям null
как 0 и складывать их вместе, тогда как я хочу поместить их в другое место. Я должен написать дополнительную логику для этих случаев.
Javascript говорит об этом самостоятельно (на практике).