В JavaScript, <международное значение> == “<международное значение>” оценивает к истинному. Почему это так?

Для первой ошибки: метод isoformat от datetime, это метод datetime.

Вы должны:

import datetime datetime.datetime.isoformat

Или:

from datetime import datetime as datet datet.isoformat

Что касается второй ошибки: df - словарь, i думаю, вы должны назвать это:

 df['join_key'] = df['allah1__27'].map(int).....
11
задан Real Red. 20 March 2009 в 03:34
поделиться

7 ответов

Поведение == немного долго, но ясно определенное в ecma-262 спецификации:

11.9.3 Абстрактный алгоритм сравнения равенства

Сравнение x == y, где X и Y являются значениями, производит TRUE или FALSE. Такое сравнение выполняется следующим образом:

  1. Если Тип (x) отличается от Типа (y), перейдите к шагу 14.
  2. Если Тип (x) Не определен, возвратите true.
  3. Если Тип (x) является Пустым, возвратите true.
  4. Если Типом (x) не является Число, перейдите к шагу 11.
  5. Если x является NaN, возвратите false.
  6. Если y является NaN, возвратите false.
  7. Если x является тем же числовым значением как y, возвратите true.
  8. Если x +0, и y является −0, возвратите true.
  9. Если x является −0, и y +0, возвратите true.
  10. Возвратите false.
  11. Если Тип (x) является Строкой, то возвратите true, если X и Y являются точно той же последовательностью символов (та же длина и те же символы в соответствующих положениях). Иначе возвратите false.
  12. Если Тип (x) является булевской переменной, возвратите true, если X и Y оба верны или обе лжи. Иначе возвратите false.
  13. Возвратите true, если X и Y относятся к тому же объекту или если они обращаются к объектам, соединенным друг с другом (см. 13.1.2). Иначе возвратите false.
  14. Если x является пустым, и y не определен, возвратите true.
  15. Если x не определен, и y является пустым, возвратите true.
  16. Если Типом (x) является Число, и Тип (y) является Строкой, возвратите результат сравнения x == ToNumber (y).
  17. Если Тип (x) является Строкой, и Типом (y) является Число, возвратите результат сравнения ToNumber (x) == y.
  18. Если Тип (x) является булевской переменной, возвратите результат сравнения ToNumber (x) == y.
  19. Если Тип (y) является булевской переменной, возвратите результат сравнения x == ToNumber (y).
  20. Если Тип (x) является или Строкой или Числом, и Тип (y) является Объектом, возвратите результат сравнения x == ToPrimitive (y).
  21. Если Тип (x) является Объектом, и Тип (y) является или Строкой или Числом, возвратите результат сравнения ToPrimitive (x) == y.
  22. Возвратите false.

Шаг 16 относится к Вашему прежнему примеру:

   0 == "0"            // apply 16
≡  0 == toNumber("0")
≡  0 == 0              // apply 7
≡  true

И шаг 18, затем шаг 16, относится к последнему:

   true == "true"            // apply 18
≡  toNumber(true) == "true"
≡  1 == "true"               // apply 16
≡  1 == toNumber("true")
≡  1 == NaN                  // apply 6
≡  false
33
ответ дан 3 December 2019 в 00:49
поделиться

Выполнение этого:

if(5 == "5")

Заставляет JavaScript преобразовать первые 5 в строку. Попробуйте это:

if(5 === "5")

=== заставляет JavaScript оценить тип также.

Это - на самом деле дубликат этого question где это объяснено очень хорошо.

11
ответ дан 3 December 2019 в 00:49
поделиться

JavaScript не бросает "ложь" к булевой лжи, только к строке "ложь".

Можно свободно бросить строковые значения к их целочисленному эквиваленту, таким образом первые работы в качестве примера.

1
ответ дан 3 December 2019 в 00:49
поделиться

Поскольку JavaScript свободно вводится, он тихо бросит Ваши переменные в зависимости от операции и типа других переменных в операции.

alert ("5" - 1);  // 4  (int)
alert ("5" + 1);  // "51" (string) "+" is a string operator, too
alert ("5" == 5); // true

То, на что Вы могли бы хотеть посмотреть, является проверкой идентификационных данных (===). Это удостоверяется, что переменные идентичны, не просто равны.

alert("5" == 5);  // true, these are equal
alert("5" === 5); // false, these are not identical.

Также посмотрите этот вопрос: Как делают операторы сравнения равенства и идентификационных данных отличаются? Реализация PHP очень похожа на JavaScript.

7
ответ дан 3 December 2019 в 00:49
поделиться

JavaScript имеет два набора операторов равенства:

  • === and !== (операторы строгого равенства)
  • == and != (стандартные операторы равенства)

Стандартные операторы равенства сделают правильное сравнение, если оба операнда будут тем же типом, но можно получить некоторые неожиданные результаты, если они не тот же тип, например:

'' == '0' // false
0 == '' // true
0 == '0' // true
false == 'false' // false
false == '0' // true
false == undefined // false
false == null // false
null == undefined // true
' \t\r\n ' == 0 // true

Для этого я всегда рекомендую использовать операторы строгого равенства (===! ==).

4
ответ дан 3 December 2019 в 00:49
поделиться

JavaScript является свободно типизированным языком, таким образом, преобразования типа сделаны во времени выполнения каждый раз, когда интерпретатор чувствует, что это необходимо. При сравнении целого числа со строкой это полагает, что они должны быть тем же типом, таким образом, например, "34" == 34 верно, так как целое число было бы, вероятно, преобразовано тип к строке перед сравнением.

Строка "ложь" не преобразована тип в bool, вместо этого bool ложь преобразована тип к строке, которая на самом деле имела бы значение "0", то есть, строка, содержащая номер 0, давая "0" == "ложь", которая является, очевидно, ложью.

Если Вы хотите сравнить значение без автоматического преобразования типа, эффективно сравнивая типы, а также значения, используйте тройное равное:

5 = == "5" ложь "представляют === в виде строки" верная "строка"

1
ответ дан 3 December 2019 в 00:49
поделиться

Почему это так?

Поскольку JavaScript и свободно вводится и дико непоследовательный. Не все его конструктивные особенности хорошо продуманы; это было создано, реализовано и развернулось невероятно быстро по сравнению с любым другим языком программирования в стремлении вывести Netscape 2.0. Только когда после то, это успокоилось, потеряло некоторые более вопиющие ошибки и стало полустандартизированным.

Поиск некоторого философского объяснения для вещей как неявные правила преобразования типа, вероятно, будет бесплодным осуществлением. Единственный действительно последовательный принцип, которого придерживается JavaScript, является DWIM, очень в отрицательном смысле.

1
ответ дан 3 December 2019 в 00:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: