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-5Lines changed: 1 addition & 5 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -17,16 +17,12 @@ E mais, se você está desenvolvendo para browsers, há outras especificações
17
17
18
18
## Manuais
19
19
20
-
-**MDN (Mozilla) JavaScript Reference** é um manual com exemplos e outras informações. É ótimo para um entendimento sobre funções, métodos da linguagem, etc.
20
+
-**MDN (Mozilla) JavaScript Reference** é um manual com exemplos e outras informações. É ótimo para um entendimento sobre funçõesda linguagem, métodos , etc.
21
21
22
22
Pode ser encontrado em <https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference>.
23
23
24
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`.
25
25
26
-
-**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/>.
27
-
28
-
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".
29
-
30
26
## Tabelas de compatibilidade
31
27
32
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
+3-3Lines changed: 3 additions & 3 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -14,8 +14,8 @@ Simply put, "reachable" values are those that are accessible or usable somehow.
14
14
15
15
For instance:
16
16
17
-
-Local variables and parameters of the current function.
18
-
-Variables and parameters for other functions on the current chain of nested calls.
17
+
-The currently executing function, its local variables and parameters.
18
+
-Other functions on the current chain of nested calls, their local variables and parameters.
19
19
- Global variables.
20
20
- (there are some other, internal ones as well)
21
21
@@ -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
+7-3Lines changed: 7 additions & 3 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -83,15 +83,15 @@ 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.
90
90
```
91
91
92
92
Inside a function, we can check whether it was called with `new` or without it, using a special `new.target` property.
93
93
94
-
It is empty for regular calls and equals the function if called with `new`:
94
+
It is undefined for regular calls and equals the function if called with `new`:
95
95
96
96
```js run
97
97
functionUser() {
@@ -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.
Please note: the `?.` syntax makes optional the value before it, but not any further.
105
105
106
-
E.g. in `user?.address.street.name` the `?.` allows `user` to be `null/undefined`, but it's all it does. Further properties are accessed in a regular way. If we want some of them to be optional, then we'll need to replace more `.` with `?.`.
106
+
E.g. in `user?.address.street.name` the `?.` allows `user` to safely be `null/undefined` (and returns `undefined` in that case), but that's only for `user`. Further properties are accessed in a regular way. If we want some of them to be optional, then we'll need to replace more `.` with `?.`.
107
107
108
108
```warn header="Don't overuse the optional chaining"
109
109
We should use `?.` only where it's ok that something doesn't exist.
@@ -173,18 +173,16 @@ Then `?.()` checks the left part: if the admin function exists, then it runs (th
173
173
The `?.[]` syntax also works, if we'd like to use brackets `[]` to access properties instead of dot `.`. Similar to previous cases, it allows to safely read a property from an object that may not exist.
174
174
175
175
```js run
176
+
let key ="firstName";
177
+
176
178
let user1 = {
177
179
firstName:"John"
178
180
};
179
181
180
-
let user2 =null; // Imagine, we couldn't authorize the user
Copy file name to clipboardExpand all lines: 1-js/04-object-basics/08-symbol/article.md
+23-18Lines changed: 23 additions & 18 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,11 +105,11 @@ 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
-
```js run
112
+
```js
113
113
let user = { name:"John" };
114
114
115
115
// Our script uses "id" property
@@ -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/05-data-types/02-number/article.md
+15-7Lines changed: 15 additions & 7 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -16,21 +16,29 @@ Imagine we need to write 1 billion. The obvious way is:
16
16
let billion =1000000000;
17
17
```
18
18
19
-
But in real life, we usually avoid writing a long string of zeroes as it's easy to mistype. Also, we are lazy. We will usually write something like `"1bn"` for a billion or `"7.3bn"` for 7 billion 300 million. The same is true for most large numbers.
19
+
We also can use underscore `_` as the separator:
20
20
21
-
In JavaScript, we shorten a number by appending the letter `"e"` to the number and specifying the zeroes count:
21
+
```js
22
+
let billion =1_000_000_000;
23
+
```
24
+
25
+
Here the underscore `_` plays the role of the "syntactic sugar", it makes the number more readable. The JavaScript engine simply ignores `_` between digits, so it's exactly the same one billion as above.
26
+
27
+
In real life though, we try to avoid writing long sequences of zeroes. We're too lazy for that. We'll try to write something like `"1bn"` for a billion or `"7.3bn"` for 7 billion 300 million. The same is true for most large numbers.
28
+
29
+
In JavaScript, we can shorten a number by appending the letter `"e"` to it and specifying the zeroes count:
22
30
23
31
```js run
24
32
let billion =1e9; // 1 billion, literally: 1 and 9 zeroes
25
33
26
-
alert( 7.3e9 ); // 7.3 billions (7,300,000,000)
34
+
alert( 7.3e9 ); // 7.3 billions (same as 7300000000 or 7_300_000_000)
27
35
```
28
36
29
-
In other words, `"e"` multiplies the number by `1` with the given zeroes count.
37
+
In other words, `e` multiplies the number by `1` with the given zeroes count.
30
38
31
39
```js
32
-
1e3=1*1000
33
-
1.23e6=1.23*1000000
40
+
1e3=1*1000// e3 means *1000
41
+
1.23e6=1.23*1000000// e6 means *1000000
34
42
```
35
43
36
44
Now let's write something very small. Say, 1 microsecond (one millionth of a second):
@@ -125,7 +133,7 @@ There are several built-in functions for rounding:
125
133
: Rounds up:`3.1` becomes `4`, and `-1.1` becomes `-1`.
126
134
127
135
`Math.round`
128
-
: Rounds to the nearest integer:`3.1` becomes `3`, `3.6` becomes `4` and `-1.1` becomes `-1`.
136
+
: Rounds to the nearest integer:`3.1` becomes `3`, `3.6` becomes `4`, the middle case:`3.5` rounds up to `4` too.
129
137
130
138
`Math.trunc` (not supported by Internet Explorer)
131
139
: Removes anything after the decimal point without rounding:`3.1` becomes `3`, `-1.1` becomes `-1`.
0 commit comments