aboutsummaryrefslogtreecommitdiff
path: root/files/pt-br/web/javascript/guide/igualdade/index.html
blob: 57f1c2fdccbf64c7d3cf7c6eb7f2c355bd6e8e83 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
---
title: Igualdade em JavaScript
slug: Web/JavaScript/Guide/Igualdade
translation_of: Web/JavaScript/Equality_comparisons_and_sameness
translation_of_original: Web/JavaScript/Guide/Sameness
---
<p>A ES6 possui três facilidades internas para determinar se algum <var>x</var> e algum <var>y</var> são "os mesmos". Elas são: igualdade ou "igual duplo" (<a href="/en-US/docs/Web/JavaScript/Reference/Operators/Comparison_Operators" title="/en-US/docs/Web/JavaScript/Reference/Operators/Comparison_Operators"><code>==</code></a>), igualdade rigorosa ou "igual triplo" (<a href="/en-US/docs/Web/JavaScript/Reference/Operators/Comparison_Operators" title="/en-US/docs/Web/JavaScript/Reference/Operators/Comparison_Operators"><code>===</code></a>), e <a href="/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is" title="/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is"><code>Object.is</code></a>. (Note que <a href="/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is" title="/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is"><code>Object.is</code></a> foi adicionado na ES6. Ambos igual duplo e igual triplo existiam antes da ES6, e seu comportamento permanece o mesmo.)</p>
<h2 id="Visão_geral">Visão geral</h2>
<p>Para demonstração, aqui estão as três comparações de igualdade em uso:</p>
<pre class="brush:js">x == y</pre>
<pre class="brush:js">x === y</pre>
<pre class="brush:js">Object.is(x, y)</pre>
<p>De modo breve, o operador igual duplo irá realizar uma conversão de tipo na hora de  comparar duas coisas; o operador igual triplo fará a mesma comparação sem conversão de tipo (simplesmente sempre retornando <code>false</code> se os tipos forem diferentes); e <a href="/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is" title="/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is"><code>Object.is</code></a> se comportará da mesma forma que o operador igual triplo, mas lidando de forma especial com <a href="/en-US/docs/Web/JavaScript/Reference/Global_Objects/NaN" title="/en-US/docs/Web/JavaScript/Reference/Global_Objects/NaN"><code>NaN</code></a> e <code>-0</code> e <code>+0</code> de modo que os dois últimos não são considerados os mesmos, enquanto que <code>Object.is(NaN, NaN)</code> será <code>true</code>. (Comparar <a href="/en-US/docs/Web/JavaScript/Reference/Global_Objects/NaN" title="/en-US/docs/Web/JavaScript/Reference/Global_Objects/NaN"><code>NaN</code></a> com <a href="/en-US/docs/Web/JavaScript/Reference/Global_Objects/NaN" title="/en-US/docs/Web/JavaScript/Reference/Global_Objects/NaN"><code>NaN</code></a> geralmente—i.e., usando-se o operador igual duplo ou o operador igual triplo—resulta em <code>false</code>, de acordo com a IEEE 754.)</p>
<p>Note que a distinção entre todas essas formas de comparação tem a ver com a forma com que lidam com primitivos; nenhuma delas compara se os parâmetros são conceitualmente similares em estrutura. Para quaisquer objetos não-primitivos <var>x</var> e <var>y</var> que têm a mesma estrutura mas que são objetos distintos, todas as formas de comparação acima resultarão no valor <code>false</code>.</p>
<p>Por exemplo:</p>
<pre class="brush:js">let x = { value: 17 };
let y = { value: 17 };
console.log(Object.is(x, y)); // false;
console.log(x === y);         // false
console.log(x == y);          // false</pre>
<h2 id="Igualdade_abstrata_igualdade_rigorosa_e_mesmo_valor">Igualdade abstrata, igualdade rigorosa, e mesmo valor</h2>
<p>Na ES5, a comparação realizada por <a href="/en-US/docs/Web/JavaScript/Reference/Operators/Comparison_Operators" title="/en-US/docs/Web/JavaScript/Reference/Operators/Comparison_Operators"><code>==</code></a> é descrita na <a href="http://ecma-international.org/ecma-262/5.1/#sec-11.9.3" title="http://ecma-international.org/ecma-262/5.1/#sec-11.9.3">Seção 11.9.3, O Algoritmo de Igualdade Abstrata</a>. A comparação <a href="/en-US/docs/Web/JavaScript/Reference/Operators/Comparison_Operators" title="/en-US/docs/Web/JavaScript/Reference/Operators/Comparison_Operators"><code>===</code></a> é descrita em <a href="http://ecma-international.org/ecma-262/5.1/#sec-11.9.6" title="http://ecma-international.org/ecma-262/5.1/#sec-11.9.6">11.9.6, O Algoritmo de Igualdade Rigorosa</a>. (Dê uma olhada nestes. Eles são rápidos e legíveis. Dica: leia o algoritmo de igualdade rigorosa primeiro.) A ES5 também descreve, na <a href="http://ecma-international.org/ecma-262/5.1/#sec-9.12" title="http://ecma-international.org/ecma-262/5.1/#sec-9.12">Seção 9.12, O Algoritmo de MesmoValor</a> para ser usado internamente pelo engine JS. Ele é em sua maioria similar ao Algoritmo de Igualdade Rigorosa, com exceção de que 11.9.6.4 e 9.12.4 diferem na forma de lidar com <a href="/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number" title="/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number"><code>Number</code></a>s (números). A ES6 simplesmente propõe expôr esse algoritmo através de <a href="/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is" title="/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is"><code>Object.is</code></a>.</p>
<p>Podemos ver que com os operadores igual duplo e igual triplo, com a exceção de fazer uma checagem de tipo de início em 11.9.6.1, o Algoritmo de Igualdade Rigorosa é um subconjunto do Algoritmo de Igualdade Abstrata, pois 11.9.6.2–7 corresponde a 11.9.3.1.a–f.</p>
<h2 id="Um_modelo_para_entender_comparações_de_igualdade">Um modelo para entender comparações de igualdade?</h2>
<p>Antes da ES6, você pode ter dito, a respeito dos operadores igual duplo e igual triplo, que um é uma versão "melhorada" do outro. Por exemplo, alguém poderia dizer que o operador igual duplo é uma versão extendidad do operador igual triplo, pois o primeiro faz tudo que o último faz, com conversão de tipo em seus operandos (por exemplo, de modo que <code>6 == "6"</code>). Alternativamente, alguém poderia dizer que o operador igual triplo é uma versão melhorada do operador igual duplo, pois requer que os dois operandos sejam do mesmo tipo. Qual é melhor depende de qual é a sua idéia de patamar.</p>
<p>No entanto, essa forma de pensar sobre os operados de igualdade internos não é um modelo que pode ser "esticado" para permitir um lugar para o <a href="/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is" title="/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is"><code>Object.is</code></a> da ES6 nesse "espectro". O <a href="/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is" title="/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is"><code>Object.is</code></a> não é simplesmente "menos restrito" do que o operador igual duplo ou "mais restrito" do que o operador igual triplo, nem cabe em algum lugar entre esses níveis (isto é, sendo mais restrito que o operador igual duplo, mas menos restrito que o operador igual triplo). Nós podemos ver da tabela de comparações de igualdade abaixo que isto é devido à forma com que <a href="/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is" title="/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is"><code>Object.is</code></a> lida com <a href="/en-US/docs/Web/JavaScript/Reference/Global_Objects/NaN" title="/en-US/docs/Web/JavaScript/Reference/Global_Objects/NaN"><code>NaN</code></a>. Perceba que se <code>Object.is(NaN, NaN)</code> resultasse no valor <code>false</code>, nós <em>poderíamos</em> dizer que ele cabe no espectro pouco restrito/restrito como uma forma ainda mais restrita do operador igual triplo, uma que faz distinção entre <code>-0</code> e <code>+0</code>. A forma de lidar com <a href="/en-US/docs/Web/JavaScript/Reference/Global_Objects/NaN" title="/en-US/docs/Web/JavaScript/Reference/Global_Objects/NaN"><code>NaN</code></a> significa que isso não é verdade, no entanto. Infelizmente, <a href="/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is" title="/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is"><code>Object.is</code></a> simplesmente deve ser considerado em termos de duas características específicas, ao invés de sua rigorosidade (ou falta da mesma) com respeito aos operadores de igualdade.</p>
<table class="standard-table">
  <caption>
    Comparações de Igualdade</caption>
  <thead>
    <tr>
      <th scope="col" style="text-align: center;">x</th>
      <th scope="col" style="text-align: center;">y</th>
      <th scope="col" style="width: 10em; text-align: center;"><code>==</code></th>
      <th scope="col" style="width: 10em; text-align: center;"><code>===</code></th>
      <th scope="col" style="width: 10em; text-align: center;"><code>Object.is</code></th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><code>undefined</code></td>
      <td><code>undefined</code></td>
      <td style="background-color: rgb(144, 255, 144); text-align: center;"><code>true</code></td>
      <td style="background-color: rgb(144, 255, 144); text-align: center;"><code>true</code></td>
      <td style="background-color: rgb(144, 255, 144); text-align: center;"><code>true</code></td>
    </tr>
    <tr>
      <td><code>null</code></td>
      <td><code>null</code></td>
      <td style="background-color: rgb(144, 255, 144); text-align: center;"><code>true</code></td>
      <td style="background-color: rgb(144, 255, 144); text-align: center;"><code>true</code></td>
      <td style="background-color: rgb(144, 255, 144); text-align: center;"><code>true</code></td>
    </tr>
    <tr>
      <td><code>true</code></td>
      <td><code>true</code></td>
      <td style="background-color: rgb(144, 255, 144); text-align: center;"><code>true</code></td>
      <td style="background-color: rgb(144, 255, 144); text-align: center;"><code>true</code></td>
      <td style="background-color: rgb(144, 255, 144); text-align: center;"><code>true</code></td>
    </tr>
    <tr>
      <td><code>false</code></td>
      <td><code>false</code></td>
      <td style="background-color: rgb(144, 255, 144); text-align: center;"><code>true</code></td>
      <td style="background-color: rgb(144, 255, 144); text-align: center;"><code>true</code></td>
      <td style="background-color: rgb(144, 255, 144); text-align: center;"><code>true</code></td>
    </tr>
    <tr>
      <td><code>"foo"</code></td>
      <td><code>"foo"</code></td>
      <td style="background-color: rgb(144, 255, 144); text-align: center;"><code>true</code></td>
      <td style="background-color: rgb(144, 255, 144); text-align: center;"><code>true</code></td>
      <td style="background-color: rgb(144, 255, 144); text-align: center;"><code>true</code></td>
    </tr>
    <tr>
      <td><code>{ foo: "bar" }</code></td>
      <td><code>x</code></td>
      <td style="background-color: rgb(144, 255, 144); text-align: center;"><code>true</code></td>
      <td style="background-color: rgb(144, 255, 144); text-align: center;"><code>true</code></td>
      <td style="background-color: rgb(144, 255, 144); text-align: center;"><code>true</code></td>
    </tr>
    <tr>
      <td><code>0</code></td>
      <td><code>0</code></td>
      <td style="background-color: rgb(144, 255, 144); text-align: center;"><code>true</code></td>
      <td style="background-color: rgb(144, 255, 144); text-align: center;"><code>true</code></td>
      <td style="background-color: rgb(144, 255, 144); text-align: center;"><code>true</code></td>
    </tr>
    <tr>
      <td><code>+0</code></td>
      <td><code>-0</code></td>
      <td style="background-color: rgb(144, 255, 144); text-align: center;"><code>true</code></td>
      <td style="background-color: rgb(144, 255, 144); text-align: center;"><code>true</code></td>
      <td style="background-color: rgb(255, 144, 144); text-align: center;"><code>false</code></td>
    </tr>
    <tr>
      <td><code>0</code></td>
      <td><code>false</code></td>
      <td style="background-color: rgb(144, 255, 144); text-align: center;"><code>true</code></td>
      <td style="background-color: rgb(255, 144, 144); text-align: center;"><code>false</code></td>
      <td style="background-color: rgb(255, 144, 144); text-align: center;"><code>false</code></td>
    </tr>
    <tr>
      <td><code>""</code></td>
      <td><code>false</code></td>
      <td style="background-color: rgb(144, 255, 144); text-align: center;"><code>true</code></td>
      <td style="background-color: rgb(255, 144, 144); text-align: center;"><code>false</code></td>
      <td style="background-color: rgb(255, 144, 144); text-align: center;"><code>false</code></td>
    </tr>
    <tr>
      <td><code>""</code></td>
      <td><code>0</code></td>
      <td style="background-color: rgb(144, 255, 144); text-align: center;"><code>true</code></td>
      <td style="background-color: rgb(255, 144, 144); text-align: center;"><code>false</code></td>
      <td style="background-color: rgb(255, 144, 144); text-align: center;"><code>false</code></td>
    </tr>
    <tr>
      <td><code>"0"</code></td>
      <td><code>0</code></td>
      <td style="background-color: rgb(144, 255, 144); text-align: center;"><code>true</code></td>
      <td style="background-color: rgb(255, 144, 144); text-align: center;"><code>false</code></td>
      <td style="background-color: rgb(255, 144, 144); text-align: center;"><code>false</code></td>
    </tr>
    <tr>
      <td><code>"17"</code></td>
      <td><code>17</code></td>
      <td style="background-color: rgb(144, 255, 144); text-align: center;"><code>true</code></td>
      <td style="background-color: rgb(255, 144, 144); text-align: center;"><code>false</code></td>
      <td style="background-color: rgb(255, 144, 144); text-align: center;"><code>false</code></td>
    </tr>
    <tr>
      <td><code>new String("foo")</code></td>
      <td><code>"foo"</code></td>
      <td style="background-color: rgb(144, 255, 144); text-align: center;"><code>true</code></td>
      <td style="background-color: rgb(255, 144, 144); text-align: center;"><code>false</code></td>
      <td style="background-color: rgb(255, 144, 144); text-align: center;"><code>false</code></td>
    </tr>
    <tr>
      <td><code>null</code></td>
      <td><code>undefined</code></td>
      <td style="background-color: rgb(144, 255, 144); text-align: center;"><code>true</code></td>
      <td style="background-color: rgb(255, 144, 144); text-align: center;"><code>false</code></td>
      <td style="background-color: rgb(255, 144, 144); text-align: center;"><code>false</code></td>
    </tr>
    <tr>
      <td><code>null</code></td>
      <td><code>false</code></td>
      <td style="background-color: rgb(255, 144, 144); text-align: center;"><code>false</code></td>
      <td style="background-color: rgb(255, 144, 144); text-align: center;"><code>false</code></td>
      <td style="background-color: rgb(255, 144, 144); text-align: center;"><code>false</code></td>
    </tr>
    <tr>
      <td><code>undefined</code></td>
      <td><code>false</code></td>
      <td style="background-color: rgb(255, 144, 144); text-align: center;"><code>false</code></td>
      <td style="background-color: rgb(255, 144, 144); text-align: center;"><code>false</code></td>
      <td style="background-color: rgb(255, 144, 144); text-align: center;"><code>false</code></td>
    </tr>
    <tr>
      <td><code>{ foo: "bar" }</code></td>
      <td><code>{ foo: "bar" }</code></td>
      <td style="background-color: rgb(255, 144, 144); text-align: center;"><code>false</code></td>
      <td style="background-color: rgb(255, 144, 144); text-align: center;"><code>false</code></td>
      <td style="background-color: rgb(255, 144, 144); text-align: center;"><code>false</code></td>
    </tr>
    <tr>
      <td><code>new String("foo")</code></td>
      <td><code>new String("foo")</code></td>
      <td style="background-color: rgb(255, 144, 144); text-align: center;"><code>false</code></td>
      <td style="background-color: rgb(255, 144, 144); text-align: center;"><code>false</code></td>
      <td style="background-color: rgb(255, 144, 144); text-align: center;"><code>false</code></td>
    </tr>
    <tr>
      <td><code>0</code></td>
      <td><code>null</code></td>
      <td style="background-color: rgb(255, 144, 144); text-align: center;"><code>false</code></td>
      <td style="background-color: rgb(255, 144, 144); text-align: center;"><code>false</code></td>
      <td style="background-color: rgb(255, 144, 144); text-align: center;"><code>false</code></td>
    </tr>
    <tr>
      <td><code>0</code></td>
      <td><code>NaN</code></td>
      <td style="background-color: rgb(255, 144, 144); text-align: center;"><code>false</code></td>
      <td style="background-color: rgb(255, 144, 144); text-align: center;"><code>false</code></td>
      <td style="background-color: rgb(255, 144, 144); text-align: center;"><code>false</code></td>
    </tr>
    <tr>
      <td><code>"foo"</code></td>
      <td><code>NaN</code></td>
      <td style="background-color: rgb(255, 144, 144); text-align: center;"><code>false</code></td>
      <td style="background-color: rgb(255, 144, 144); text-align: center;"><code>false</code></td>
      <td style="background-color: rgb(255, 144, 144); text-align: center;"><code>false</code></td>
    </tr>
    <tr>
      <td><code>NaN</code></td>
      <td><code>NaN</code></td>
      <td style="background-color: rgb(255, 144, 144); text-align: center;"><code>false</code></td>
      <td style="background-color: rgb(255, 144, 144); text-align: center;"><code>false</code></td>
      <td style="background-color: rgb(144, 255, 144); text-align: center;"><code>true</code></td>
    </tr>
  </tbody>
</table>
<h2 id="Quando_usar_Object.is_versus_o_operador_igual_triplo">Quando usar <a href="/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is" title="/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is"><code>Object.is</code></a> versus o operador igual triplo</h2>
<p>Além da forma com que trata o valor it <a href="/en-US/docs/Web/JavaScript/Reference/Global_Objects/NaN" title="/en-US/docs/Web/JavaScript/Reference/Global_Objects/NaN"><code>NaN</code></a>, de modo geral, o único caso em o comportamento especial de <a href="/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is" title="/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is"><code>Object.is</code></a> com a relação a zeros é capaz de ser de interesse é na busca de certos esquemas de metaprogramação, especialmente em relação a descritores de propriedade quando é desejável que seu trabalho espelhe algumas das características de <a href="/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty" title="/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty"><code>Object.defineProperty</code></a>. Se seu caso de uso não requer isso, sugere-se evitar-se <a href="/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is" title="/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is"><code>Object.is</code></a> e usar-se o operador <a href="/en-US/docs/Web/JavaScript/Reference/Operators/Comparison_Operators" title="/en-US/docs/Web/JavaScript/Reference/Operators/Comparison_Operators"><code>===</code></a> ao invés disso. Mesmo se seus requerimentos envolvem que comparações entre dois valores <a href="/en-US/docs/Web/JavaScript/Reference/Global_Objects/NaN" title="/en-US/docs/Web/JavaScript/Reference/Global_Objects/NaN"><code>NaN</code></a> resultem em <code>true</code>, de modo geral é mais fácil fazer-se uma checagem especial por <a href="/en-US/docs/Web/JavaScript/Reference/Global_Objects/NaN" title="/en-US/docs/Web/JavaScript/Reference/Global_Objects/NaN"><code>NaN</code></a>s (usando-se o método <a href="/en-US/docs/Web/JavaScript/Reference/Global_Objects/isNaN" title="/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/isNaN"><code>isNaN</code></a> disponíveis de versões anteritores da ECMAScript) do que lidar com como computações externas possam afetar o sinal de quaisquer zeros que você possa encontrar em sua comparação.</p>
<p>Aqui está uma lista não-exaustiva de métodos e operadores internos que podem fazer com que uma distinção entre <code>-0</code> e <code>+0</code> se manifeste em seu código:</p>
<dl>
  <dt>
    <a href="/en-US/docs/Web/JavaScript/Reference/Operators/Arithmetic_Operators#-_.28Unary_Negation.29" title="/en-US/docs/Web/JavaScript/Reference/Operators/Arithmetic_Operators"><code>- (negação unária)</code></a></dt>
</dl>
<dl>
  <dd>
    <p>É óbvio que negar <code>0</code> produz <code>-0</code>. Mas a abstração de uma expressão pode fazer com o valor <code>-0</code> apareça de modo despercebido. Por exemplo, considere o seguinte:</p>
    <pre class="brush:js">let stoppingForce = obj.mass * -obj.velocity</pre>
    <p>Se <code>obj.velocity</code> é <code>0</code> (ou resulta no valor <code>0</code>), um <code>-0</code> é introduzido naquele ponto e propaga-se para <code>stoppingForce</code>.</p>
  </dd>
</dl>
<dl>
  <dt>
    <a href="/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/atan2" title="/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/atan2"><code>Math.atan2</code></a></dt>
  <dt>
    <a href="/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/ceil" title="/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/ceil"><code>Math.ceil</code></a></dt>
  <dt>
    <a href="/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/pow" title="/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/pow"><code>Math.pow</code></a></dt>
  <dt>
    <a href="/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/round" title="/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/round"><code>Math.round</code></a></dt>
</dl>
<dl>
  <dd>
    É possível que um <code>-0</code> seja introduzido em uma expressão como um valor de retorno desses métodos em alguns casos, mesmo quando nenhum <code>-0</code> existe como um dos parâmetros. Por exemplo, usando-se <a href="/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/pow" title="/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/pow"><code>Math.pow</code></a> para elevar o valor <code>-<a href="/en-US/docs/Web/JavaScript/Reference/Global_Objects/Infinity" title="/en-US/docs/Web/JavaScript/Reference/Global_Objects/Infinity">Infinity</a></code> à potência de qualquer expoente negativo ímpar resulta no valor <code>-0</code>. Veja a documentação para os métodos individuais.</dd>
</dl>
<dl>
  <dt>
    <a href="/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/floor" title="/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/floor"><code>Math.floor</code></a></dt>
  <dt>
    <a href="/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/max" title="/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/max"><code>Math.max</code></a></dt>
  <dt>
    <a href="/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/min" title="/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/min"><code>Math.min</code></a></dt>
  <dt>
    <a href="/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/sin" title="/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/sin"><code>Math.sin</code></a></dt>
  <dt>
    <a href="/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/sqrt" title="/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/sqrt"><code>Math.sqrt</code></a></dt>
  <dt>
    <a href="/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/tan" title="/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/tan"><code>Math.tan</code></a></dt>
</dl>
<dl>
  <dd>
    É possível obter-se um valor de retorno <code>-0</code> desses métodos em alguns casos quando um <code>-0</code> existe como um dos parâmetros. Por exemplo, <code>Math.min(-0, +0)</code> resulta no valor <code>-0</code>. Veja a documentação para os métodos individuais.</dd>
</dl>
<dl>
  <dt>
    <code><a href="/en-US/docs/Web/JavaScript/Reference/Operators/Bitwise_Operators" title="/en-US/docs/Web/JavaScript/Reference/Operators/Bitwise_Operators">~</a></code></dt>
  <dt>
    <code><a href="/en-US/docs/Web/JavaScript/Reference/Operators/Bitwise_Operators" title="/en-US/docs/Web/JavaScript/Reference/Operators/Bitwise_Operators">&lt;&lt;</a></code></dt>
  <dt>
    <code><a href="/en-US/docs/Web/JavaScript/Reference/Operators/Bitwise_Operators" title="/en-US/docs/Web/JavaScript/Reference/Operators/Bitwise_Operators">&gt;&gt;</a></code></dt>
  <dd>
    Cada um desses operadores usa o algoritmo ToInt32 internamente. Uma vez que só há uma representação para o valor 0 no tipo inteiro de 32 bits interno, o valor <code>-0</code> não irá sobreviver a um arredondamento depois de uma operação inversa. Por exemplo, ambos <code>Object.is(~~(-0), -0)</code> e <code>Object.is(-0 &lt;&lt; 2 &gt;&gt; 2, -0)</code> resultam no valor <code>false</code>.</dd>
</dl>
<p>Contar com <a href="/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is" title="/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is"><code>Object.is</code></a> quando o sinal de zeros não é levado em consideração pode ser problemático. É claro que quando a intenção é distinguir entre <code>-0</code> e <code>+0</code>, ele faz exatamente o que é desejado.gual</p>