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
Copy file name to clipboardExpand all lines: 1-js/01-getting-started/2-manuals-specifications/article.md
+1-17Lines changed: 1 addition & 17 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -13,33 +13,17 @@ Uma nova versão dessa especificação é lançada todos os anos. Entre estes la
13
13
14
14
Para ler sobre as mais novas funcionalidades (*bleeding-edge features*), incluindo as que estão em fase de padronização (chamadas também de "estágio 3"), veja as suas propostas em <https://github.com/tc39/proposals>.
15
15
16
-
<<<<<<< HEAD
17
16
E mais, se você está desenvolvendo para browsers, há outras especificações que cobrem esta demanda na [segunda parte](info:browser-environment) do tutorial.
18
-
=======
19
-
Also, if you're in developing for the browser, then there are other specifications covered in the [second part](info:browser-environment) of the tutorial.
20
-
>>>>>>> 3a0b3f4e31d4c4bbe90ed4c9c6e676a888ad8311
21
17
22
18
## Manuais
23
19
24
-
<<<<<<< HEAD
25
-
-**MDN (Mozilla) JavaScript Reference** é um manual com exemplos e outras informações. É ótimo para um entendimento sobre funções, métodos da linguagem, etc.
26
-
=======
27
-
-**MDN (Mozilla) JavaScript Reference** is the main manual with examples and other information. It's great to get in-depth information about individual language functions, methods etc.
28
-
>>>>>>> 3a0b3f4e31d4c4bbe90ed4c9c6e676a888ad8311
20
+
-**MDN (Mozilla) JavaScript Reference** é um manual com exemplos e outras informações. É ótimo para um entendimento sobre funções da linguagem, métodos , etc.
29
21
30
22
Pode ser encontrado em <https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference>.
31
23
32
-
<<<<<<< HEAD
33
24
Porém, às vezes é melhor fazer uma busca na internet. Apenas use "MDN [termo]" na busca, por exemplo: <https://google.com/search?q=MDN+parseInt> para procurar pela função `parseInt`.
34
25
35
-
-**MSDN** - Manual da Microsoft com muitas informações, incluindo JavaScript (frequentemente referido como JScript). Se precisar de algo específico para o Internet Explorer, é melhor ir por aqui: <http://msdn.microsoft.com/>.
36
-
37
-
Assim como para o manual da Mozilla, também podemos fazer uma busca na internet com frases do tipo "RegExp MSDN" ou "RegExp MSDN jscript".
38
-
39
26
## Tabelas de compatibilidade
40
-
=======
41
-
Although, it's often best to use an internet search instead. Just use "MDN [term]" in the query, e.g. <https://google.com/search?q=MDN+parseInt> to search for `parseInt` function.
42
-
>>>>>>> 3a0b3f4e31d4c4bbe90ed4c9c6e676a888ad8311
43
27
44
28
JavaScript é uma linguagem em desenvolvimento, novas funcionalidades são adicionadas regularmente.
Copy file name to clipboardExpand all lines: 1-js/04-object-basics/03-garbage-collection/article.md
+1-1Lines changed: 1 addition & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -207,6 +207,6 @@ A general book "The Garbage Collection Handbook: The Art of Automatic Memory Man
207
207
208
208
If you are familiar with low-level programming, the more detailed information about V8 garbage collector is in the article [A tour of V8: Garbage Collection](http://jayconrod.com/posts/55/a-tour-of-v8-garbage-collection).
209
209
210
-
[V8 blog](http://v8project.blogspot.com/) also publishes articles about changes in memory management from time to time. Naturally, to learn the garbage collection, you'd better prepare by learning about V8 internals in general and read the blog of [Vyacheslav Egorov](http://mrale.ph) who worked as one of V8 engineers. I'm saying: "V8", because it is best covered with articles in the internet. For other engines, many approaches are similar, but garbage collection differs in many aspects.
210
+
[V8 blog](https://v8.dev/) also publishes articles about changes in memory management from time to time. Naturally, to learn the garbage collection, you'd better prepare by learning about V8 internals in general and read the blog of [Vyacheslav Egorov](http://mrale.ph) who worked as one of V8 engineers. I'm saying: "V8", because it is best covered with articles in the internet. For other engines, many approaches are similar, but garbage collection differs in many aspects.
211
211
212
212
In-depth knowledge of engines is good when you need low-level optimizations. It would be wise to plan that as the next step after you're familiar with the language.
Copy file name to clipboardExpand all lines: 1-js/04-object-basics/06-constructor-new/article.md
+6-2Lines changed: 6 additions & 2 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -83,7 +83,7 @@ let user = new function() {
83
83
The constructor can't be called again, because it is not saved anywhere, just created and called. So this trick aims to encapsulate the code that constructs the single object, without future reuse.
84
84
````
85
85
86
-
## Dual-syntax constructors: new.target
86
+
## Constructor mode test: new.target
87
87
88
88
```smart header="Advanced stuff"
89
89
The syntax from this section is rarely used, skip it unless you want to know everything.
@@ -109,7 +109,9 @@ new User(); // function User { ... }
109
109
*/!*
110
110
```
111
111
112
-
That can be used to allow both `new` and regular calls to work the same. That is, create the same object:
112
+
That can be used inside the function to know whether it was called with `new`, "in constructor mode", or without it, "in regular mode".
113
+
114
+
We can also make both `new` and regular calls to do the same, like this:
113
115
114
116
```js run
115
117
functionUser(name) {
@@ -210,6 +212,8 @@ john = {
210
212
*/
211
213
```
212
214
215
+
To create complex objects, there's a more advanced syntax, [classes](info:classes), that we'll cover later.
216
+
213
217
## Summary
214
218
215
219
- Constructor functions or, briefly, constructors, are regular functions, but there's a common agreement to name them with capital letter first.
Copy file name to clipboardExpand all lines: 1-js/04-object-basics/08-symbol/article.md
+22-17Lines changed: 22 additions & 17 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -16,7 +16,7 @@ A value of this type can be created using `Symbol()`:
16
16
let id =Symbol();
17
17
```
18
18
19
-
We can also give symbol a description (also called a symbol name), mostly useful for debugging purposes:
19
+
Upon creation, we can give symbol a description (also called a symbol name), mostly useful for debugging purposes:
20
20
21
21
```js
22
22
// id is a symbol with the description "id"
@@ -94,7 +94,7 @@ What's the benefit of using `Symbol("id")` over a string `"id"`?
94
94
95
95
As `user` objects belongs to another code, and that code also works with them, we shouldn't just add any fields to it. That's unsafe. But a symbol cannot be accessed accidentally, the third-party code probably won't even see it, so it's probably all right to do.
96
96
97
-
Imagine that another script wants to have its own "id" property inside `user`, for its own purposes. That may be another JavaScript library, so the scripts are completely unaware of each other.
97
+
Also, imagine that another script wants to have its own identifier inside `user`, for its own purposes. That may be another JavaScript library, so that the scripts are completely unaware of each other.
98
98
99
99
Then that script can create its own `Symbol("id")`, like this:
100
100
@@ -105,9 +105,9 @@ let id = Symbol("id");
105
105
user[id] ="Their id value";
106
106
```
107
107
108
-
There will be no conflict, because symbols are always different, even if they have the same name.
108
+
There will be no conflict between our and their identifiers, because symbols are always different, even if they have the same name.
109
109
110
-
Now note that if we used a string `"id"` instead of a symbol for the same purpose, then there *would* be a conflict:
110
+
...But if we used a string `"id"` instead of a symbol for the same purpose, then there *would* be a conflict:
111
111
112
112
```js
113
113
let user = { name:"John" };
@@ -123,7 +123,7 @@ user.id = "Their id value"
123
123
124
124
### Symbols in an object literal
125
125
126
-
If we want to use a symbol in an object literal, we need square brackets.
126
+
If we want to use a symbol in an object literal`{...}`, we need square brackets around it.
127
127
128
128
Like this:
129
129
@@ -161,7 +161,7 @@ for (let key in user) alert(key); // name, age (no symbols)
161
161
alert( "Direct: "+ user[id] );
162
162
```
163
163
164
-
That's a part of the general "hiding" concept. If another script or a library loops over our object, it won't unexpectedly access a symbolic property.
164
+
`Object.keys(user)` also ignores them. That's a part of the general "hiding symbolic properties" principle. If another script or a library loops over our object, it won't unexpectedly access a symbolic property.
165
165
166
166
In contrast, [Object.assign](mdn:js/Object/assign) copies both string and symbol properties:
167
167
@@ -180,13 +180,11 @@ There's no paradox here. That's by design. The idea is that when we clone an obj
180
180
181
181
## Global symbols
182
182
183
-
As we've seen, usually all symbols are different, even if they have the same names. But sometimes we want same-named symbols to be same entities.
184
-
185
-
For instance, different parts of our application want to access symbol `"id"` meaning exactly the same property.
183
+
As we've seen, usually all symbols are different, even if they have the same name. But sometimes we want same-named symbols to be same entities. For instance, different parts of our application want to access symbol `"id"` meaning exactly the same property.
186
184
187
185
To achieve that, there exists a *global symbol registry*. We can create symbols in it and access them later, and it guarantees that repeated accesses by the same name return exactly the same symbol.
188
186
189
-
In order to create or read a symbol in the registry, use `Symbol.for(key)`.
187
+
In order to read (create if absent) a symbol from the registry, use `Symbol.for(key)`.
190
188
191
189
That call checks the global registry, and if there's a symbol described as `key`, then returns it, otherwise creates a new symbol `Symbol(key)` and stores it in the registry by the given `key`.
192
190
@@ -196,7 +194,7 @@ For instance:
196
194
// read from the global registry
197
195
let id =Symbol.for("id"); // if the symbol did not exist, it is created
198
196
199
-
// read it again
197
+
// read it again (maybe from another part of the code)
200
198
let idAgain =Symbol.for("id");
201
199
202
200
// the same symbol
@@ -218,22 +216,29 @@ For global symbols, not only `Symbol.for(key)` returns a symbol by name, but the
218
216
For instance:
219
217
220
218
```js run
219
+
// get symbol by name
221
220
let sym =Symbol.for("name");
222
221
let sym2 =Symbol.for("id");
223
222
224
-
// get name from symbol
223
+
// get name by symbol
225
224
alert( Symbol.keyFor(sym) ); // name
226
225
alert( Symbol.keyFor(sym2) ); // id
227
226
```
228
227
229
228
The `Symbol.keyFor` internally uses the global symbol registry to look up the key for the symbol. So it doesn't work for non-global symbols. If the symbol is not global, it won't be able to find it and returns `undefined`.
230
229
230
+
That said, any symbols have `description` property.
231
+
231
232
For instance:
232
233
233
234
```js run
234
-
alert( Symbol.keyFor(Symbol.for("name")) ); // name, global symbol
235
+
let globalSymbol =Symbol.for("name");
236
+
let localSymbol =Symbol("name");
237
+
238
+
alert( Symbol.keyFor(globalSymbol) ); // name, global symbol
239
+
alert( Symbol.keyFor(localSymbol) ); // undefined, not global
235
240
236
-
alert( Symbol.keyFor(Symbol("name2")) ); //undefined, the argument isn't a global symbol
241
+
alert( localSymbol.description ); //name
237
242
```
238
243
239
244
## System symbols
@@ -256,9 +261,9 @@ Other symbols will also become familiar when we study the corresponding language
256
261
257
262
`Symbol` is a primitive type for unique identifiers.
258
263
259
-
Symbols are created with `Symbol()` call with an optional description.
264
+
Symbols are created with `Symbol()` call with an optional description (name).
260
265
261
-
Symbols are always different values, even if they have the same name. If we want same-named symbols to be equal, then we should use the global registry: `Symbol.for(key)` returns (creates if needed) a global symbol with `key` as the name. Multiple calls of `Symbol.for` return exactly the same symbol.
266
+
Symbols are always different values, even if they have the same name. If we want same-named symbols to be equal, then we should use the global registry: `Symbol.for(key)` returns (creates if needed) a global symbol with `key` as the name. Multiple calls of `Symbol.for`with the same `key`return exactly the same symbol.
262
267
263
268
Symbols have two main use cases:
264
269
@@ -269,4 +274,4 @@ Symbols have two main use cases:
269
274
270
275
2. There are many system symbols used by JavaScript which are accessible as `Symbol.*`. We can use them to alter some built-in behaviors. For instance, later in the tutorial we'll use `Symbol.iterator` for [iterables](info:iterable), `Symbol.toPrimitive` to setup [object-to-primitive conversion](info:object-toprimitive) and so on.
271
276
272
-
Technically, symbols are not 100% hidden. There is a built-in method [Object.getOwnPropertySymbols(obj)](mdn:js/Object/getOwnPropertySymbols) that allows us to get all symbols. Also there is a method named [Reflect.ownKeys(obj)](mdn:js/Reflect/ownKeys) that returns *all* keys of an object including symbolic ones. So they are not really hidden. But most libraries, built-in methods and syntax constructs adhere to a common agreement that they are. And the one who explicitly calls the aforementioned methods probably understands well what he's doing.
277
+
Technically, symbols are not 100% hidden. There is a built-in method [Object.getOwnPropertySymbols(obj)](mdn:js/Object/getOwnPropertySymbols) that allows us to get all symbols. Also there is a method named [Reflect.ownKeys(obj)](mdn:js/Reflect/ownKeys) that returns *all* keys of an object including symbolic ones. So they are not really hidden. But most libraries, built-in functions and syntax constructs don't use these methods.
Copy file name to clipboardExpand all lines: 1-js/11-async/08-async-await/article.md
+3-31Lines changed: 3 additions & 31 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -12,7 +12,7 @@ async function f() {
12
12
}
13
13
```
14
14
15
-
The word "async" before a function means one simple thing: a function always returns a promise. Even If a function actually returns a non-promise value, prepending the function definition with the "async" keyword directs JavaScript to automatically wrap that value in a resolved promise.
15
+
The word "async" before a function means one simple thing: a function always returns a promise. Other values are wrapped in a resolved promise automatically.
16
16
17
17
For instance, this function returns a resolved promise with the result of `1`; let's test it:
18
18
@@ -172,7 +172,7 @@ f();
172
172
If `await` gets a non-promise object with `.then`, it calls that method providing the built-in functions `resolve` and `reject` as arguments (just as it does for a regular `Promise` executor). Then `await` waits until one of them is called (in the example above it happens in the line `(*)`) and then proceeds with the result.
173
173
````
174
174
175
-
````smart header="Async methods"
175
+
````smart header="Async class methods"
176
176
To declare an async class method, just prepend it with `async`:
177
177
178
178
```js run
@@ -215,7 +215,7 @@ async function f() {
215
215
}
216
216
```
217
217
218
-
In real situations, the promise may take some time before it rejects. So `await`will wait, and then throw an error.
218
+
In real situations, the promise may take some time before it rejects. In that case there will be a delay before `await` throws an error.
219
219
220
220
We can catch that error using `try..catch`, the same way as a regular `throw`:
221
221
@@ -289,34 +289,6 @@ In the case of an error, it propagates as usual, from the failed promise to `Pro
289
289
290
290
````
291
291
292
-
## Microtask queue [#microtask-queue]
293
-
294
-
As we've seen in the chapter <info:microtask-queue>, promise handlers are executed asynchronously. Every `.then/catch/finally` handler first gets into the "microtask queue" and executed after the current code is complete.
295
-
296
-
`Async/await` is based on promises, so it uses the same microtask queue internally, and has the similar priority over macrotasks.
297
-
298
-
For instance, we have:
299
-
- `setTimeout(handler, 0)`, that should run `handler` with zero delay.
300
-
- `let x = await f()`, function `f()` is async, but returns immediately.
301
-
302
-
Which one runs first if `await` is *below* `setTimeout` in the code?
303
-
304
-
```js run
305
-
async function f() {
306
-
return 1;
307
-
}
308
-
309
-
(async () => {
310
-
setTimeout(() => alert('timeout'), 0);
311
-
312
-
await f();
313
-
314
-
alert('await');
315
-
})();
316
-
```
317
-
318
-
There's no ambiguity here: `await` always finishes first, because (as a microtask) it has a higher priority than `setTimeout` handling.
319
-
320
292
## Summary
321
293
322
294
The `async` keyword before a function has two effects:
Copy file name to clipboardExpand all lines: 2-ui/4-forms-controls/1-form-elements/article.md
+5-5Lines changed: 5 additions & 5 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -2,13 +2,13 @@
2
2
3
3
Forms and control elements, such as `<input>` have a lot of special properties and events.
4
4
5
-
Working with forms can be much more convenient if we know them.
5
+
Working with forms will be much more convenient when we learn them.
6
6
7
7
## Navigation: form and elements
8
8
9
9
Document forms are members of the special collection `document.forms`.
10
10
11
-
That's a *named* collection: we can use both the name and the number to get the form.
11
+
That's a so-called "named collection": it's both named and ordered. We can use both the name or the number in the document to get the form.
12
12
13
13
```js no-beautify
14
14
document.forms.my- the form with name="my"
@@ -155,7 +155,7 @@ Let's talk about form controls.
155
155
156
156
### input and textarea
157
157
158
-
Normally, we can access the value as `input.value` or `input.checked` for checkboxes.
158
+
We can access their value as `input.value` (string) or `input.checked` (boolean) for checkboxes.
159
159
160
160
Like this:
161
161
@@ -227,7 +227,7 @@ Here's an example of how to get selected values from a multi-select:
227
227
</script>
228
228
```
229
229
230
-
The full specification of the `<select>` element is available at <https://html.spec.whatwg.org/multipage/forms.html#the-select-element>.
230
+
The full specification of the `<select>` element is available in the specification <https://html.spec.whatwg.org/multipage/forms.html#the-select-element>.
231
231
232
232
### new Option
233
233
@@ -241,7 +241,7 @@ This syntax is optional. We can use `document.createElement('option')` and set a
241
241
242
242
- `text` -- the text inside the option,
243
243
- `value` -- the option value,
244
-
- `defaultSelected` -- if `true`, then `selected` attribute is created,
244
+
- `defaultSelected` -- if `true`, then `selected` HTML-attribute is created,
245
245
- `selected` -- if `true`, then the option is selected.
246
246
247
247
The difference between `defaultSelected` and `selected` is that `defaultSelected` sets the HTML-attribute (that we can get using `option.getAttribute('selected')`, while `selected` sets whether the option is selected or not.
0 commit comments