Mercurial > js4py
annotate core-javascript/equality.rst @ 213:0ea90a1819c2 default tip
Custom theming
| author | Radomir Dopieralski <radomir.dopieralski@allegro.pl> |
|---|---|
| date | Wed, 27 Jun 2012 16:35:54 +0200 |
| parents | a808230bc5dd |
| children |
| rev | line source |
|---|---|
| 100 | 1 Equality |
| 2 ======== | |
| 103 | 3 |
| 4 Equality in JavaScript can be a little odd. | |
| 5 | |
| 6 | |
| 7 Double equals | |
| 8 ------------- | |
| 9 | |
| 10 JavScript has two operations for equality (and inequality). One of | |
| 11 them is '==' (and '!=' for inequality). It's the oddest. | |
| 12 | |
| 13 | |
| 14 Not transitive | |
| 15 ^^^^^^^^^^^^^^ | |
| 16 | |
| 17 If *a* is equal to *b*, and if *b* is equal to *c* , then we expect | |
| 18 *a* to be equal to *c*. This is called the transitive property. | |
| 19 | |
| 20 | |
| 21 .. code-block:: javascript | |
| 22 | |
| 23 | |
| 24 js> '0' == 0 // 'a' is equal to 'b' | |
| 25 true | |
| 26 js> 0 == '' // 'b' is equal to 'c' | |
| 27 true | |
| 28 js> '0' == '' // 'a' is not equal to 'c' | |
| 29 false | |
| 30 | |
| 31 | |
| 32 | |
| 33 Not reflexive | |
| 34 ^^^^^^^^^^^^^ | |
| 35 | |
| 36 We expect *a* to be equal to *a*. This is called the reflexive | |
| 37 property. | |
| 38 | |
| 39 .. code-block:: javascript | |
| 40 | |
| 41 js> NaN == NaN | |
| 42 false | |
| 43 | |
| 44 Fortunately, this seems to be the only example. | |
| 45 | |
| 46 | |
| 47 Is symmetric | |
| 48 ^^^^^^^^^^^^ | |
| 49 | |
| 50 If *a* is equal to *b* then we expect *b* to be equal to *a*. This is | |
| 51 called the symmetric property. In JavaScript equality is symmetric. | |
| 52 | |
| 53 | |
| 54 | |
| 55 Triple equality | |
| 56 --------------- | |
| 57 | |
|
205
a808230bc5dd
Remove outdated facebook reference (404 error on the link)
Radomir Dopieralski <radomir.dopieralski@allegro.pl>
parents:
204
diff
changeset
|
58 JavaScript also has ``===`` (and ``!==`` for inequality). |
| 103 | 59 |
| 60 | |
| 61 Is transitive | |
| 62 ^^^^^^^^^^^^^ | |
| 63 | |
| 64 Unlike double equals, triple equals is always transitive. | |
| 65 | |
| 66 .. code-block:: javascript | |
| 67 | |
| 68 js> '0' === 0 // unequal | |
| 69 false | |
| 70 js> 0 === '' // unequal | |
| 71 false | |
| 72 js> '0' === '' // unequal | |
| 73 false | |
| 74 | |
| 75 | |
| 76 Not reflexive | |
| 77 ^^^^^^^^^^^^^ | |
| 78 | |
| 79 .. code-block:: javascript | |
| 80 | |
| 81 js> NaN === NaN | |
| 82 false | |
| 83 | |
| 84 | |
| 85 Is symmetric | |
|
130
ff23e32bbe29
Sort out table of contents, and various minor changes.
jf3243
parents:
103
diff
changeset
|
86 ^^^^^^^^^^^^ |
| 103 | 87 |
| 88 Triple equality is still symmetric. | |
| 89 | |
| 90 | |
| 91 Don't use double equality | |
| 92 ------------------------- | |
| 93 | |
| 94 Double equality does implicit conversions and besides has some odd | |
| 95 rules. My advice is **don't use double equality**. | |
| 96 | |
| 97 Triple equality does not do conversions. If you want to do | |
| 98 conversions in your comparision my advice is to make them explicit. | |
| 99 | |
| 100 | |
| 101 Compare as string | |
| 102 ----------------- | |
| 103 | |
| 104 The easiest conversion is to string. Here are two immutables, a | |
| 105 number and a string. | |
| 106 | |
| 107 .. code-block:: javascript | |
| 108 | |
| 109 js> a = 0 | |
| 110 0 | |
| 111 js> b = '0' | |
| 112 0 | |
| 113 | |
| 114 | |
| 115 These quantities are double equal but not triple equal. | |
| 116 | |
| 117 .. code-block:: javascript | |
| 118 | |
| 119 js> a == b | |
| 120 true | |
| 121 js> a === b | |
| 122 false | |
| 123 | |
| 124 Here's how to do an explicit conversion to string before comparison, | |
| 125 which gives an equality. | |
| 126 | |
| 127 .. code-block:: javascript | |
| 128 | |
| 129 js> '' + a === '' + b // Converts variables to strings. | |
| 130 true | |
| 131 | |
| 132 .. note:: | |
| 133 | |
| 134 It's always easier to read a triple equal comparison, because | |
| 135 you're not distracted by the complex double equal rules. | |
| 136 | |
| 137 | |
| 138 Compare as number | |
| 139 ----------------- | |
| 140 | |
|
199
25a718801405
Add "Compare as number" and "Compare as boolean"
Radomir Dopieralski <radomir.dopieralski@allegro.pl>
parents:
130
diff
changeset
|
141 There is a way to make sure that a value is a number in JavaScript: |
|
25a718801405
Add "Compare as number" and "Compare as boolean"
Radomir Dopieralski <radomir.dopieralski@allegro.pl>
parents:
130
diff
changeset
|
142 use the unary plus operator: |
|
25a718801405
Add "Compare as number" and "Compare as boolean"
Radomir Dopieralski <radomir.dopieralski@allegro.pl>
parents:
130
diff
changeset
|
143 |
|
25a718801405
Add "Compare as number" and "Compare as boolean"
Radomir Dopieralski <radomir.dopieralski@allegro.pl>
parents:
130
diff
changeset
|
144 .. code-block:: javascript |
|
200
6ea48585f70c
Add the missing empty lines for code blocks
Radomir Dopieralski <radomir.dopieralski@allegro.pl>
parents:
199
diff
changeset
|
145 |
|
199
25a718801405
Add "Compare as number" and "Compare as boolean"
Radomir Dopieralski <radomir.dopieralski@allegro.pl>
parents:
130
diff
changeset
|
146 js> +a === +b |
|
25a718801405
Add "Compare as number" and "Compare as boolean"
Radomir Dopieralski <radomir.dopieralski@allegro.pl>
parents:
130
diff
changeset
|
147 true |
|
25a718801405
Add "Compare as number" and "Compare as boolean"
Radomir Dopieralski <radomir.dopieralski@allegro.pl>
parents:
130
diff
changeset
|
148 |
|
204
45e7d5e8fa97
Use double backticks for inline code
Radomir Dopieralski <radomir.dopieralski@allegro.pl>
parents:
200
diff
changeset
|
149 When the value cannot be converted to a number, you will get a ``NaN`` value. |
|
199
25a718801405
Add "Compare as number" and "Compare as boolean"
Radomir Dopieralski <radomir.dopieralski@allegro.pl>
parents:
130
diff
changeset
|
150 `NaN` is never equal to anything, even to itself. |
|
25a718801405
Add "Compare as number" and "Compare as boolean"
Radomir Dopieralski <radomir.dopieralski@allegro.pl>
parents:
130
diff
changeset
|
151 |
|
204
45e7d5e8fa97
Use double backticks for inline code
Radomir Dopieralski <radomir.dopieralski@allegro.pl>
parents:
200
diff
changeset
|
152 Alternatively, you can use the ``parseInt`` and ``parseFloat`` functions to convert |
|
199
25a718801405
Add "Compare as number" and "Compare as boolean"
Radomir Dopieralski <radomir.dopieralski@allegro.pl>
parents:
130
diff
changeset
|
153 strings to number -- their behavior is slightly different, as they will silently |
|
25a718801405
Add "Compare as number" and "Compare as boolean"
Radomir Dopieralski <radomir.dopieralski@allegro.pl>
parents:
130
diff
changeset
|
154 ignore all non-number characters in the string. |
|
25a718801405
Add "Compare as number" and "Compare as boolean"
Radomir Dopieralski <radomir.dopieralski@allegro.pl>
parents:
130
diff
changeset
|
155 |
|
25a718801405
Add "Compare as number" and "Compare as boolean"
Radomir Dopieralski <radomir.dopieralski@allegro.pl>
parents:
130
diff
changeset
|
156 .. code-block:: javascript |
|
200
6ea48585f70c
Add the missing empty lines for code blocks
Radomir Dopieralski <radomir.dopieralski@allegro.pl>
parents:
199
diff
changeset
|
157 |
|
199
25a718801405
Add "Compare as number" and "Compare as boolean"
Radomir Dopieralski <radomir.dopieralski@allegro.pl>
parents:
130
diff
changeset
|
158 js> parseInt('3abc1') |
|
25a718801405
Add "Compare as number" and "Compare as boolean"
Radomir Dopieralski <radomir.dopieralski@allegro.pl>
parents:
130
diff
changeset
|
159 3 |
|
25a718801405
Add "Compare as number" and "Compare as boolean"
Radomir Dopieralski <radomir.dopieralski@allegro.pl>
parents:
130
diff
changeset
|
160 js> +'3abc1' |
|
25a718801405
Add "Compare as number" and "Compare as boolean"
Radomir Dopieralski <radomir.dopieralski@allegro.pl>
parents:
130
diff
changeset
|
161 NaN |
|
25a718801405
Add "Compare as number" and "Compare as boolean"
Radomir Dopieralski <radomir.dopieralski@allegro.pl>
parents:
130
diff
changeset
|
162 |
|
204
45e7d5e8fa97
Use double backticks for inline code
Radomir Dopieralski <radomir.dopieralski@allegro.pl>
parents:
200
diff
changeset
|
163 Because ``NaN`` is never equal to anything, even itself, you cannot check whether |
|
45e7d5e8fa97
Use double backticks for inline code
Radomir Dopieralski <radomir.dopieralski@allegro.pl>
parents:
200
diff
changeset
|
164 you got ``NaN`` as a result with ``==`` or ``===``. You have to use the ``isNaN`` |
|
45e7d5e8fa97
Use double backticks for inline code
Radomir Dopieralski <radomir.dopieralski@allegro.pl>
parents:
200
diff
changeset
|
165 function for that. |
|
199
25a718801405
Add "Compare as number" and "Compare as boolean"
Radomir Dopieralski <radomir.dopieralski@allegro.pl>
parents:
130
diff
changeset
|
166 |
|
25a718801405
Add "Compare as number" and "Compare as boolean"
Radomir Dopieralski <radomir.dopieralski@allegro.pl>
parents:
130
diff
changeset
|
167 Compare as boolean |
|
25a718801405
Add "Compare as number" and "Compare as boolean"
Radomir Dopieralski <radomir.dopieralski@allegro.pl>
parents:
130
diff
changeset
|
168 ------------------ |
|
25a718801405
Add "Compare as number" and "Compare as boolean"
Radomir Dopieralski <radomir.dopieralski@allegro.pl>
parents:
130
diff
changeset
|
169 |
|
25a718801405
Add "Compare as number" and "Compare as boolean"
Radomir Dopieralski <radomir.dopieralski@allegro.pl>
parents:
130
diff
changeset
|
170 To convert an expression to a boolean value, it's most convenient to use the |
|
204
45e7d5e8fa97
Use double backticks for inline code
Radomir Dopieralski <radomir.dopieralski@allegro.pl>
parents:
200
diff
changeset
|
171 ``!`` boolean negation operator twice, like this: |
|
199
25a718801405
Add "Compare as number" and "Compare as boolean"
Radomir Dopieralski <radomir.dopieralski@allegro.pl>
parents:
130
diff
changeset
|
172 |
|
25a718801405
Add "Compare as number" and "Compare as boolean"
Radomir Dopieralski <radomir.dopieralski@allegro.pl>
parents:
130
diff
changeset
|
173 .. code-block:: javascript |
|
200
6ea48585f70c
Add the missing empty lines for code blocks
Radomir Dopieralski <radomir.dopieralski@allegro.pl>
parents:
199
diff
changeset
|
174 |
|
199
25a718801405
Add "Compare as number" and "Compare as boolean"
Radomir Dopieralski <radomir.dopieralski@allegro.pl>
parents:
130
diff
changeset
|
175 js> !!0 === !!'' |
|
25a718801405
Add "Compare as number" and "Compare as boolean"
Radomir Dopieralski <radomir.dopieralski@allegro.pl>
parents:
130
diff
changeset
|
176 true |
