You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
A lógica descrita acima é algo clássico. Agora, vamos ver as funcionalidades "extras" do JavaScript.
70
70
@@ -101,56 +101,205 @@ Isso nos mostra algumas utilidades interessantes comparadas ao "puro, clássico,
101
101
102
102
1.**Obtendo o primeiro valor verdadeiro de uma lista de variáveis ou expressões.**
103
103
104
-
Imagine que temos várias variáveis que podem conter algum dado ou ser `null/undefined`. Como podemos encontrar a primeira com algum dado?
104
+
Imagine que temos várias variáveis que podem conter algum dado ou ser `null/undefined`. Como podemos encontrar a primeira com algum dado?
105
105
106
-
Nós podemos usar OU `||`:
106
+
Nós podemos usar OU `||`:
107
107
108
-
```js run
109
-
let currentUser =null;
110
-
let defaultUser ="John";
108
+
```js run
109
+
let currentUser =null;
110
+
let defaultUser ="John";
111
111
112
-
*!*
113
-
let name = currentUser || defaultUser ||"unnamed";
114
-
*/!*
112
+
*!*
113
+
let name = currentUser || defaultUser ||"unnamed";
114
+
*/!*
115
115
116
-
alert( name ); // seleciona "John" - o primeiro valor verdadeiro
117
-
```
116
+
alert( name ); // seleciona "John" - o primeiro valor verdadeiro
117
+
```
118
118
119
-
Se ambos `currentUser` e `defaultUser` forem falsos, o resultado será `"unnamed"`.
119
+
Se ambos `currentUser` e `defaultUser` forem falsos, o resultado será `"unnamed"`.
120
120
2.**Interpretação de curto-circuito**
121
121
122
-
Operandos podem não ser apenas valores, mas operações arbitrárias. OU interpreta e testa elas da esquerda para a direita. A interpretação para quando um valor verdadeiro é encontrado e este valor é retornado. Este processo é chamado de "interpretação de curto-circuito" pois vai o mais curto possível da esquerda para a direita.
122
+
Operandos podem não ser apenas valores, mas operações arbitrárias. OU interpreta e testa elas da esquerda para a direita. A interpretação para quando um valor verdadeiro é encontrado e este valor é retornado. Este processo é chamado de "interpretação de curto-circuito" pois vai o mais curto possível da esquerda para a direita.
123
123
124
-
Isto é claramente visto quando a expressão dada como segundo argumento tem um efeito como a atribuição de uma variável.
124
+
Isto é claramente visto quando a expressão dada como segundo argumento tem um efeito como a atribuição de uma variável.
125
125
126
-
No exemplo abaixo, `x` não tem nenhuma atribuição:
126
+
No exemplo abaixo, `x` não tem nenhuma atribuição:
127
127
128
-
```js run no-beautify
129
-
let x;
128
+
```js run no-beautify
129
+
let x;
130
130
131
-
*!*true*/!*|| (x =1);
131
+
*!*true*/!* || (x = 1);
132
132
133
-
alert(x); // undefined, pois (x = 1) não é interpretados
134
-
```
133
+
alert(x); // undefined, pois (x = 1) não é interpretados
134
+
```
135
135
136
-
Se, por outro lado, o primeiro argumento é `false`, `||` interpreta o segundo, fazendo assim a atribuição:
136
+
Se, por outro lado, o primeiro argumento é `false`, `||` interpreta o segundo, fazendo assim a atribuição:
137
137
138
-
```js run no-beautify
139
-
let x;
138
+
```js run no-beautify
139
+
let x;
140
140
141
-
*!*false*/!*|| (x =1);
141
+
*!*false*/!* || (x = 1);
142
142
143
-
alert(x); // 1
144
-
```
143
+
alert(x); // 1
144
+
```
145
145
146
-
Uma atribuição é um caso simples. Outros SIDE EFFECTS podem também estarem envolvidos.
146
+
Uma atribuição é um caso simples. OutrosSIDEEFFECTS podem também estarem envolvidos.
147
147
148
-
Como podemos ver, esse caso é como um "uma maneira mais curta de se usar `if`". O primeiro operando é convertido para boolean. Se for false, o segundo operando é interpretado.
148
+
Como podemos ver, esse caso é como um "uma maneira mais curta de se usar `if`". O primeiro operando é convertido para boolean. Seforfalse, o segundo operando é interpretado.
149
149
150
-
Na maioria das vezes, é melhor usar o `if` "regular" para manter a facilidade de entendimento do código, mas vez ou outra isso pode ser útil.
150
+
Na maioria das vezes, é melhor usar o `if`"regular" para manter a facilidade de entendimento do código, mas vez ou outra isso pode ser útil.
151
151
152
+
## && (E)
152
153
154
+
O operador E é representado com dois e's comerciais `&&`:
153
155
156
+
```js
157
+
result = a && b;
158
+
```
159
+
160
+
Em programação clássica, E retorna `true` se ambos os operandos forem verdadeiros e `false`, caso contrário:
161
+
162
+
```js run
163
+
alert( true && true ); // true
164
+
alert( false && true ); // false
165
+
alert( true && false ); // false
166
+
alert( false && false ); // false
167
+
```
168
+
169
+
Um exemplo com `if`:
170
+
171
+
```js run
172
+
let hour = 12;
173
+
let minute = 30;
174
+
175
+
if (hour == 12 && minute == 30) {
176
+
alert( 'Agora são 12:30' );
177
+
}
178
+
```
179
+
180
+
Da mesma forma com OU, qualquer valor é permitido como um operando de E:
181
+
182
+
```js run
183
+
if (1 && 0) { // interpre como true && false
184
+
alert( "não funciona, pois o resultado é falso" );
185
+
}
186
+
```
187
+
188
+
## "E" encontra o primeiro valor falsos
189
+
190
+
Dados múltiplos valores encadeados com E's:
191
+
192
+
```js
193
+
result = value1 && value2 && value3;
194
+
```
195
+
196
+
O operador `&&` faz o seguinte:
197
+
198
+
- Interpreta os operandos da esquerda para a direita.
199
+
- Para cada operando, o converte para um boolean. Se o resultado for`false`, para e retorna o valor original daquele operando.
200
+
- Se todos os operandos foram interpretados (i.e. todos são verdadeiros), retorna o último operando.
201
+
202
+
Em outras palavras, E retorna o primeiro valor falso ou o último valor se nenhum for falso.
203
+
204
+
As regras acima são similares ao OU. A diferença é que E retorna o primeiro valor *falso* enquanto OR retorna o primeiro valor *verdadeiro*.
205
+
206
+
Exemplos:
207
+
208
+
```js run
209
+
// se o primeiro valor é verdadeiro,
210
+
// E retorna o segundo parâmetro:
211
+
alert( 1 && 0 ); // 0
212
+
alert( 1 && 5 ); // 5
213
+
214
+
// se o primeiro valor é falso,
215
+
// E retorna ele. O segundo operando é ignorado.
216
+
alert( null && 5 ); // null
217
+
alert( 0 && "não importa o quê" ); // 0
218
+
```
219
+
220
+
Nós podemos também passar vários valores seguidos. Veja como o primeiro falso é retornado:
221
+
222
+
```js run
223
+
alert( 1 && 2 && null && 3 ); // null
224
+
```
225
+
226
+
Quando todos valores são falsos, o último valor é retornado:
227
+
228
+
```js run
229
+
alert( 1 && 2 && 3 ); // 3, que é o último
230
+
```
231
+
232
+
````smart header="Precedência do E `&&` é maior do que do OU `||`"
233
+
A precedência do operador E`&&` é maior do que doOU`||`.
234
+
235
+
Portanto, o código `a && b || c && d` é essencialmente o mesmo como se as expressões `&&` estivessem entre parênteses:`(a && b) || (c && d)`.
236
+
````
237
+
238
+
Assim como OU, o operador E`&&` às vezes pode substituir um `if`.
239
+
240
+
Por exemplo:
241
+
242
+
```js run
243
+
let x = 1;
244
+
245
+
(x > 0) && alert( 'Maior que zero!' );
246
+
```
247
+
248
+
A ação na parte direita do`&&` executaria somente se a interpretação chegasse até ela. Ou seja, apenas se `(x > 0)`for verdadeiro.
249
+
250
+
Então, basicamente temos uma analogia para:
251
+
252
+
```js run
253
+
let x = 1;
254
+
255
+
if (x > 0) {
256
+
alert( 'Maior que zero!' );
257
+
}
258
+
```
259
+
260
+
A variação com `&&` parece mais curta. Mas`if` é mais óbvio e tende a ser um pouco mais legível.
261
+
262
+
Então recomendamos a utilização de cada CONSTRUCT para seu propósito: use `if` se queremos SE e use `&&` se queremos E.
263
+
264
+
## ! (NÃO)
265
+
266
+
O operador booleano NÃO é representado com um sinal de exclamação `!`.
267
+
268
+
Sua sintaxe é bem simples:
269
+
270
+
```js
271
+
result = !value;
272
+
```
273
+
274
+
O operador aceita um único argumento e faz o seguinte:
275
+
276
+
1. Converte o operando para um tipo boolean:`true/false`.
277
+
2. Retorna o seu valor inverso.
278
+
279
+
Por exemplo:
280
+
281
+
```js run
282
+
alert( !true ); // false
283
+
alert( !0 ); // true
284
+
```
285
+
286
+
Uma repetição doNOT`!!` às vezes é usado para converter um valor para o tipo boolean:
287
+
288
+
```js run
289
+
alert( !!"string não vazia" ); // true
290
+
alert( !!null ); // false
291
+
```
292
+
293
+
Ou seja, o primeiro NOT converte o valor para boolean e retorna o seu inverso e o segundo NOT o inverte de novo. No final, nós temos uma conversão do valor para boolean.
294
+
295
+
Existem outras formas mais extensas de se fazer a mesma coisa -- uma função `Boolean`:
296
+
297
+
```js run
298
+
alert( Boolean("string não vazia") ); // true
299
+
alert( Boolean(null) ); // false
300
+
```
301
+
302
+
A precedência doNOT`!` é a mais alta entre todos os operadores lógicos, então ele é executado primeiro, antes que `&&` ou `||`.
154
303
155
304
156
305
@@ -175,4 +324,4 @@ Isso nos mostra algumas utilidades interessantes comparadas ao "puro, clássico,
0 commit comments