Ответ 1
Часть Python
SO, у вас есть два разных экземпляра (скажем) строки "Боб" и заставить их не возвращать истину при сравнении с использованием "есть"? Или это инфакт так же, как ===?
a = "Bob"
b = "{}".format("Bob")
print a, b
print a is b, a == b
Выход
Bob Bob
False True
Примечание. В большинстве реализаций Python время компиляции Строки интернированы.
Другой пример:
print 3 is 2+1
print 300 is 200+100
Выход
True
False
Это связано с тем, что небольшие ints (от -5 до 256) в Python кэшируются внутри. Таким образом, всякий раз, когда они используются в программах, используются кешированные целые числа. Итак, is
вернет True
для них. Но если мы выберем большее число, как во втором примере (300 is 200+100
), это не правда, потому что они НЕ кэшированы.
Вывод:
is
возвращает True
только тогда, когда сравниваемые объекты являются одним и тем же объектом, что означает, что они указывают на то же место в памяти. (Это зависит исключительно от реализации python к кеш-объектам/интерполяторам. В этом случае is
вернет True
)
Правило большого пальца:
НИКОГДА не используйте оператор is
, чтобы проверить, имеют ли два объекта одинаковое значение.
Часть JavaScript
Другая часть вашего вопроса касается оператора ===. Посмотрим, как работает этот оператор.
Цитата из спецификаций ECMA 5.1, Алгоритм сравнения строгого равенства определяется следующим образом
- Если Type (x) отличается от Type (y), верните false.
- Если тип (x) равен Undefined, верните true.
- Если Type (x) - Null, верните true.
- Если Type (x) - Number, то
- Если x является NaN, верните false.
- Если y является NaN, верните false.
- Если x - это то же значение числа, что и y, верните true.
- Если x равно +0 и y равно -0, верните true.
- Если x равно -0 и y равно +0, верните true.
- Возвращает false.
- Если Type (x) - String, тогда верните true, если x и y - это точно такая же последовательность символов (одинаковая длина и одинаковые символы в соответствующие должности); в противном случае верните false.
- Если тип (x) является логическим, верните true, если x и y оба true или оба ложный; в противном случае верните false.
- Возвращает true, если x и y относятся к одному и тому же объекту. В противном случае верните ложь.
Заключительное заключение
Мы можем НЕ сравнивать оператор Python is
и JavaScript ===
, потому что оператор Python is
выполняет только последний элемент в алгоритме сравнения строгого равенства.
7. Return true if x and y refer to the same object. Otherwise, return false.