Skip to content

Commit 6d39ea2

Browse files
committed
Merge branch 'master' of github.com:javascript-tutorial/en.javascript.info into sync-34a80e70
2 parents e76dce9 + 34a80e7 commit 6d39ea2

File tree

15 files changed

+77
-70
lines changed

15 files changed

+77
-70
lines changed

.github/FUNDING.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
github: iliakan

1-js/02-first-steps/05-types/article.md

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -94,13 +94,6 @@ const bigInt = 1234567890123456789012345678901234567890n;
9494

9595
As `BigInt` numbers are rarely needed, we don't cover them here, but devoted them a separate chapter <info:bigint>. Read it when you need such big numbers.
9696
97-
98-
```smart header="Compatibility issues"
99-
Right now, `BigInt` is supported in Firefox/Chrome/Edge/Safari, but not in IE.
100-
```
101-
102-
You can check [*MDN* BigInt compatibility table](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/BigInt#Browser_compatibility) to know which versions of a browser are supported.
103-
10497
## String
10598
10699
A string in JavaScript must be surrounded by quotes.

1-js/03-code-quality/06-polyfills/article.md

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,6 @@ JavaScript is a highly dynamic language. Scripts may add/modify any function, ev
7373
7474
Two interesting polyfill libraries are:
7575
- [core js](https://github.com/zloirock/core-js) that supports a lot, allows to include only needed features.
76-
- [polyfill.io](https://polyfill.io/) service that provides a script with polyfills, depending on the features and user's browser.
7776
7877
7978
## Summary

1-js/04-object-basics/04-object-methods/8-chain-calls/task.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ importance: 2
44

55
# Chaining
66

7-
There's a `ladder` object that allows to go up and down:
7+
There's a `ladder` object that allows you to go up and down:
88

99
```js
1010
let ladder = {
@@ -21,7 +21,7 @@ let ladder = {
2121
};
2222
```
2323

24-
Now, if we need to make several calls in sequence, can do it like this:
24+
Now, if we need to make several calls in sequence, we can do it like this:
2525

2626
```js
2727
ladder.up();
@@ -32,10 +32,10 @@ ladder.down();
3232
ladder.showStep(); // 0
3333
```
3434

35-
Modify the code of `up`, `down` and `showStep` to make the calls chainable, like this:
35+
Modify the code of `up`, `down`, and `showStep` to make the calls chainable, like this:
3636

3737
```js
3838
ladder.up().up().down().showStep().down().showStep(); // shows 1 then 0
3939
```
4040

41-
Such approach is widely used across JavaScript libraries.
41+
Such an approach is widely used across JavaScript libraries.

1-js/04-object-basics/09-object-toprimitive/article.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -253,7 +253,7 @@ let obj = {
253253
}
254254
};
255255

256-
alert(obj + 2); // 22 ("2" + 2), conversion to primitive returned a string => concatenation
256+
alert(obj + 2); // "22" ("2" + 2), conversion to primitive returned a string => concatenation
257257
```
258258

259259
## Summary

1-js/05-data-types/02-number/article.md

Lines changed: 23 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ In modern JavaScript, there are two types of numbers:
44

55
1. Regular numbers in JavaScript are stored in 64-bit format [IEEE-754](https://en.wikipedia.org/wiki/IEEE_754), also known as "double precision floating point numbers". These are numbers that we're using most of the time, and we'll talk about them in this chapter.
66

7-
2. BigInt numbers represent integers of arbitrary length. They are sometimes needed because a regular integer number can't safely exceed <code>(2<sup>53</sup>-1)</code> or be less than <code>-(2<sup>53</sup>-1)</code>, as we mentioned earlier in the chapter <info:types>. As bigints are used in few special areas, we devote them a special chapter <info:bigint>.
7+
2. BigInt numbers represent integers of arbitrary length. They are sometimes needed because a regular integer number can't safely exceed <code>(2<sup>53</sup>-1)</code> or be less than <code>-(2<sup>53</sup>-1)</code>, as we mentioned earlier in the chapter <info:types>. As bigints are used in a few special areas, we devote them to a special chapter <info:bigint>.
88

99
So here we'll talk about regular numbers. Let's expand our knowledge of them.
1010

@@ -41,7 +41,7 @@ In other words, `e` multiplies the number by `1` with the given zeroes count.
4141
1.23e6 === 1.23 * 1000000; // e6 means *1000000
4242
```
4343

44-
Now let's write something very small. Say, 1 microsecond (one millionth of a second):
44+
Now let's write something very small. Say, 1 microsecond (one-millionth of a second):
4545

4646
```js
4747
let mсs = 0.000001;
@@ -103,13 +103,13 @@ alert( num.toString(16) ); // ff
103103
alert( num.toString(2) ); // 11111111
104104
```
105105

106-
The `base` can vary from `2` to `36`. By default it's `10`.
106+
The `base` can vary from `2` to `36`. By default, it's `10`.
107107

108108
Common use cases for this are:
109109

110110
- **base=16** is used for hex colors, character encodings etc, digits can be `0..9` or `A..F`.
111111
- **base=2** is mostly for debugging bitwise operations, digits can be `0` or `1`.
112-
- **base=36** is the maximum, digits can be `0..9` or `A..Z`. The whole latin alphabet is used to represent a number. A funny, but useful case for `36` is when we need to turn a long numeric identifier into something shorter, for example to make a short url. Can simply represent it in the numeral system with base `36`:
112+
- **base=36** is the maximum, digits can be `0..9` or `A..Z`. The whole Latin alphabet is used to represent a number. A funny, but useful case for `36` is when we need to turn a long numeric identifier into something shorter, for example, to make a short url. Can simply represent it in the numeral system with base `36`:
113113

114114
```js run
115115
alert( 123456..toString(36) ); // 2n9c
@@ -137,7 +137,7 @@ There are several built-in functions for rounding:
137137
: Rounds up: `3.1` becomes `4`, and `-1.1` becomes `-1`.
138138

139139
`Math.round`
140-
: Rounds to the nearest integer: `3.1` becomes `3`, `3.6` becomes `4`, the middle case: `3.5` rounds up to `4` too.
140+
: Rounds to the nearest integer: `3.1` becomes `3`, `3.6` becomes `4`. In the middle cases `3.5` rounds up to `4`, and `-3.5` rounds up to `-3`.
141141

142142
`Math.trunc` (not supported by Internet Explorer)
143143
: Removes anything after the decimal point without rounding: `3.1` becomes `3`, `-1.1` becomes `-1`.
@@ -147,8 +147,10 @@ Here's the table to summarize the differences between them:
147147
| | `Math.floor` | `Math.ceil` | `Math.round` | `Math.trunc` |
148148
|---|---------|--------|---------|---------|
149149
|`3.1`| `3` | `4` | `3` | `3` |
150+
|`3.5`| `3` | `4` | `4` | `3` |
150151
|`3.6`| `3` | `4` | `4` | `3` |
151152
|`-1.1`| `-2` | `-1` | `-1` | `-1` |
153+
|`-1.5`| `-2` | `-1` | `-1` | `-1` |
152154
|`-1.6`| `-2` | `-1` | `-2` | `-1` |
153155
154156
@@ -188,7 +190,7 @@ There are two ways to do so:
188190
alert( num.toFixed(5) ); // "12.34000", added zeroes to make exactly 5 digits
189191
```
190192

191-
We can convert it to a number using the unary plus or a `Number()` call, e.g write `+num.toFixed(5)`.
193+
We can convert it to a number using the unary plus or a `Number()` call, e.g. write `+num.toFixed(5)`.
192194

193195
## Imprecise calculations
194196

@@ -222,7 +224,13 @@ But why does this happen?
222224

223225
A number is stored in memory in its binary form, a sequence of bits - ones and zeroes. But fractions like `0.1`, `0.2` that look simple in the decimal numeric system are actually unending fractions in their binary form.
224226

225-
What is `0.1`? It is one divided by ten `1/10`, one-tenth. In decimal numeral system such numbers are easily representable. Compare it to one-third: `1/3`. It becomes an endless fraction `0.33333(3)`.
227+
```js run
228+
alert(0.1.toString(2)); // 0.0001100110011001100110011001100110011001100110011001101
229+
alert(0.2.toString(2)); // 0.001100110011001100110011001100110011001100110011001101
230+
alert((0.1 + 0.2).toString(2)); // 0.0100110011001100110011001100110011001100110011001101
231+
```
232+
233+
What is `0.1`? It is one divided by ten `1/10`, one-tenth. In the decimal numeral system, such numbers are easily representable. Compare it to one-third: `1/3`. It becomes an endless fraction `0.33333(3)`.
226234

227235
So, division by powers `10` is guaranteed to work well in the decimal system, but division by `3` is not. For the same reason, in the binary numeral system, the division by powers of `2` is guaranteed to work, but `1/10` becomes an endless binary fraction.
228236

@@ -242,7 +250,7 @@ That's why `0.1 + 0.2` is not exactly `0.3`.
242250
```smart header="Not only JavaScript"
243251
The same issue exists in many other programming languages.
244252

245-
PHP, Java, C, Perl, Ruby give exactly the same result, because they are based on the same numeric format.
253+
PHP, Java, C, Perl, and Ruby give exactly the same result, because they are based on the same numeric format.
246254
```
247255

248256
Can we work around the problem? Sure, the most reliable method is to round the result with the help of a method [toFixed(n)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/toFixed):
@@ -266,7 +274,7 @@ alert( (0.1 * 10 + 0.2 * 10) / 10 ); // 0.3
266274
alert( (0.28 * 100 + 0.14 * 100) / 100); // 0.4200000000000001
267275
```
268276

269-
So, multiply/divide approach reduces the error, but doesn't remove it totally.
277+
So, the multiply/divide approach reduces the error, but doesn't remove it totally.
270278

271279
Sometimes we could try to evade fractions at all. Like if we're dealing with a shop, then we can store prices in cents instead of dollars. But what if we apply a discount of 30%? In practice, totally evading fractions is rarely possible. Just round them to cut "tails" when needed.
272280

@@ -288,7 +296,7 @@ Another funny consequence of the internal representation of numbers is the exist
288296

289297
That's because a sign is represented by a single bit, so it can be set or not set for any number including a zero.
290298

291-
In most cases the distinction is unnoticeable, because operators are suited to treat them as the same.
299+
In most cases, the distinction is unnoticeable, because operators are suited to treat them as the same.
292300
```
293301

294302
## Tests: isFinite and isNaN
@@ -337,7 +345,7 @@ Please note that an empty or a space-only string is treated as `0` in all numeri
337345
````smart header="`Number.isNaN` and `Number.isFinite`"
338346
[Number.isNaN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/isNaN) and [Number.isFinite](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/isFinite) methods are the more "strict" versions of `isNaN` and `isFinite` functions. They do not autoconvert their argument into a number, but check if it belongs to the `number` type instead.
339347

340-
- `Number.isNaN(value)` returns `true` if the argument belongs to the `number` type and it is `NaN`. In any other case it returns `false`.
348+
- `Number.isNaN(value)` returns `true` if the argument belongs to the `number` type and it is `NaN`. In any other case, it returns `false`.
341349

342350
```js run
343351
alert( Number.isNaN(NaN) ); // true
@@ -348,7 +356,7 @@ Please note that an empty or a space-only string is treated as `0` in all numeri
348356
alert( isNaN("str") ); // true, because isNaN converts string "str" into a number and gets NaN as a result of this conversion
349357
```
350358

351-
- `Number.isFinite(value)` returns `true` if the argument belongs to the `number` type and it is not `NaN/Infinity/-Infinity`. In any other case it returns `false`.
359+
- `Number.isFinite(value)` returns `true` if the argument belongs to the `number` type and it is not `NaN/Infinity/-Infinity`. In any other case, it returns `false`.
352360

353361
```js run
354362
alert( Number.isFinite(123) ); // true
@@ -367,7 +375,7 @@ In a way, `Number.isNaN` and `Number.isFinite` are simpler and more straightforw
367375
There is a special built-in method `Object.is` that compares values like `===`, but is more reliable for two edge cases:
368376

369377
1. It works with `NaN`: `Object.is(NaN, NaN) === true`, that's a good thing.
370-
2. Values `0` and `-0` are different: `Object.is(0, -0) === false`, technically that's correct, because internally the number has a sign bit that may be different even if all other bits are zeroes.
378+
2. Values `0` and `-0` are different: `Object.is(0, -0) === false`, technically that's correct because internally the number has a sign bit that may be different even if all other bits are zeroes.
371379

372380
In all other cases, `Object.is(a, b)` is the same as `a === b`.
373381

@@ -385,7 +393,7 @@ alert( +"100px" ); // NaN
385393

386394
The sole exception is spaces at the beginning or at the end of the string, as they are ignored.
387395

388-
But in real life we often have values in units, like `"100px"` or `"12pt"` in CSS. Also in many countries the currency symbol goes after the amount, so we have `"19€"` and would like to extract a numeric value out of that.
396+
But in real life, we often have values in units, like `"100px"` or `"12pt"` in CSS. Also in many countries, the currency symbol goes after the amount, so we have `"19€"` and would like to extract a numeric value out of that.
389397

390398
That's what `parseInt` and `parseFloat` are for.
391399

@@ -479,4 +487,4 @@ For fractions:
479487

480488
More mathematical functions:
481489

482-
- See the [Math](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Math) object when you need them. The library is very small, but can cover basic needs.
490+
- See the [Math](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Math) object when you need them. The library is very small but can cover basic needs.

1-js/05-data-types/04-array/article.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -426,7 +426,7 @@ let matrix = [
426426
[7, 8, 9]
427427
];
428428

429-
alert( matrix[1][1] ); // 5, the central element
429+
alert( matrix[0][1] ); // 2, the second value of the first inner array
430430
```
431431

432432
## toString

0 commit comments

Comments
 (0)