Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit 6cd14e2

Browse files
author
YuChengKai
authoredOct 17, 2018
Merge pull request #156 from lksilva/master
Finished JS-br
2 parents f2a3824 + 6614066 commit 6cd14e2

File tree

1 file changed

+347
-347
lines changed

1 file changed

+347
-347
lines changed
 

‎JS/JS-br.md

Lines changed: 347 additions & 347 deletions
Original file line numberDiff line numberDiff line change
@@ -2,45 +2,45 @@
22
<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->
33
**Table of Contents** *generated with [DocToc](https://github.com/thlorenz/doctoc)*
44

5-
- [Tipos incorporados](#built-in-types)
6-
- [Conversão de tipo](#type-conversion)
7-
- [Convertendo para boleano](#converting-to-boolean)
8-
- [De objetos para tipos primitivos](#objects-to-primitive-types)
9-
- [Operadores aritméticos](#arithmetic-operators)
10-
- [`==` operador](#-operator)
11-
- [Operador de comparação](#comparison-operator)
5+
- [Tipos incorporados](#tipos-incorporados)
6+
- [Conversão de Tipos](#conversão-de-tipos)
7+
- [Convertendo para boleano](#convertendo-para-boleano)
8+
- [De objetos para tipos primitivos](#de-objetos-para-tipos-primitivos)
9+
- [Operadores aritméticos](#operadores-aritméticos)
10+
- [`==` operador](#-operador)
11+
- [Operador de comparação](#operador-de-comparação)
1212
- [Typeof](#typeof)
1313
- [New](#new)
1414
- [This](#this)
1515
- [Instanceof](#instanceof)
1616
- [Scope](#scope)
1717
- [Closure](#closure)
1818
- [Prototypes](#prototypes)
19-
- [Herança](#inheritance)
20-
- [Cópia rasa e profunda](#deep-and-shallow-copy)
21-
- [Cópia rasa](#shallow-copy)
22-
- [Deep copy](#deep-copy)
23-
- [Modularização](#modularization)
19+
- [Herança](#herança)
20+
- [Cópia rasa e profunda](#cópia-rasa-e-profunda)
21+
- [Cópia rasa](#cópia-rasa)
22+
- [Cópia profunda](#cópia-profunda)
23+
- [Modularização](#modularização)
2424
- [CommonJS](#commonjs)
2525
- [AMD](#amd)
26-
- [A diferença entre call, apply, bind](#the-differences-between-call-apply-bind)
27-
- [simulação para implementar `call` e `apply`](#simulation-to-implement--call-and--apply)
28-
- [Implementação de Promise](#promise-implementation)
29-
- [Implementação do Generator](#generator-implementation)
26+
- [A diferença entre call apply bind](#a-diferença-entre-call-apply-bind)
27+
- [simulação para implementar `call` e `apply`](#simulação-para-implementar--call-e--apply)
28+
- [Implementação de Promise](#implementação-de-promise)
29+
- [Implementação do Generator](#implementação-do-generator)
3030
- [Debouncing](#debouncing)
3131
- [Throttle](#throttle)
32-
- [Map、FlatMap e Reduce](#mapflatmap-and-reduce)
33-
- [Async e await](#async-and-await)
32+
- [Map、FlatMap e Reduce](#mapflatmap-e-reduce)
33+
- [Async e await](#async-e-await)
3434
- [Proxy](#proxy)
35-
- [Por que 0.1 + 0.2 != 0.3](#why-01--02--03)
36-
- [Expressões regulares](#regular-expressions)
37-
- [Metacaracteres](#metacharacters)
35+
- [Por que 0.1 + 0.2 != 0.3](#por-que-01--02--03)
36+
- [Expressões regulares](#expressões-regulares)
37+
- [Metacaracteres](#metacaracteres)
3838
- [Flags](#flags)
3939
- [Character Shorthands](#character-shorthands)
4040

4141
<!-- END doctoc generated TOC please keep comment here to allow auto update -->
4242

43-
# Tipos incorparados
43+
# Tipos incorporados
4444
O JavaScript define sete tipos incorporados, dos quais podem ser divididos em duas categorias `Primitive Type` e `Object`.
4545

4646
Existem seis tipos primitivos: `null`, `undefined`, `boolean`, `number`, `string` e `symbol `.
@@ -51,7 +51,7 @@ Em JavaScript, não existe inteiros de verdade, todos os números são implement
5151
0.1 + 0.2 == 0.3 // false
5252
```
5353

54-
Para tipos primitivos, quando usamos literais para inicializar uma variável, ela te apenas um valor literal, ela não tem um tipo. Isso será convertido para o tipo correspondente apenas quando necessário.
54+
Para tipos primitivos, quando usamos literais para inicializar uma variável, ela tem apenas um valor literal, ela não tem um tipo. Isso será convertido para o tipo correspondente apenas quando necessário.
5555

5656
```js
5757
let a = 111 // apenas literais, não um número
@@ -67,15 +67,15 @@ b.name = 'EF'
6767
console.log(a.name) // EF
6868
```
6969

70-
# Type Conversion
70+
# Conversão de Tipos
7171

72-
## Converting to Boolean
72+
## Convertendo para Boleano
7373

74-
When the condition is judged, other than `undefined`, `null`, `false`, `NaN`, `''`, `0`, `-0`, all of the values, including objects, are converted to `true`.
74+
Quando a condição é julgada, que não seja `undefined`, `null`, `false`, `NaN`, `''`, `0`, `-0`, os esses valores, incluindo objetos, são convertidos para `true`.
7575

76-
## Objects to Primitive Types
76+
## De objetos para tipos primitivos
7777

78-
When objects are converted, `valueOf` and `toString` will be called, respectively in order. These two methods can also be overridden.
78+
Quando objetos são convertidos, `valueOf` e `toString` serão chamados, respectivamente em ordem. Esses dois métodos também são sobrescritos.
7979

8080
```js
8181
let a = {
@@ -85,11 +85,11 @@ let a = {
8585
}
8686
```
8787

88-
## Arithmetic Operators
88+
## Operadores Aritméticos
8989

90-
Only for additions, if one of the parameters is a string, the other one will be converted to string as well. For all other operations, as long as one of the parameters is a number, the other one will be converted to a number.
90+
Apenas para adicão, se um dos parâmentros for uma string, o outro será convertido para uma string também. Para todas as outras operações, enquanto se um dos parâmetros for um número, o outro será convertido para um número.
9191

92-
Additions will invoke three types of type conversions: to primitive types, to numbers and to string:
92+
Adicões invocaram três tipos de conversões de tipos: para tipos primitivos, para números e string:
9393

9494
```js
9595
1 + '1' // '11'
@@ -100,120 +100,120 @@ Additions will invoke three types of type conversions: to primitive types, to nu
100100
// '1,2' + '2,1' = '1,22,1'
101101
```
102102

103-
Note the expression `'a' + + 'b'` for addition:
103+
Observe a expressão `'a' + + 'b'` para adição:
104104

105105
```js
106106
'a' + + 'b' // -> "aNaN"
107-
// since + 'b' -> NaN
108-
// You might have seen + '1' -> 1
107+
// uma vez que + 'b' -> NaN
108+
// Você deve ter visto + '1' -> 1
109109
```
110110

111-
## `==` operator
111+
## `==` operador
112112

113113
![](https://user-gold-cdn.xitu.io/2018/3/30/16275cb21f5b19d7?w=1630&h=1208&f=png&s=496784)
114114

115-
`toPrimitive` in above figure is converting objects to primitive types.
115+
`toPrimitive` na figura acima é convertido objetos para tipos primitivos.
116116

117-
`===` is usually recommended to compare values. However, if you would like to check for `null` value, you can use `xx == null`.
117+
`===` é geralmente recomendado para comparar valores. Contudo, se você gostaria de checar o valor `null`, você pode usar `xx == null`.
118118

119-
Let's take a look at an example `[] == ![] // -> true`. The following process explains why the expression evaluates to `true`:
119+
Vamos dar uma olhada no exemplo `[] == ![] // -> true`. O processo seguinte explica por que a expressão é `true`:
120120

121121
```js
122-
// [] converting to true, then take the opposite to false
122+
// [] convertendo para true, então pegue o oposto para false
123123
[] == false
124-
// with #8
124+
// com #8
125125
[] == ToNumber(false)
126126
[] == 0
127-
// with #10
127+
// com #10
128128
ToPrimitive([]) == 0
129129
// [].toString() -> ''
130130
'' == 0
131-
// with #6
131+
// com #6
132132
0 == 0 // -> true
133133
```
134134

135-
## Comparison Operator
135+
## Operador de comparação
136136

137-
1. If it's an object, `toPrimitive` is used.
138-
2. If it's a string, `unicode` character index is used.
137+
1. Se for um objeto, `toPrimitive` é usado.
138+
2. Se for uma string, o caractere índice `unicode` é usado.
139139

140140
# Typeof
141141

142-
`typeof` can always display the correct type of primitive types, except `null`:
142+
`typeof` também permite exibir o tipo correto de tipos primitivos, exceto `null`:
143143
```js
144144
typeof 1 // 'number'
145145
typeof '1' // 'string'
146146
typeof undefined // 'undefined'
147147
typeof true // 'boolean'
148148
typeof Symbol() // 'symbol'
149-
typeof b // b is not declared,but it still can be displayed as undefined
149+
typeof b // b não foi declarado, mas ainda pode ser exibido como undefined
150150
```
151151

152-
For object, `typeof` will always display `object`, except **function**:
152+
Para objeto, `typeof` irá sempre exibir `object`, exceto **function**:
153153
```js
154154
typeof [] // 'object'
155155
typeof {} // 'object'
156156
typeof console.log // 'function'
157157
```
158158

159-
As for `null`, it is always be treated as an `object` by `typeof`although it is a primitive data type, and this is a bug that has been around for a long time.
159+
Quanto a `null`, ele é sempre tratado como um `object` pelo `typeof` apesar de ser um tipo primitivo, e esse é um bug que que existe a um bom tempo.
160160
```js
161161
typeof null // 'object'
162162
```
163163

164-
Why does this happen? Because the initial version of JS was based on 32-bit systems, which stored type information of variables in the lower bits for performance considerations. Those start with `000` are objects, and all the bits of `null` are zero, so it is erroneously treated as an object. Although the current code of checking internal types has changed, this bug has been passed down.
164+
Por que isso acontece? Porque a versão inicial do JS era baseada em sistemas de 32-bits, do qual armazenava a informação do tipo de variável em bits mais baixos por considerações de performance. Essas começam com objetos `000`, e todos os bits de `null` são zero, então isso é erroneamente tratado como um objeto. Apesar do código atual verificar se os tipos internos mudaram, esse bug foi passado para baixo.
165165

166-
We can use `Object.prototype.toString.call(xx)` if we want to get the correct data type of a variable, and then we can get a string like `[object Type]`:
166+
Nós podemos usar `Object.prototype.toString.call(xx)` se quisermos pegar o tipo de dado correto da variável, e então obtemos uma string como `[object Type]`:
167167

168168
```js
169169
let a
170-
// We can also judge `undefined` like this
170+
// Podemos declarar `undefined` da seguinte maneira
171171
a === undefined
172-
// But the nonreserved word `undefined` can be re-assigned in a lower version browser
172+
// mas a palavra não reservada `undefined` pode ser re assinada em versões antigas dos browsers
173173
let undefined = 1
174-
// it will go wrong to judge like this
175-
// So we can use the following method, with less code
176-
// it will always return `undefined`, whatever follows `void `
174+
// vai dar errado declarar assim
175+
// então nós podemos usar o seguinte método, com menos código
176+
// ele sempre vai retornar `undefined`, tanto faz vir seguido de `void`
177177
a === void 0
178178
```
179179

180180
# New
181181

182-
1. Create a new object
183-
2. Chained to prototype
184-
3. Bind this
185-
4. Return a new object
182+
1. Crie um novo objeto
183+
2. Encadei o prototype
184+
3. Ligue o this
185+
4. Retorne um novo objeto
186186

187-
The above four steps will happen in the process of calling `new`. We can also try to implement `new ` by ourselves:
187+
Os quatro passos acima vão acontecer no processo chamado `new`. Podemos também tentar implementar o `new ` nós mesmos:
188188

189189
```js
190190
function create() {
191-
// Create an empty object
191+
// Crie um objeto vázio
192192
let obj = new Object()
193-
// Get the constructor
193+
// Obtenha o construtor
194194
let Ctor = [].shift.call(arguments)
195-
// Chained to prototype
195+
// Encadeie para o prototype
196196
obj.__proto__ = Ctor.prototype
197-
// Bind this, Execute the constructor
197+
// Ligue o this, execute o construtor
198198
let result = Con.apply(obj, arguments)
199-
// Make sure the new one is an object
199+
// Tenha certeza que o novo é um objeto
200200
return typeof result === 'object'? result : obj
201201
}
202202
```
203203

204-
Instances of object are all created with `new`, whether it's `function Foo()` , or `let a = { b: 1 }` .
204+
Instância de um novo objeto são todas criadas com `new`, seja ele `function Foo()`, ou `let a = { b: 1 }` .
205205

206-
It is recommended to create objects using the literal notation (whether it's for performance or readability), since a look-up is needed for `Object` through the scope chain when creating an object using `new Object()`, but you don't have this kind of problem when using literals.
206+
É recomendado criar os objetos usando notação literal (seja por questões de performance ou legibilidade), uma vez que é necessário um look-up para `Object` atravessar o escopo encadeado quando criando um objeto usando `new Object()`, mas você não precisa ter esse tipo de probelma quando usando literais.
207207

208208
```js
209209
function Foo() {}
210-
// Function is a syntactic sugar
211-
// Internally equivalent to new Function()
210+
// Função são sintáticamente amigáveis
211+
// Internamente é equivalente a new Function()
212212
let a = { b: 1 }
213-
// Inside this literal, `new Object()` is also used
213+
// Dentro desse lireal, `new Object()` também é usado
214214
```
215215

216-
For `new`, we also need pay attention to the operator precedence:
216+
Para `new`, também precisamos prestar atenção ao operador precedente:
217217

218218
```js
219219
function Foo() {
@@ -232,20 +232,19 @@ new Foo().getName(); // -> 2
232232

233233
![](https://user-gold-cdn.xitu.io/2018/4/9/162a9c56c838aa88?w=2100&h=540&f=png&s=127506)
234234

235-
As you can see from the above image, `new Foo()` has a higher priority than `new Foo`, so we can divide the execution order of the above code like this:
236-
235+
Como você pode ver na imagem acima, `new Foo()` possui uma alta prioridade sobre `new Foo`, então podemos dividir a ordem de execução do código acima assim:
237236

238237
```js
239238
new (Foo.getName());
240239
(new Foo()).getName();
241240
```
242241

243-
For the first function, `Foo.getName()` is executed first, so the result is 1;
244-
As for the latter, it first executes `new Foo()` to create an instance, then finds the `getName` function on `Foo` via the prototype chain, so the result is 2.
242+
Para a primeira função, `Foo.getName()` é executado primeiro, então o resultado é 1;
243+
Para mais tarte, ele primeiro executa `new Foo()` para criar uma instância, então encontrar a função `getName` no `Foo` via cadeia de prototype, então o resultado é 2.
245244

246245
# This
247246

248-
`This`, a concept that is confusing to many people, is actually not difficult to understand as long as you remember the following rules:
247+
`This`, um conceito que é confuso para maioria das pessoas, atualmente não é difícil de entender enquanto você lembrar as seguintes regras:
249248

250249
```js
251250
function foo() {
@@ -260,21 +259,21 @@ var obj = {
260259
};
261260
obj.foo();
262261

263-
// In the above two situations, `this` only depends on the object before calling the function,
264-
// and the second case has higher priority than the first case .
262+
// Nas duas situações acima, `this` depende apenas do objeto ser chamado antes da função,
263+
// e o segundo caso tem uma alta prioriade sobre o primeiro caso.
265264

266-
// the following scenario has the highest priority,`this` will only be bound to c,
267-
// and there's no way to change what `this` is bound to .
265+
// o seguinte cenário tem uma alta prioridade, `this` só ficará ligado para c,
266+
// e não existe uma maneira de mudar o que `this` está limitado
268267

269268
var c = new foo();
270269
c.a = 3;
271270
console.log(c.a);
272271

273-
// finally, using `call`, `apply`, `bind` to change what `this` is bound to,
274-
// is another scenario where its priority is only second to `new`
272+
// finalmente, usando `call`, `apply`, `bind` para mudar o que o `this` é obrigado,
273+
// em outro cenário onde essa prioridade é apenas o segundo `new`
275274
```
276275

277-
Understanding the above several situations, we won’t be confused by `this` under most circumstances. Next, let’s take a look at `this` in arrow functions:
276+
Entendendo sobre as várias situações acima, nós não vamos ser confundidos pelo `this` na maioria dos casos. Depois, vamos dar uma olhada no `this` nas arrow functions:
278277

279278
```js
280279
function a() {
@@ -286,21 +285,21 @@ function a() {
286285
}
287286
console.log(a()()());
288287
```
289-
Actually, the arrow function does not have `this`, `this` in the above function only depends on the first outer function that is not an arrow function. For this case, `this` is default to `window` because calling `a` matches the first condition in the above codes. Also, what `this` is bound to will not be changed by any codes once `this` is bound to the context.
288+
Atualmente, as arrow function não tem o `this`, `this` na função acima apenas depende da primeira função externa que não é uma arrow function. Nesse caso, `this` é o padrão para `window` porque chamando `a` iguala a primeira condição nos códigos acima. Também, o que o `this` está ligado não ira ser mudado por qualquer código uma vez que o `this` estiver ligado em um contexto.
290289

291290

292291
# Instanceof
293292

294-
The `instanceof` operator can correctly check the type of objects, because its internal mechanism is to find out if `prototype` of this type can be found in the prototype chain of the object.
293+
O operador `instanceof` consegue checar corretamente o tipo dos objetos, porque o seu mecanismo interno encontra se o tipo do `prototype` pode ser encontrado na cadeia de prototype do objeto.
295294

296-
let’s try to implement it:
295+
vamos tentar implementar ele:
297296
```js
298297
function instanceof(left, right) {
299-
// get the `prototype` of the type
298+
// obtenha o type do `prototype`
300299
let prototype = right.prototype
301-
// get the `prototype` of the object
300+
// obtenha o `prototype` do objeto
302301
left = left.__proto__
303-
// check if the type of the object is equal to the prototype of the type
302+
// verifique se o tipo do objeto é igual ao prototype do tipo
304303
while (true) {
305304
if (left === null)
306305
return false
@@ -313,14 +312,14 @@ function instanceof(left, right) {
313312

314313
# Scope
315314

316-
Executing JS code would generate execution context, as long as code is not written in a function, it belongs to the global execution context. Code in a function will generate function execution context. There’s also an `eval` execution context, which basically is not used anymore, so you can think of only two execution contexts.
315+
Executar código JS deveria gerar execução do contexto, enquanto o código não é escrito na função, ele faz parte da execução do contexto global. O código na função vai gerar executação do contexto da função. Existe também uma execução do contexto do `eval`, do qual basicamente não é mais usado, então você pode pensar apenas em duas execuções de contexto.
317316

318-
The `[[Scope]]` attribute is generated in the first stage of generating execution context, which is a pointer, corresponds to the linked list of the scope, and JS will look up variables through this linked list up to the global context.
317+
O atributo `[[Scope]]` é gerado no primeiro estágio de geração de contexto, que é um ponteiro, corresponde a linked list do escopo, e o JS vai procurar variáveis através dessas linked list no contexto global.
319318

320-
Let's look at a common example , `var`:
319+
Vamos olhar um exemplo common, `var`:
321320

322321
```js
323-
b() // call b
322+
b() // chama b
324323
console.log(a) // undefined
325324

326325
var a = 'Hello world'
@@ -330,29 +329,30 @@ function b() {
330329
}
331330
```
332331

333-
It’s known that function and variable hoisting is the real reason for the above outputs. The usual explanation for hoisting says that the declarations are ‘moved’ to the top of the code, and there is nothing wrong with that and it’s easy for everyone to understand. But a more accurate explanation should be something like this:
332+
Ele sabe que funcões e variáveis são içadas acima em relação aos outputs. A explicação usual para o hoisting diz que as declarações são ‘movidas’ para o topo do código, e não existe nada de errado com isso e é fácil de todo mundo entender. Mas para um explicação mais precisa deveria ser algo como:
334333

335-
There would be two stages when the execution context is generated. The first stage is the stage of creation(to be specific, the step of generating variable objects), in which the JS interpreter would find out variables and functions that need to be hoisted, and allocate memory for them in advance, then functions would be stored into memory entirely, but variables would only be declared and assigned to `undefined`, therefore, we can use them in advance in the second stage (the code execution stage).
334+
Haveria dois estágios quando a execução do contexto é gerada. O primeiro estágio é o estágio de criação(para ser mais epecífico, o passo de geração variáveis objeto), no qual o interpretador de JS deveria encontrar variáveis e funções que precisam ser içadas, e aloca memória para eles atecipadamente, então as funções deveriam ser guardadas na memória internamente, mas variáveis seriam apenas declaradas e assinadas para `undefined`, assim sendo, nós podemos usar elas adiante no segundo estágio (a execução do código no estágio)
336335

337-
In the process of hoisting, the same function would overwrite the last function, and functions have higher priority than variables hoisting.
336+
No processo de içar, a mesma função deveria sobrescrever a última função, e funções tem alta prioridade sobre variáveis içadas.
338337

339338
```js
340-
b() // call b second
339+
b() // chama segundo b
341340

342341
function b() {
343-
console.log('call b fist')
342+
console.log('chama b primeiro')
344343
}
345344
function b() {
346-
console.log('call b second')
345+
console.log('chama b segundo')
347346
}
348347
var b = 'Hello world'
349348
```
350349

351-
Using `var` is more likely error-prone, thus ES6 introduces a new keyword `let`. `let` has an important feature that it can’t be used before declared, which conflicts the common saying that `let` doesn’t have the ability of hoisting. In fact, `let` hoists declaration, but is not assigned, because the **temporal dead zone**.
350+
Usando `var` é mais provável error-prone, portanto ES6 introduziu uma nova palava-chave `let`. `let` tem uma característica importante que ela não pode ser usada antes de declarada, que conflita com o ditado comum que `let` não tem a habilidade de içar. De fato, `let` iça a declaracão, mas não é assinada, por causa da **temporal dead zone**.
351+
352352

353353
# Closure
354354

355-
The definition of closure is simple: function A returns a function B, and function B can access variables of function A, thus function B is called a closure.
355+
A definição de closure é simples: a função A retorna a função B, e a função b consegue acessar as variáveis da função A, portanto a função B é chamada de closure.
356356

357357
```js
358358
function A() {
@@ -364,9 +364,9 @@ function A() {
364364
}
365365
```
366366

367-
Are you wondering why function B can also refer to variables in function A while function A has been popped up from the call stack? Because variables in function A are stored on the heap at this time. The current JS engine can identify which variables need to be stored on the heap and which need to be stored on the stack by escape analysis.
367+
Se você estiver se perguntando por que a função B também consegue se referenciar as variáveis da função A enquanto a função A aparece a partir da stack de chamadas? Porque as variáveis na função A são guardadas na pilha nesse momento. O motor atual do JS consegue indentificar quais variáveis precisam ser salvas na heap e quais precisam ser salvas na stack por análise de fuga.
368368

369-
A classic interview question is using closures in loops to solve the problem of using `var` to define functions:
369+
Uma pergunta classica de entrevista é usando closure em loops para resolver o problema de usar `var` para definir funções:
370370

371371
```js
372372
for ( var i=1; i<=5; i++) {
@@ -376,9 +376,9 @@ for ( var i=1; i<=5; i++) {
376376
)
377377
```
378378
379-
First of all, all loops will be executed completely because `setTimeout` is an asynchronous function, and at that time `i` is 6, so it will print a bunch of 6.
379+
Em primeirio lugar, todos os loops vão ser executados completamente porque `setTimeout` é uma função assíncrona, e nesse momento `i` é 6, então isso vai exibir um bando de 6.
380380
381-
There are three solutions,closure is the first one:
381+
Existe três soluções, closure é a primeira:
382382
383383
```js
384384
for (var i = 1; i <= 5; i++) {
@@ -390,7 +390,7 @@ for (var i = 1; i <= 5; i++) {
390390
}
391391
```
392392
393-
The second one is to make use of the third parameter of `setTimeout`:
393+
A segunda é fazer o uso do terceiro parâmetro do `setTimeout`:
394394
395395
```js
396396
for ( var i=1; i<=5; i++) {
@@ -400,7 +400,7 @@ for ( var i=1; i<=5; i++) {
400400
}
401401
```
402402
403-
The third is to define `i` using `let`:
403+
A terceira é definir o `i` usando `let`:
404404
405405
```js
406406
for ( let i=1; i<=5; i++) {
@@ -410,11 +410,11 @@ for ( let i=1; i<=5; i++) {
410410
}
411411
```
412412
413-
For `let`, it will create a block-level scope, which is equivalent to:
413+
Para `let`, ele vai criar um escopo de block-level, do qual é equivalente a:
414414
415415
```js
416416
{
417-
// Form block-level scope
417+
// Forma o escopo block-level
418418
let i = 0
419419
{
420420
let ii = i
@@ -438,16 +438,15 @@ For `let`, it will create a block-level scope, which is equivalent to:
438438
439439
![](https://camo.githubusercontent.com/71cab2efcf6fb8401a2f0ef49443dd94bffc1373/68747470733a2f2f757365722d676f6c642d63646e2e786974752e696f2f323031382f332f31332f313632316538613962636230383732643f773d34383826683d35393026663d706e6726733d313531373232)
440440
441-
Each function, besides `Function.prototype.bind()`, has an internal property, denoted as `prototype`, which is a reference to the prototype.
442-
443-
Each object has an internal property, denoted as `__proto__`, which is a reference to the prototype of the constructor that creates the object. This property actually refers to `[[prototype]]`, but `[[prototype]]` is an internal property that we can’t access, so we use `__proto__` to access it.
441+
Cada função, além de `Function.prototype.bind()`, tem uma propriedade interna, denotado como `prototype`, do qual é uma referência para o prototype.
444442
445-
Objects can use `__proto__` to look up properties that do not belong to the object, and `__proto__` connects objects together to form a prototype chain.
443+
Cada objeto tem uma propriedade interna, denotada como `__proto__`, que é uma referência para o prototype do construtor que criou o objeto. Essa propriedade é atualmente referenciada ao `[[prototype]]`, mas o `[[prototype]]` é uma propriedade interna que nós não podemos acessar, então usamos o `__proto__` para acessar ele.
446444
445+
Objetos podem usar `__proto__` para procurar propriedade que não fazem parte do objeto, e `__proto__` conecta os objetos juntos para formar uma cadeida de prototype.
447446
448-
# Inheritance
447+
# Herança
449448
450-
In ES5, we can solve the problems of inheritance by using the following ways:
449+
No ES5, podemos resolve os problema de herança usando os seguintes passos:
451450
452451
```js
453452
function Super() {}
@@ -467,9 +466,9 @@ Sub.prototype = Object.create(Super.prototype, {
467466
})
468467
```
469468

470-
The above idea of inheritance implementation is to set the `prototype` of the child class as the `prototype` of the parent class.
469+
A idéia de herança implementada acima é para definir o `prototype` da classe filho como o `prototype` da classe pai.
471470

472-
In ES6, we can easily solve this problem with the `class` syntax:
471+
No ES6, podemos facilmente resolver esse problema com a sintaxe `class`:
473472

474473
```js
475474
class MyDate extends Date {
@@ -481,15 +480,15 @@ let myDate = new MyDate()
481480
myDate.test()
482481
```
483482
484-
However, ES6 is not compatible with all browsers, so we need to use Babel to compile this code.
483+
Contudo, ES6 não é compátivel com todos os navegadores, então usamos o Babel para compilar esser código.
485484
486-
If call `myDate.test()` with compiled code, you’ll be surprised to see that there’s an error:
485+
Se chamar `myDate.test()` com o código compilado, você vai ficar surpreso de ver que existe um erro:
487486
488487
![](https://user-gold-cdn.xitu.io/2018/3/28/1626b1ecb39ab20d?w=678&h=120&f=png&s=32812)
489488
490-
Because there are restrictions on the low-level of JS, if the instance isn’t constructed by `Date`, it can’t call functions in `Date`, which also explains from another aspect that `Class` inheritance in ES6 is different from the general inheritance in ES5 syntax.
489+
Porque existem restrições no baixo nível do JS, se a instância não for construida pelo `Date`, ele não pode chamar funções no `Date`, que também explica a partir de outro aspecto que herança de `Class` no ES6 é diferente das heranças gerais na sintaxe do ES5.
491490
492-
Since the low-level of JS limits that the instance must be constructed by `Date` , we can try another way to implement inheritance:
491+
Uma vez o baixo nível dos limites do JS que a instância deve ser construido pelo `Date`, nós podemos tentar outra maneira de implementar herança:
493492
494493
```js
495494
function MyData() {
@@ -503,12 +502,12 @@ Object.setPrototypeOf(d, MyData.prototype)
503502
Object.setPrototypeOf(MyData.prototype, Date.prototype)
504503
```
505504
506-
The implementation idea of the above inheritance: first create the instance of parent class => change the original `__proto__` of the instance, connect it to the `prototype` of child class => change the `__proto__` of child class’s `prototype` to the `prototype` of parent class.
505+
A implementação da idéia acima sobre herança: primeiro cria uma instância da classe do pai => muda o original `__proto__` de instância, conectado ao `prototype` da classe do filho => muda o `__proto__` da classe do filho `prototype` para o `prototype` da classe do pai.
507506
508-
The inheritance implement with the above method can perfectly solve the restriction on low-level of JS.
507+
A herança de implementação com o método acima pode perfeitamente resolver a restrição no baixo nível do JS.
509508
510509
511-
# Deep and Shallow Copy
510+
# Cópia rasa e profunda
512511
513512
```js
514513
let a = {
@@ -519,13 +518,13 @@ a.age = 2
519518
console.log(b.age) // 2
520519
```
521520
522-
From the above example, we can see that if you assign an object to a variable, then the values of both will be the same reference, one changes, the other changes accordingly.
521+
A partir do exemplo acima, nós podemos ver que se você assinar um objeto para uma variável, então os valores dos dois vão ter a mesma referência, um muda o outro muda adequadamente.
523522
524-
Usually, we don't want such problem to appear during development, thus we can use shallow copy to solve this problem.
523+
Geralmente, nós não queremos que tal problema apareça durante o desensolvimento, portanto podemos usar a cópia rasa para resolver esse problema.
525524
526-
## Shallow copy
525+
## Cópia rasa
527526
528-
Firstly we can solve the problem by `Object.assign`:
527+
Primeiramente podemos resolver o problema através do `Object.assign`:
529528
```js
530529
let a = {
531530
age: 1
@@ -535,7 +534,7 @@ a.age = 2
535534
console.log(b.age) // 1
536535
```
537536
538-
Certainly, we can use the spread operator (...) to solve the problem:
537+
Certamente, podemos usar o spread operator (...) para resolver o problema:
539538
```js
540539
let a = {
541540
age: 1
@@ -545,7 +544,7 @@ a.age = 2
545544
console.log(b.age) // 1
546545
```
547546
548-
Usually, shallow copy can solve most problems, but we need deep copy when encountering the following situation:
547+
Geralmente, a cópia rasa pode resolver a maioria dos problemas, mas precisamos da cópia profunda quando encontrado a seguinte situação:
549548
```js
550549
let a = {
551550
age: 1,
@@ -557,11 +556,11 @@ let b = {...a}
557556
a.jobs.first = 'native'
558557
console.log(b.jobs.first) // native
559558
```
560-
The shallow copy only solves the problem of the first layer. If the object contains objects, then it returns to the beginning topic that both values share the same reference. To solve this problem, we need to introduce deep copy.
559+
A cópia rasa resolve apenas o problema na primeira camada. Se o objeto contém objetos, então ele retorna para o topico inicial que os dois valores compartilham a mesma referência. Para resolver esse problema, precisamos introduzir a cópia profunda.
561560
562-
## Deep copy
561+
## Cópia profunda
563562
564-
The problem can usually be solved by `JSON.parse(JSON.stringify(object))`
563+
O problema pode geralmente ser resolvido por `JSON.parse(JSON.stringify(object))`
565564
566565
```js
567566
let a = {
@@ -575,11 +574,10 @@ a.jobs.first = 'native'
575574
console.log(b.jobs.first) // FE
576575
```
577576
578-
But this method also has its limits:
579-
* ignore `undefined`
580-
* ignore `symbol`
581-
* unable to serialize function
582-
* unable to resolve circular references in an object
577+
Mas esse método também tem seus limites:
578+
* ignora `undefined`
579+
* incapaz de serializar função
580+
* incapaz de resolver referência circular de um objeto
583581
```js
584582
let obj = {
585583
a: 1,
@@ -597,11 +595,11 @@ let newObj = JSON.parse(JSON.stringify(obj))
597595
console.log(newObj)
598596
```
599597
600-
If an object is circularly referenced like the above example, you’ll find the method `JSON.parse(JSON.stringify(object))` can’t make a deep copy of this object:
598+
Se um objto é uma referência circular como o exemplo acima, você vai encontrar o método `JSON.parse(JSON.stringify(object))` ele não pode fazer a cópia profunda desse objeto:
601599
602600
![](https://user-gold-cdn.xitu.io/2018/3/28/1626b1ec2d3f9e41?w=840&h=100&f=png&s=30123)
603601
604-
When dealing with function, `undefined` or `symbol`, the object can also not be serialized properly.
602+
Quando lidando com uma função ou `undefined`, o objeto pode não ser serializado adequedamente.
605603
```js
606604
let a = {
607605
age: undefined,
@@ -613,11 +611,11 @@ let b = JSON.parse(JSON.stringify(a))
613611
console.log(b) // {name: "yck"}
614612
```
615613
616-
In above case, you can see that the method ignores function and `undefined`.
614+
No caso acima, você pode perceber que o método ignora a função e `undefined`.
617615
618-
Most often complex data can be serialized, so this method can solve most problems, and as a built-in function, it has the fastest performance when dealing with deep copy. Certainly, you can use [the deep copy function of `lodash` ](https://lodash.com/docs#cloneDeep) when your data contains the above three cases.
616+
A maioria dos dados conseguem ser serializados, então esse método resolve a maioria dos problemas, e como uma função embutida, ele tem uma performance melhor quando lidando com a cópia profunda. Certamente, você pode usar [the deep copy function of `lodash` ](https://lodash.com/docs#cloneDeep) quando sues dados contém os três casos acima.
619617
620-
If the object you want to copy contains a built-in type but doesn’t contain a function, you can use `MessageChannel`
618+
Se o objeto que você quer copiar contém um tipo embutido mas não contém uma função, você pode usar `MessageChannel`
621619
```js
622620
function structuralClone(obj) {
623621
return new Promise(resolve => {
@@ -630,22 +628,23 @@ function structuralClone(obj) {
630628
var obj = {a: 1, b: {
631629
c: b
632630
}}
633-
// pay attention that this method is asynchronous
634-
// it can handle `undefined` and circular reference object
631+
632+
// preste atenção que esse método é assíncrono
633+
// ele consegue manipular `undefined` e referência circular do objeto
635634
(async () => {
636635
const clone = await structuralClone(obj)
637636
})()
638637
```
639638
640-
# Modularization
639+
# Modularização
641640
642-
With Babel, we can directly use ES6's modularization:
641+
Com o Babel, nós conseguimos usar a ES6 modularização:
643642
644643
```js
645-
// file a.js
644+
// arquivo a.js
646645
export function a() {}
647646
export function b() {}
648-
// file b.js
647+
// arquivo b.js
649648
export default function() {}
650649

651650
import {a, b} from './a.js'
@@ -654,36 +653,36 @@ import XXX from './b.js'
654653
655654
## CommonJS
656655
657-
`CommonJS` is Node's unique feature. `Browserify` is needed for `CommonJS` to be used in browsers.
656+
`CommonJS` é uma aspecto único do Node. É preciso `Browserify` para o `CommonJS` ser usado nos navegadores.
658657
659658
```js
660659
// a.js
661660
module.exports = {
662661
a: 1
663662
}
664-
// or
663+
// ou
665664
exports.a = 1
666665

667666
// b.js
668667
var module = require('./a.js')
669668
module.a // -> log 1
670669
```
671670
672-
In the code above, `module.exports` and `exports` can cause confusions. Let us take a peek at the internal implementations:
671+
No código acima, `module.exports` e `exports` podem causar confusão. Vamos dar uma olhada na implementação interna:
673672
674673
```js
675674
var module = require('./a.js')
676675
module.a
677-
// this is actually a wrapper of a function to be executed immediately so that we don't mess up the global variables.
678-
// what's important here is that module is a Node only variable.
676+
// esse é o empacotador atual de uma função a ser executada imediatamente, de modo que não precisamos bagunçar as variáveis globais.
677+
// O que é importante aqui é que o módulo é apenas uma variável do Node.
679678
module.exports = {
680679
a: 1
681680
}
682-
// basic implementation
681+
// implementação básica
683682
var module = {
684-
exports: {} // exports is an empty object
683+
exports: {} // exporta em um objeto vázio
685684
}
686-
// This is why exports and module.exports have similar usage.
685+
// Esse é o por que o exports e module.exports tem usos similares.
687686
var exports = module.exports
688687
var load = function (module) {
689688
// to be exported
@@ -693,18 +692,19 @@ var load = function (module) {
693692
};
694693
```
695694
696-
Let's then talk about `module.exports` and `exports`, which have similar usage, but one cannot assign a value to `exports` directly. The assignment would be a no-op.
695+
Vamos então falar sobre `module.exports` e `exports`, que tem uso similar, mas um não atribui um valor para `exports` diretamente. A tarefa seria um no-op.
697696
698-
The differences between the modularizations in `CommonJS` and in ES6 are:
697+
A diferença entre as modularizações no `CommonJS` a no ES6 são:
699698
700-
- The former supports dynamic imports, which is `require(${path}/xx.js)`; the latter doesn't support it yet, but there have been proposals.
701-
- The former uses synchronous imports. Since it is used on the server end and files are local, it doesn't matter much even if the synchronous imports block the main thread. The latter uses asynchronous imports, because it is used in browsers in which file downloads are needed. Rendering process would be affected much if asynchronous import was used.
702-
- The former copies the values when exporting. Even if the values exported change, the values imported will not change. Therefore, if values shall be updated, another import needs to happen. However, the latter uses realtime bindings, the values imported and exported point to the same memory addresses, so the imported values change along with the exported ones.
703-
- In execution the latter is compiled to `require/exports`.
699+
- O antigo suporta importes dinamico, que é `require(${path}/xx.js)`; o último não suporta isso ainda, mas
700+
existem propostas.
701+
- O antigo usa importes síncronos. Desde de que usado no servidor os arquivos são locais, não importa muito mesmo se o import síncrono bloqueia a main thread. O último usa importe assíncrono, porque ele é usado no navegador em que os arquivos baixados são precisos. O processo de renderização seria afetado muito se assíncrono importe for usado.
702+
- O anterior copia os valores quando exportando. Mesmo se o valor exportado mudou, os valores importados não irão mudar. Portanto, se os valores devem ser atualizados, outro importe precisa acontecer. Contudo, o último usa ligações em tempo real, os valores importados são importados no mesmo endereço de memória, então o valor importado muda junto com os importados.
703+
- Em execução o último é compilado para `require/exports`.
704704
705705
## AMD
706706
707-
AMD is brought forward by `RequireJS`.
707+
AMD é apresentado por `RequireJS`.
708708
709709
```js
710710
// AMD
@@ -720,13 +720,13 @@ define(function(require, exports, module) {
720720
})
721721
```
722722
723-
# The differences between call, apply, bind
723+
# A diferença entre call apply bind
724724
725-
Firstly, let’s tell the difference between the former two.
725+
Primeiro, vamos falar a diferença entre os dois antigos.
726726
727-
Both `call` and `apply` are used to change what `this` refers to. Their role is the same, but the way to pass parameters is different.
727+
Ambos `call` e `apply` são usados para mudar o que o `this` se refere. Seu papel é o mesmo, mas a maneira de passar os parâmetros é diferente.
728728
729-
In addition to the first parameter, `call` can accept an argument list, while `apply` accepts a single array of arguments.
729+
Além do primeiro parâmetro, `call` também aceita uma lista de argumentos, enquanto `apply` aceita um único array de argumentos.
730730
731731
```js
732732
let a = {
@@ -741,39 +741,40 @@ getValue.call(a, 'yck', '24')
741741
getValue.apply(a, ['yck', '24'])
742742
```
743743
744-
## simulation to implement `call` and `apply`
744+
## simulação para implementar `call` e `apply`
745+
746+
Consideramos implementar eles a partir das seguintes regras:
745747
746-
We can consider how to implement them from the following rules:
748+
* Se o primeiro parâmetro não foi passado, então o primeiro será o padrão `window`;
747749
748-
* If the first parameter isn’t passed, then the first parameter will default to `window`;
749-
* Change what `this` refers to, which makes new object capable of executing the function. Then let’s think like this: add a function to a new object and then delete it after the execution.
750+
* Mude a referência do `this`, que faz um novo objeto capaz de executar a função. Então vamos pensar assim: adicione a função para um novo objeto e então delete ele depois da execução.
750751
751752
```js
752753
Function.prototype.myCall = function (context) {
753754
var context = context || window
754-
// Add an property to the `context`
755+
// Adiciona uma propriedade ao `context`
755756
// getValue.call(a, 'yck', '24') => a.fn = getValue
756757
context.fn = this
757-
// take out the rest parameters of `context`
758+
// pega os parâmentros do `context`
758759
var args = [...arguments].slice(1)
759760
// getValue.call(a, 'yck', '24') => a.fn('yck', '24')
760761
var result = context.fn(...args)
761-
// delete fn
762+
// deleta fn
762763
delete context.fn
763764
return result
764765
}
765766
```
766767
767-
The above is the main idea of simulating `call`, and the implementation of `apply` is similar.
768+
O exemplo acima é a idéia central da simulação do `call`, e a implementação do `apply` é similar.
768769
769770
```js
770771
Function.prototype.myApply = function (context) {
771772
var context = context || window
772773
context.fn = this
773774

774775
var result
775-
// There's a need to determine whether to store the second parameter
776-
// If the second parameter exists, spread it
776+
// Existe a necessidade de determinar se guarda o segundo parâmentro
777+
// Se o segundo parâmetro existir, espalhe ele
777778
if (arguments[1]) {
778779
result = context.fn(...arguments[1])
779780
} else {
@@ -785,9 +786,9 @@ Function.prototype.myApply = function (context) {
785786
}
786787
```
787788
788-
The role of `bind` is the same as the other two, except that it returns a function. And we can implement currying with `bind`
789+
A regra do `bind` é a mesma das outras duas, exceto que ela retorna uma função. E nós podemos implementar currying com o `bind`
789790
790-
let’s simulate `bind`:
791+
vamos simular o `bind`:
791792
792793
```js
793794
Function.prototype.myBind = function (context) {
@@ -796,9 +797,9 @@ Function.prototype.myBind = function (context) {
796797
}
797798
var _this = this
798799
var args = [...arguments].slice(1)
799-
// return a function
800+
// retorna uma função
800801
return function F() {
801-
// we can use `new F()` because it returns a function, so we need to determine
802+
// Nós podemos usar `new F()` porque ele retorna uma função, então precisamos determinar
802803
if (this instanceof F) {
803804
return new _this(...args, ...arguments)
804805
}
@@ -807,36 +808,36 @@ Function.prototype.myBind = function (context) {
807808
}
808809
```
809810
810-
# Promise implementation
811+
# Implementação de Promise
811812
812-
`Promise` is a new syntax introduced by ES6, which resolves the problem of callback hell.
813+
`Promise` é a nova sintaxe introduzida pelo ES6, que resolve os problemas de callback hell.
813814
814-
Promise can be seen as a state machine and it's initial state is `pending`. We can change the state to `resolved` or `rejected` by using the `resolve` and `reject` functions. Once the state is changed, it cannot be changed again.
815+
Promise pode ser visto como um estado de máquina e o seu estado inicial é `pending`. Nós podemos mudar o estado para `resolved` ou `rejected` usando as funções `resolve` e `reject`. Uma vez que o state mudou, ele não pode mudar novamente.
815816
816-
The function `then` returns a Promise instance, which is a new instance instead of the previous one. And that's because the Promise specification states that in addition to the `pending` state, other states cannot be changed, and multiple calls of function `then` will be meaningless if the same instance is returned.
817+
A função `then` retorna uma instância da Promise, do qual é uma nova instância ao invés do anterior. E existe por que a especificação de estado da Promise que adiciona para o estado `pending`, outro estado não pode ser mudado, e multiplas chamadas a função `then` serão insignificantes se a mesma instância for retornada.
817818
818-
For `then`, it can essentially be seen as `flatMap`:
819+
Para `then`, ele pode essencialmente ser visto como flatMap`:
819820

820821
```js
821-
// three states
822+
// árvore de estados
822823
const PENDING = 'pending';
823824
const RESOLVED = 'resolved';
824825
const REJECTED = 'rejected';
825-
// promise accepts a function argument that will execute immediately.
826+
// promise aceita um argumento na função que será executada imediatamente.
826827
function MyPromise(fn) {
827828
let _this = this;
828829
_this.currentState = PENDING;
829830
_this.value = undefined;
830-
// To save the callback of `then`,only cached when the state of the promise is pending,
831-
// at most one will be cached in every instance
831+
// Save o callback do `then`, apenas em cache quando o estado da promise for pending,
832+
// no máximo será cacheado em cada instância
832833
_this.resolvedCallbacks = [];
833834
_this.rejectedCallbacks = [];
834835
835836
_this.resolve = function(value) {
836-
// execute asynchronously to guarantee the execution order
837+
// execute assícronamente para garantir a ordem de execução
837838
setTimeout(() => {
838839
if (value instanceof MyPromise) {
839-
// if value is a Promise, execute recursively
840+
// se o valor é uma Promise, execute recursivamente
840841
return value.then(_this.resolve, _this.reject)
841842
}
842843
if (_this.currentState === PENDING) {
@@ -848,7 +849,7 @@ function MyPromise(fn) {
848849
}
849850
850851
_this.reject = function(reason) {
851-
// execute asynchronously to guarantee the execution order
852+
// execute assícronamente para garantir a ordem de execução
852853
setTimeout(() => {
853854
if (_this.currentState === PENDING) {
854855
_this.currentState = REJECTED;
@@ -858,7 +859,7 @@ function MyPromise(fn) {
858859
})
859860
}
860861
861-
// to solve the following problem
862+
// para resolver o seguinte problema
862863
// `new Promise(() => throw Error('error))`
863864
try {
864865
fn(_this.resolve, _this.reject);
@@ -869,19 +870,19 @@ function MyPromise(fn) {
869870
870871
MyPromise.prototype.then = function(onResolved, onRejected) {
871872
const self = this;
872-
// specification 2.2.7, `then` must return a new promise
873+
// especificação 2.2.7, `then` deve retornar uma nova promise
873874
let promise2;
874-
// specification 2.2, both `onResolved` and `onRejected` are optional arguments
875-
// it should be ignored if `onResolved` or `onRjected` is not a function,
876-
// which implements the penetrate pass of it's value
875+
// especificação 2.2, ambos `onResolved` e `onRejected` são argumentos opcionais
876+
// isso deveria ser ignorado se `onResolved` ou `onRjected` não for uma função,
877+
// do qual implementa a penetrar a passagem desse valor
877878
// `Promise.resolve(4).then().then((value) => console.log(value))`
878879
onResolved = typeof onResolved === 'function' ? onResolved : v => v;
879880
onRejected = typeof onRejected === 'function' ? onRejected : r => throw r;
880881

881882
if (self.currentState === RESOLVED) {
882883
return (promise2 = new MyPromise((resolve, reject) => {
883-
// specification 2.2.4, wrap them with `setTimeout`,
884-
// in order to insure that `onFulfilled` and `onRjected` execute asynchronously
884+
// especificação 2.2.4, encapsula eles com `setTimeout`,
885+
// em ordem para garantir que `onFulfilled` e `onRjected` executam assícronamente
885886
setTimeout(() => {
886887
try {
887888
let x = onResolved(self.value);
@@ -895,7 +896,7 @@ MyPromise.prototype.then = function(onResolved, onRejected) {
895896

896897
if (self.currentState === REJECTED) {
897898
return (promise2 = new MyPromise((resolve, reject) => {
898-
// execute `onRejected` asynchronously
899+
// execute `onRejected` assícronamente
899900
setTimeout(() => {
900901
try {
901902
let x = onRejected(self.value);
@@ -910,7 +911,7 @@ MyPromise.prototype.then = function(onResolved, onRejected) {
910911
if (self.currentState === PENDING) {
911912
return (promise2 = new MyPromise((resolve, reject) => {
912913
self.resolvedCallbacks.push(() => {
913-
// Considering that it may throw error, wrap them with `try/catch`
914+
// Considerando que isso deve lançar um erro, encapsule eles com `try/catch`
914915
try {
915916
let x = onResolved(self.value);
916917
resolutionProcedure(promise2, x, resolve, reject);
@@ -931,22 +932,22 @@ MyPromise.prototype.then = function(onResolved, onRejected) {
931932
}
932933
}
933934

934-
// specification 2.3
935+
// especificação 2.3
935936
function resolutionProcedure(promise2, x, resolve, reject) {
936-
// specification 2.3.1,`x` and `promise2` can't refer to the same object,
937-
// avoiding the circular references
937+
// especificação 2.3.1,`x` e `promise2` não podem ser referenciados para o mesmo objeto,
938+
// evitando referência circular
938939
if (promise2 === x) {
939940
return reject(new TypeError('Error'));
940941
}
941942

942-
// specification 2.3.2, if `x` is a Promise and the state is `pending`,
943-
// the promise must remain, If not, it should execute.
943+
// especificação 2.3.2, se `x` é uma Promise e o estado é `pending`,
944+
// a promisse deve permanecer, se não, ele deve ser executado.
944945
if (x instanceof MyPromise) {
945946
if (x.currentState === PENDING) {
946-
// call the function `resolutionProcedure` again to
947-
// confirm the type of the argument that x resolves
948-
// If it's a primitive type, it will be resolved again to
949-
// pass the value to next `then`.
947+
// chame a função `resolutionProcedure` novamente para
948+
// confirmar o tipo de argumento que x resolve
949+
// Se for um tipo primitivo, irá ser resolvido novamente
950+
// passando o valor para o próximo `then`.
950951
x.then((value) => {
951952
resolutionProcedure(promise2, value, resolve, reject);
952953
}, reject)
@@ -956,31 +957,31 @@ function resolutionProcedure(promise2, x, resolve, reject) {
956957
return;
957958
}
958959

959-
// specification 2.3.3.3.3
960-
// if both `reject` and `resolve` are executed, the first successful
961-
// execution takes precedence, and any further executions are ignored
960+
// especificação 2.3.3.3.3
961+
// se ambos `reject` e `resolve` forem executado, a primeira execução
962+
// de sucesso tem precedência, e qualquer execução é ignorada
962963
let called = false;
963-
// specification 2.3.3, determine whether `x` is an object or a function
964+
// especificação 2.3.3, determina se `x` é um objeto ou uma função
964965
if (x !== null && (typeof x === 'object' || typeof x === 'function')) {
965-
// specification 2.3.3.2, if can't get `then`, execute the `reject`
966+
// especificação 2.3.3.2, se não conseguir obter o `then`, execute o `reject`
966967
try {
967-
// specification 2.3.3.1
968+
// especificação 2.3.3.1
968969
let then = x.then;
969-
// if `then` is a function, call the `x.then`
970+
// se `then` é uma função, chame o `x.then`
970971
if (typeof then === 'function') {
971-
// specification 2.3.3.3
972+
// especificação 2.3.3.3
972973
then.call(x, y => {
973974
if (called) return;
974975
called = true;
975-
// specification 2.3.3.3.1
976+
// especificação 2.3.3.3.1
976977
resolutionProcedure(promise2, y, resolve, reject);
977978
}, e => {
978979
if (called) return;
979980
called = true;
980981
reject(e);
981982
});
982983
} else {
983-
// specification 2.3.3.4
984+
// especificação 2.3.3.4
984985
resolve(x);
985986
}
986987
} catch (e) {
@@ -989,24 +990,24 @@ function resolutionProcedure(promise2, x, resolve, reject) {
989990
reject(e);
990991
}
991992
} else {
992-
// specification 2.3.4, `x` belongs to primitive data type
993+
// especificação 2.3.4, `x` pertence ao tipo primitivo de dados
993994
resolve(x);
994995
}
995996
}
996997
```
997998
998-
The above codes, which is implemented based on the Promise / A+ specification, can pass the full test of `promises-aplus-tests`
999+
O código acima, que é implementado baseado em Promise / A+ especificação, pode passar os testes completos de `promises-aplus-tests`
9991000
10001001
![](https://user-gold-cdn.xitu.io/2018/3/29/162715e8e37e689d?w=1164&h=636&f=png&s=300285)
10011002
1002-
# Generator Implementation
1003+
# Implementação do Generator
10031004
1004-
Generator is an added syntactic feature in ES6. Similar to `Promise`, it can be used for asynchronous programming.
1005+
Generator é uma funcionalidade sintática adicionada no ES6. Similar a `Promise`, pode ser usado para programação assíncrona.
10051006
10061007
```js
1007-
// * means this is a Generator function
1008-
// yield within the block can be used to pause the execution
1009-
// next can resume execution
1008+
// * significa que isso é uma função Generator
1009+
// yield dentro de um bloco pode ser usado para pausar a execução
1010+
// next consegue resumir a execução
10101011
function* test() {
10111012
let a = 1 + 2;
10121013
yield 2;
@@ -1018,10 +1019,9 @@ console.log(b.next()); // > { value: 3, done: false }
10181019
console.log(b.next()); // > { value: undefined, done: true }
10191020
```
10201021
1021-
As we can tell from the above code, a function with a `*` would have the `next` function execution. In other words, the execution of the function returns an object. Every call to the `next` function can resume executing the paused code. A simple implementation of the Generator function is shown below:
1022-
1022+
Como podemos dizer no código acima, a função com um `*` teria a execução da função `next`. Em outras palavras, a execução de função retorna um objeto. Toda chamada a função `next` pode continuar a execução do código pausado. Um simples implementação da função Generator é mostrada abaixo:
10231023
```js
1024-
// cb is the compiled 'test' function
1024+
// cb é a função 'test' compilada
10251025
function generator(cb) {
10261026
return (function() {
10271027
var object = {
@@ -1041,23 +1041,23 @@ function generator(cb) {
10411041
};
10421042
})();
10431043
}
1044-
// After babel's compilation, 'test' function turns into this:
1044+
// Depois da compilação do babel's, a função 'test' retorna dentro dessa:
10451045
function test() {
10461046
var a;
10471047
return generator(function(_context) {
10481048
while (1) {
10491049
switch ((_context.prev = _context.next)) {
1050-
// yield splits the code into several blocks
1051-
// every 'next' call executes one block of clode
1052-
// and indicates the next block to execute
1050+
// yield separa o código em diversos blocos
1051+
// cada chamada 'next' executa um bloco de código
1052+
// e indica o próximo bloco a ser executado
10531053
case 0:
10541054
a = 1 + 2;
10551055
_context.next = 4;
10561056
return 2;
10571057
case 4:
10581058
_context.next = 6;
10591059
return 3;
1060-
// execution complete
1060+
// execução completa
10611061
case 6:
10621062
case "end":
10631063
return _context.stop();
@@ -1069,30 +1069,30 @@ function test() {
10691069
10701070
# Debouncing
10711071
1072-
Have you ever encountered this problem in your development: how to do a complex computation in a scrolling event or to prevent the "second accidental click" on a button?
1072+
Tendo você encontrado esse problema e seu dia-a-dia no desenvolvimento: como fazer uma computação complexa em um evento de scroll ou prevenir o "segundo clique acidental" no butão?
10731073
1074-
These requirements can be achieved with function debouncing. Especially for the first one, if complex computations are carried out in frequent event callbacks, there's a large chance that the page becomes laggy. It's better to combine multiple computations into a single one, and only operate at particular time. Since there are many libraries that implement debouncing, we won't build our own here and will just take underscore's source code to explain debouncing:
1074+
Esses requisitos podem ser alcançados com funcões debouncing. Especialmente para o primeiro, se uma computação complexa estiver sendo chamado em frequentes eventos de callbacks, existe uma grande chance que a página se torne lenta. É melhor combinar essas multiplas computações e uma, e apenas operar em determinado periodo de tempo. Desde que existe muitas bibliotecas que implementam debouncing, nós não construimos nosso próprio aqui e vamos pegar o código do underscore para explicar o debouncing:
10751075
10761076
```js
10771077
/**
1078-
* underscore's debouncing function. When the callback function is called in series, func will only execute when the idel time is larger or equal to `wait`.
1078+
* função underscore debouncing. Quando a função callback é chamada em série, a funcão vai executar apenas quando o tempo ideal é maior ou igual ao `wait`.
10791079
*
1080-
* @param {function} func callback function
1081-
* @param {number} wait length of waiting intervals
1082-
* @param {boolean} immediate when set to true, func is executed immediately
1083-
* @return {function} returns the function to be called by the client
1080+
* @param {function} func função callback
1081+
* @param {number} wait tamanho do intervalo de espera
1082+
* @param {boolean} immediate quando definido para true, func é executada imadiatamente
1083+
* @return {function} retorna a função a ser chamada pelo cliente
10841084
*/
10851085
_.debounce = function(func, wait, immediate) {
10861086
var timeout, args, context, timestamp, result;
10871087

10881088
var later = function() {
1089-
// compare now to the last timestamp
1089+
// compara now para o último timestamp
10901090
var last = _.now() - timestamp;
1091-
// if the current time interval is smaller than the set interval and larger than 0, then reset the timer.
1091+
// se o tempo de intervalo atual é menor então o set interval é maior que 0, então reinicie o timer.
10921092
if (last < wait && last >= 0) {
10931093
timeout = setTimeout(later, wait - last);
10941094
} else {
1095-
// otherwise it's time to execute the callback function
1095+
// senão é o momento de executar a função callback
10961096
timeout = null;
10971097
if (!immediate) {
10981098
result = func.apply(context, args);
@@ -1104,14 +1104,14 @@ _.debounce = function(func, wait, immediate) {
11041104
return function() {
11051105
context = this;
11061106
args = arguments;
1107-
// obtain the timestamp
1107+
// obtendo o timestamp
11081108
timestamp = _.now();
1109-
// if the timer doesn't exist then execute the function immediately
1109+
// se o timer não existir então execute a função imediatamente
11101110
var callNow = immediate && !timeout;
1111-
// if the timer doesn't exist then create one
1111+
// se o time não existe então crie um
11121112
if (!timeout) timeout = setTimeout(later, wait);
11131113
if (callNow) {
1114-
// if the immediate execution is needed, use apply to start the function
1114+
// se a função imediata é precisa, use aplly para começar a função
11151115
result = func.apply(context, args);
11161116
context = args = null;
11171117
}
@@ -1121,57 +1121,57 @@ _.debounce = function(func, wait, immediate) {
11211121
};
11221122
```
11231123
1124-
The complete function implementation is not too difficult. Let's summarize here.
1124+
A implementação completa da ƒunção não é tão difícil.
11251125
1126-
- For the implementation of protecting against accidental clicks: as long as I start a timer and the timer is there, no matter how you click the button, the callback function won't be executed. Whenever the timer ends and is set to `null`, another click is allowed.
1127-
- For the implementation of a delayed function execution: every call to the debouncing function will trigger an evaluation of time interval between the current call and the last one. If the interval is less than the required, another timer will be created, and the delay is set to the set interval minus the previous elapsed time. When the time's up, the corresponding callback function is executed.
1126+
- Para a implementação de proteger contra clicks acidentais: enquanto eu começar o time e o time existir, não importa quantas vezes eu clicar o butão, a função de callback não será executada. Contudo quando o time termina, é setado para `null`, outro click é permitido.
1127+
- Para a implementação da executação da função de atraso: toda chamada para a função debouncing vai disparar um tempo de intervalo equivalente entre a chamada tual e a última chamada. Se o intervalo é menor que o requerido, outro time será cirado, e o atraso é atribuido ao set interval menos o tempo anterior. Quando o tempo passa, a função de callback é executada.
11281128
11291129
# Throttle
11301130
1131-
`Debounce` and `Throttle` are different in nature. `Debounce` is to turn multiple executions into one last execution, and `Throttle` is to turn multiple executions into executions at regular intervals.
1131+
`Debounce` e `Throttle` possuem naturezas diferentes. `Debounce` é para tornar multiplas execuções na última execução, e `Throttle` é para tornar multiplas execuções em uma execução de intervalos regulares.
11321132
11331133
```js
1134-
// The first two parameters with debounce are the same function
1135-
// options: You can pass two properties
1136-
// trailing: Last time does not execute
1137-
// leading: First time does not execute
1138-
// The two properties cannot coexist, otherwise the function cannot be executed
1134+
// Os dois primeiro parâmetros com debounce são a mesma função
1135+
// options: você pode passar duas propriedades
1136+
// trailing: o último tempo não é executado
1137+
// leading: o primeiro tempo não é executado
1138+
// As duas propriedades não coexistem, contudo a função não será executada
11391139
_.throttle = function(func, wait, options) {
11401140
var context, args, result;
11411141
var timeout = null;
1142-
// Previous timestamp
1142+
// timestamp anterior
11431143
var previous = 0;
1144-
// Set empty if options is not passed
1144+
// Defina vázio se as opções não forem passadas
11451145
if (!options) options = {};
1146-
// Timer callback function
1146+
// Função Timer callback
11471147
var later = function() {
1148-
// If you set `leading`, then set `previous` to zero
1149-
// The first `if` statement of the following function is used
1148+
// se você definiu `leading`, então defina `previous` para zero
1149+
// O primeiro if da seguinte função é usada
11501150
previous = options.leading === false ? 0 : _.now();
1151-
// The first is prevented memory leaks and the second is judged the following timers when setting `timeout` to null
1151+
// O primeiro é prevenindo memory leaks e o segundo é julgado os seguintes timers quando configurado `timeout` para null
11521152
timeout = null;
11531153
result = func.apply(context, args);
11541154
if (!timeout) context = args = null;
11551155
};
11561156
return function() {
1157-
// Get current timestamp
1157+
// Obtenha o timestamp atual
11581158
var now = _.now();
1159-
// It must be true when it entering firstly
1160-
// If you do not need to execute the function firstly
1161-
// Set the last timestamp to current
1162-
// Then it will be greater than 0 when the remaining time is calculated next
1159+
// Deve ser verdado quando entrar pela primeira vez
1160+
// Se você não precisa executar essa função na primeira vez
1161+
// Defina o último timestamp para o atual
1162+
// Então ele será maior que 0 quando o termo remanecente for calculado da próxima vez
11631163
if (!previous && options.leading === false)
11641164
previous = now;
11651165
var remaining = wait - (now - previous);
11661166
context = this;
11671167
args = arguments;
1168-
// This condition will only be entered if it set `trailing`
1169-
// This condition will be entered firstly if it not set `leading`
1170-
// Another point, you may think that this condition will not be entered if you turn on the timer
1171-
// In fact, it will still enter because the timer delay is not accurate
1172-
// It is very likely that you set 2 seconds, but it needs 2.2 seconds to trigger, then this time will enter this condition
1168+
// Essa condição só será preenchida se definido para `trailing`
1169+
// Essa condição só será preenchida no ínicio se não definido `leading`
1170+
// Outro ponto, você deve pensar que essa condição não será preenchida se você ligar o timer
1171+
// De fato, será assim até entrar porque o atraso do timer não é acurado
1172+
// Isso é muito como se você setar a 2 segundos, mas ele precisa 2.2 segundos para disparar, então o tempo será preenchido nessa condição
11731173
if (remaining <= 0 || remaining > wait) {
1174-
// Clean up if there exist a timer otherwise it call twice callback
1174+
// Limpe se existe um timer e ele chama a callback duas vezes
11751175
if (timeout) {
11761176
clearTimeout(timeout);
11771177
timeout = null;
@@ -1180,25 +1180,25 @@ _.throttle = function(func, wait, options) {
11801180
result = func.apply(context, args);
11811181
if (!timeout) context = args = null;
11821182
} else if (!timeout && options.trailing !== false) {
1183-
// Judgment whether timer and trailing are set
1184-
// And you can't set leading and trailing at the same time
1183+
// Julge se o timer e trailing forem definidos
1184+
// E você não pode defirnor leading e trailing no mesmo instante
11851185
timeout = setTimeout(later, remaining);
11861186
}
11871187
return result;
11881188
};
11891189
};
11901190
```
11911191
1192-
# Map、FlatMap and Reduce
1192+
# Map、FlatMap e Reduce
11931193
1194-
The effect of `Map` is to generate a new array, iterate over the original array, take each element out to do some transformation, and then `append` to the new array.
1194+
O efeito do `Map` é para gerar um novo array, iterando sobre o array original, tomando cada elemento para fazer alguma transformação, e então `append` para um novo array.
11951195
11961196
```js
11971197
[1, 2, 3].map((v) => v + 1)
11981198
// -> [2, 3, 4]
11991199
```
12001200
1201-
`Map` has three parameters, namely the current index element, the index, the original array.
1201+
`Map` tem três parâmetros, nomeando o índice atual do elemento, o índice, o array original.
12021202
12031203
```js
12041204
['1','2','3'].map(parseInt)
@@ -1207,14 +1207,14 @@ The effect of `Map` is to generate a new array, iterate over the original array,
12071207
// parseInt('3', 2) -> NaN
12081208
```
12091209
1210-
The effect of `FlatMap` is almost the same with a `Map`, but the original array will be flatten for multidimensional arrays. You can think of `FlatMap` as a `map` and a `flatten`, which is currently not supported in browsers.
1210+
O efeito do `FlatMap` é quase o mesmo do `Map`, mas o array original será substituído para um array multidimensional. Você pode pensar no `FlatMap` com um `map` e um `flatten`, que atualmente não é suportado nos navegadores.
12111211
12121212
```js
12131213
[1, [2], 3].flatMap((v) => v + 1)
12141214
// -> [2, 3, 4]
12151215
```
12161216
1217-
You can achieve this when you want to completely reduce the dimensions of a multidimensional array:
1217+
Você pode alcançar isso quando você quer reduzir completamente dimensões de um array multidimensional:
12181218
12191219
```js
12201220
const flattenDeep = (arr) => Array.isArray(arr)
@@ -1224,7 +1224,7 @@ const flattenDeep = (arr) => Array.isArray(arr)
12241224
flattenDeep([1, [[2], [3, [4]], 5]])
12251225
```
12261226
1227-
The effect of `Reduce` is to combine the values in the array and get a final value:
1227+
O efeito do `Reduce` é para combinar os valores em um array e pegar o valor final:
12281228
12291229
```js
12301230
function a() {
@@ -1240,9 +1240,9 @@ function b() {
12401240
```
12411241
12421242
1243-
# Async and await
1243+
# Async e await
12441244
1245-
`async` function will return a `Promise`:
1245+
A função `async` vai retornar uma `Promise`:
12461246
12471247
```js
12481248
async function test() {
@@ -1251,9 +1251,9 @@ async function test() {
12511251
console.log(test()); // -> Promise {<resolved>: "1"}
12521252
```
12531253
1254-
You can think of `async` as wrapping a function using `Promise.resolve()`.
1254+
Você pode pensar em `async` como uma função encapsuladora usando `Promise.resolve()`.
12551255
1256-
`await` can only be used in `async` functions:
1256+
`await` pode ser usado apenas em funcões `async`:
12571257
12581258
```js
12591259
function sleep() {
@@ -1271,11 +1271,11 @@ async function test() {
12711271
test()
12721272
```
12731273
1274-
The above code will print `finish` before printing `object`. Because `await` waits for the `sleep` function `resolve`, even if the synchronization code is followed, it is not executed before the asynchronous code is executed.
1274+
O código acime vai exibir `finish` antes de exibir `object`. Porque `await` espera pela funcão `sleep` `resolve`, mesmo se a sincronização de código estiver seguida, ele não executa antes do código assíncrono ser executado.
12751275
1276-
The advantage of `async` and `await` compared to the direct use of `Promise` lies in handling the call chain of `then`, which can produce clear and accurate code. The downside is that misuse of `await` can cause performance problems because `await` blocks the code. Perhaps the asynchronous code does not depend on the former, but it still needs to wait for the former to complete, causing the code to lose concurrency.
1276+
A vantagem do `async` e `await` comparado ao uso direto da `Promise` mente em manipular a cadeia de chamada do `then`, que pode produzir código claro e acurado. A desvantagem é que uso indevido do `await` pode causar problemas de performance porque `await` bloqueia o código. Possivelmente o código assíncrono não depende do anterior, mas ele ainda precisa esperar o anterir ser completo, ocasionando perda de concorrência.
12771277
1278-
Let's look at a code that uses `await`:
1278+
Vamos dar uma olhada em um código que usa `await`:
12791279
12801280
```js
12811281
var a = 0
@@ -1290,24 +1290,24 @@ a++
12901290
console.log('1', a) // -> '1' 1
12911291
```
12921292
1293-
You may have doubts about the above code, here we explain the principle:
1293+
Você pode ter dúvidas sobre o código acima, aqui nós explicamos o príncipio:
12941294
1295-
- First the function `b` is executed. The variable `a` is still 0 before execution `await 10`, Because the `Generators` are implemented inside `await` and `Generators` will keep things in the stack, so at this time `a = 0` is saved
1296-
- Because `await` is an asynchronous operation, `console.log('1', a)` will be executed first.
1297-
- At this point, the synchronous code is completed and asynchronous code is started. The saved value is used. At this time, `a = 10`
1298-
- Then comes the usual code execution
1295+
- Primeiro a função `b` é executada. A variável `a` ainda é zero antes da execução do `await 10`, porque os `Generators` são implementados dentro do `await` e `Generators` matém as coisas na pilha, então nesse momento `a = 0` é salvo
1296+
- Porque `await` é uma operação assíncrona, `console.log('1', a)` será executada primeiro.
1297+
- Nesse ponto, o código síncrono é completado e o código assíncrono é iniciado. O valor salvo é usado. Nesse instante, `a = 10`
1298+
- Então chega a execução usual do código
12991299
13001300
# Proxy
13011301
1302-
Proxy is a new feature since ES6. It can be used to define operations in objects:
1302+
Proxy é uma nova funcionalidade desde o ES6. Ele costuma ser usado para definir operações em objetos:
13031303
13041304
```js
13051305
let p = new Proxy(target, handler);
1306-
// `target` represents the object of need to add the proxy
1307-
// `handler` customizes operations in the object
1306+
// `target` representa o objeto que precisamos adicionar o proxy
1307+
// `handler` operações customizadas no objeto
13081308
```
13091309
1310-
Proxy can be handy for implementation of data binding and listening:
1310+
Proxy podem ser conveniente para implementação de data bindind e listening:
13111311
13121312
```js
13131313
let onWatch = (obj, setBind, getLogger) => {
@@ -1331,74 +1331,74 @@ let p = onWatch(obj, (v) => {
13311331
}, (target, property) => {
13321332
console.log(`Get '${property}' = ${target[property]}`);
13331333
})
1334-
p.a = 2 // bind `value` to `2`
1335-
p.a // -> Get 'a' = 2
1334+
p.a = 2 // liga `value` para `2`
1335+
p.a // -> obtém 'a' = 2
13361336
```
13371337
1338-
# Why 0.1 + 0.2 != 0.3
1338+
# Por que 0.1 + 0.2 != 0.3
13391339
1340-
Because JS uses the IEEE 754 double-precision version (64-bit). Every language that uses this standard has this problem.
1340+
Porque JS usa a precisão-dupla do IEEE 754 versão (64-bit). Toda linguagem que usa esse padrão tem esse problema.
13411341
1342-
As we know, computers use binaries to represent decimals, so `0.1` in binary is represented as
1342+
Como nós sabemos, computadores usam binários para representar decimais, então `0.1` em binário é representado como
13431343
13441344
```js
1345-
// (0011) represents cycle
1345+
// (0011) representa o ciclo
13461346
0.1 = 2^-4 * 1.10011(0011)
13471347
```
13481348
1349-
How do we come to this binary number? We can try computing it as below:
1349+
Como nós chegamos a esse número binário? Podemos tentar computar ele como abaixo:
13501350
13511351
![](https://user-gold-cdn.xitu.io/2018/4/26/162ffcb7fc1ca5a9?w=800&h=1300&f=png&s=83139)
13521352
1353-
Binary computations in float numbers are different from those in integers. For multiplications, only the float bits are computed, while the integer bits are used for the binaries for each bit. Then the first bit is used as the most significant bit. Therefore we get `0.1 = 2^-4 * 1.10011(0011)`.
1353+
Computações binária em números flutuantes são diferentes daqueles em inteiros. Por multiplicação, apenas bits flutuantes são computados, enquanto bits do tipo inteiro são usados pelos binários para cada bit. Então o primeiro bit é usado como o bit mais significante. Assim sendo nós obtemos 0.1 = 2^-4 * 1.10011(0011)`.
13541354

1355-
`0.2` is similar. We just need to get rid of the first multiplcation and get `0.2 = 2^-3 * 1.10011(0011)`.
1355+
`0.2` é similar. Nós apenas precisamos passear na primeira multiplicação e obter `0.2 = 2^-3 * 1.10011(0011)`
13561356

1357-
Back to the double float for IEEE 754 standard. Among the 64 bits, one bit is used for signing, 11 used for integer bits, and the rest 52 bits are floats. Since `0.1` and `0.2` are infinitely cycling binaries, the last bit of the floats needs to indicate whether to round (same as rounding in decimals).
1357+
Voltando a precisão dupla pelo padrão IEE 754. Entre o 64 bits, um bit é usado para assinatura, 11 é usado para bits inteiros, e o outros 52 bits são floats. Uma vez que `0.1` e `0.2` são ciclos infinitos de binários, o último bit do float precisa indicar se volta (mesmo como o arredendomaneto em decimal).
13581358

1359-
After rounding, `2^-4 * 1.10011...001` becomes `2^-4 * 1.10011(0011 * 12 times)010`. After adding these two binaries we get `2^-2 * 1.0011(0011 * 11 times)0100`, which is `0.30000000000000004` in decimals.
1359+
Depois do arredondamento, `2^-4 * 1.10011...001` se torna `2^-4 * 1.10011(0011 * 12 vezes)010`. Depois de adicionado esses dois binários obtemos `2^-2 * 1.0011(0011 * 11 vezes)0100`, que é `0.30000000000000004` em decimal.
13601360

1361-
The native solution to this problem is shown below:
1361+
A solução nativa pra esse problema é mostrado abaixo:
13621362

13631363
```js
13641364
parseFloat((0.1 + 0.2).toFixed(10))
13651365
```
13661366

1367-
# Regular Expressions
1367+
# Expressões Regulares
13681368

1369-
## Metacharacters
1369+
## Metacaracteres
13701370

1371-
| Metacharacter | Effect |
1371+
| Metacaractere | Efeito |
13721372
| :-----------: | :----------------------------------------------------------: |
1373-
| . | matches any character except line terminators: \n, \r, \u2028 or \u2029. |
1374-
| [] | matches anything within the brackets. For example, [0-9] can match any number |
1375-
| ^ | ^9 means matching anything that starts with '9'; [`^`9] means not matching characters except '9' in between brackets |
1376-
| {1, 2} | matches 1 or 2 digit characters |
1377-
| (yck) | only matches strings the same as 'yck' |
1378-
| \| | matches any character before and after \| |
1379-
| \ | escape character |
1380-
| * | matches the preceding expression 0 or more times |
1381-
| + | matches the preceding expression 1 or more times |
1382-
| ? | the character before '?' is optional |
1383-
1384-
## Flags
1385-
1386-
| Flag | Effect |
1387-
| :------: | :--------------: |
1388-
| i | case-insensitive search |
1389-
| g | matches globally |
1390-
| m | multiline |
1391-
1392-
## Character Shorthands
1393-
1394-
| shorthand | Effect |
1373+
| . | corresponde a qualquer caractere exceto de terminadores de linhas: \n, \r, \u2028 or \u2029. |
1374+
| [] | corresponde a qualquer coisa dentro dos colchetes. Por exemplo, [0-9] corresponde a qualquer número |
1375+
| ^ | ^9 significa corresponder qualquer coisa que começa com '9'; [`^`9] significa não corresponder aos caracteres exceto '9' nos colchetes |
1376+
| {1, 2} | corresponde 1 ou 2 caracteres digitais |
1377+
| (yck) | corresponde apenas strings com o mesmo 'yck' |
1378+
| \| | corresponde a qualquer caractere antes e depois \| |
1379+
| \ | caracter de escape |
1380+
| * | corresponde a expressão precedente 0 ou mais vezes |
1381+
| + | corresponde a expressão precedente 1 ou mais vezes |
1382+
| ? | o caractere antes do '?' é opcional |
1383+
1384+
## Bandeiras
1385+
1386+
| Bandeira | Efeito |
1387+
| :------: | :--------------: |
1388+
| i | pesquisa insensível a maiúsculas e minúsculas |
1389+
| g | corresponde globalmente |
1390+
| m | multilinha |
1391+
1392+
## Caracteres Atalhos
1393+
1394+
| Atalho | Efeito |
13951395
| :--: | :------------------------: |
1396-
| \w | alphanumeric characters, underline character |
1397-
| \W | the opposite of the above |
1398-
| \s | any blank character |
1399-
| \S | the opposite of the above |
1400-
| \d | numbers |
1401-
| \D | the opposite of the above |
1402-
| \b | start or end of a word |
1403-
| \B | the opposite of the above |
1396+
| \w | caracteres alfanuméricos, caracteres sublinhados |
1397+
| \W | o oposto do acima |
1398+
| \s | qualquer caractere em branco |
1399+
| \S | o oposto do acima |
1400+
| \d | números |
1401+
| \D | o oposto do acima |
1402+
| \b | inicio ou fim da palavra |
1403+
| \B | o oposto do acima |
14041404

0 commit comments

Comments
 (0)
Please sign in to comment.