Python'是'vs JavaScript ===

时间:2014-02-14 08:48:47

标签: javascript python

Python使用'is'似乎与JavaScript'==='类似但不完全相似。

他们在这里讨论确切的实例: http://www.learnpython.org/en/Conditions

这里(对于JS)他们谈论“相同和相同的类型”。 http://www.w3schools.com/js/js_comparisons.asp

你可以有两个不同的(例如)一串“Bob”的实例,当使用'is'进行比较时,它们不会返回true吗?或者它与===相同?

我猜这与严格与非严格类型的语言有关。 。 。

4 个答案:

答案 0 :(得分:14)

Python部分

  

你可以有两个不同的实例(比方说)一串“鲍勃”和   使用'is'比较时他们不会返回true?或者是事实   与===?

相同
a = "Bob"
b = "{}".format("Bob")
print a, b
print a is b, a == b

<强>输出

Bob Bob
False True

注意:在大多数Python实现中,compile time Strings are interned

另一个例子,

print 3 is 2+1
print 300 is 200+100

<强>输出

True
False

这是因为Python中的小整数(-5到256)在内部缓存。因此,无论何时在程序中使用它们,都会使用缓存的整数。因此,is将为其返回True。但是如果我们选择更大的数字,就像在第二个例子中那样,(300 is 200+100)它不是真的,因为它们不是缓存的。

<强>结论:

仅当被比较的对象是同一个对象时,

is才会返回True,这意味着它们指向内存中的相同位置。 (它完全取决于缓存/实习对象的python实现。在这种情况下,is将返回True

经验法则

绝对不要使用is运算符来检查两个对象是否具有相同的值。


JavaScript部分

你问题的其他部分是关于===运算符。让我们看看该运算符的工作原理。

引用ECMA 5.1规范,The Strict Equality Comparison Algorithm定义如下

  
      
  1. 如果Type(x)与Type(y)不同,则返回false。
  2.   
  3. 如果Type(x)为Undefined,则返回true。
  4.   
  5. 如果Type(x)为Null,则返回true。
  6.   
  7. 如果Type(x)是Number,那么      
        
    1. 如果x为NaN,则返回false。
    2.   
    3. 如果y为NaN,则返回false。
    4.   
    5. 如果x与y的数字值相同,则返回true。
    6.   
    7. 如果x为+0且y为-0,则返回true。
    8.   
    9. 如果x为-0且y为+0,则返回true。
    10.   
    11. 返回false。
    12.   
  8.   
  9. 如果Type(x)是String,则如果x和y恰好是,则返回true   相同的字符序列(相同的长度和相同的字符)   相应的职位);否则,返回false。
  10.   
  11. 如果Type(x)是布尔值,如果x和y都为true或两者都返回true   假;否则,返回false。
  12.   
  13. 如果x和y引用同一个对象,则返回true。否则,返回   假的。
  14.   

最终结论

我们可以比较Python的is运算符和JavaScript的===运算符,因为Python的is运算符只执行Strict Equality Comparison算法中的最后一项。

7. Return true if x and y refer to the same object. Otherwise, return false.

答案 1 :(得分:5)

完全不同。

>>> a = 'foo'
>>> b = 'bar'
>>> a + b is 'foobar'
False
>>> 1000 + 1 is 1001
False

答案 2 :(得分:4)

Python的is关键字比较引用(因此是关于身份)而=== does a minimal amount of coercion(因此关注相等性,至少在基元的情况下),因此它们是不同的。

据我了解,与身份有关的事情与运行时的独特性有关(这两个变量指向内存中的相同地址),而等式与内容的唯一性有关变量(这两个变量是等价的,无论它们相对于彼此放在内存中的哪个位置)。

答案 3 :(得分:3)

>>> a = "Hello, World!!!"
>>> b = "Hello, World!!!"
>>> a is b
False

但请注意:

>>> a = "Bob"
>>> b = "Bob"
>>> a is b
True

在这种情况下,条件为True,因为编译器可以自由地使用实体字符串文字,因此可以重用相同的对象,并且它可以使用小字符串。但是,如果发生这种情况并且版本和实现之间的行为发生变化,则无法保证何时发生这种情况。


可靠的False输出应为:

>>> a = 'Hello, World!!!!'[:-1]
>>> b = 'Hello, World!!!!'[:-1]
>>> a is b
False

或任何实际计算字符串的内容。