Merge branch 'master' of https://github.com/iliakan/javascript-tutorial-en
This commit is contained in:
commit
5b16f003cc
13 changed files with 33 additions and 32 deletions
|
@ -17,6 +17,6 @@ undefined + 1 = NaN // (4)
|
|||
```
|
||||
|
||||
1. The addition with a string `"" + 1` converts `1` to a string: `"" + 1 = "1"`, and then we have `"1" + 0`, the same rule is applied.
|
||||
2. The substruction `"-"` (like most math operations) only works with numbers, it converts an empty string `""` to `0`.
|
||||
2. The subtraction `"-"` (like most math operations) only works with numbers, it converts an empty string `""` to `0`.
|
||||
3. `null` becomes `0` after the numeric conversion.
|
||||
4. `undefined` becomes `NaN` after the numeric conversion.
|
||||
|
|
|
@ -173,7 +173,7 @@ alert( b ); // 4
|
|||
alert( c ); // 4
|
||||
```
|
||||
|
||||
Chained assignments evaluate from right to left. First the rightmost expression `2+2` is evaluated then assigned to the variables on the left: `c`, `b` and `a`. At the end, all variables share a single value.
|
||||
Chained assignments evaluate from right to left. First the rightmost expression `2 + 2` is evaluated then assigned to the variables on the left: `c`, `b` and `a`. At the end, all variables share a single value.
|
||||
|
||||
````smart header="The assignment operator `\"=\"` returns a value"
|
||||
An operator always returns a value. That's obvious for most of them like an addition `+` or a multiplication `*`. But the assignment operator follows that rule too.
|
||||
|
@ -381,8 +381,8 @@ This notation can be shortened using operators `+=` and `*=`:
|
|||
|
||||
```js run
|
||||
let n = 2;
|
||||
n += 5; // now n=7 (same as n = n + 5)
|
||||
n *= 2; // now n=14 (same as n = n * 2)
|
||||
n += 5; // now n = 7 (same as n = n + 5)
|
||||
n *= 2; // now n = 14 (same as n = n * 2)
|
||||
|
||||
alert( n ); // 14
|
||||
```
|
||||
|
@ -409,18 +409,18 @@ For example:
|
|||
|
||||
```js run
|
||||
*!*
|
||||
let a = (1+2, 3+4);
|
||||
let a = (1 + 2, 3 + 4);
|
||||
*/!*
|
||||
|
||||
alert( a ); // 7 (the result of 3+4)
|
||||
alert( a ); // 7 (the result of 3 + 4)
|
||||
```
|
||||
|
||||
Here, the first expression `1+2` is evaluated, and its result is thrown away, then `3+4` is evaluated and returned as the result.
|
||||
Here, the first expression `1 + 2` is evaluated, and its result is thrown away, then `3 + 4` is evaluated and returned as the result.
|
||||
|
||||
```smart header="Comma has a very low precedence"
|
||||
Please note that the comma operator has very low precedence, lower than `=`, so parentheses are important in the example above.
|
||||
|
||||
Without them: `a=1+2,3+4` evaluates `+` first, summing the numbers into `a=3,7`, then the assignment operator `=` assigns `a=3`, and then the number after the comma `7` is not processed anyhow, so it's ignored.
|
||||
Without them: `a = 1 + 2, 3 + 4` evaluates `+` first, summing the numbers into `a = 3, 7`, then the assignment operator `=` assigns `a = 3`, and then the number after the comma `7` is not processed anyhow, so it's ignored.
|
||||
```
|
||||
|
||||
Why do we need such an operator which throws away everything except the last part?
|
||||
|
|
|
@ -8,8 +8,8 @@ for (let i = 0; i < 5; i++) alert( i );
|
|||
|
||||
That can be easily deducted from the algorithm of `for`:
|
||||
|
||||
1. Execute once `i=0` before everything (begin).
|
||||
2. Check the condition `i<5`
|
||||
1. Execute once `i = 0` before everything (begin).
|
||||
2. Check the condition `i < 5`
|
||||
3. If `true` -- execute the loop body `alert(i)`, and then `i++`
|
||||
|
||||
The increment `i++` is separated from the condition check (2). That's just another statement.
|
||||
|
|
|
@ -6,12 +6,12 @@ importance: 3
|
|||
|
||||
An integer number greater than `1` is called a [prime](https://en.wikipedia.org/wiki/Prime_number) if it cannot be divided without a remainder by anything except `1` and itself.
|
||||
|
||||
In other words, `n>1` is a prime if it can't be evenly divided by anything except `1` and `n`.
|
||||
In other words, `n > 1` is a prime if it can't be evenly divided by anything except `1` and `n`.
|
||||
|
||||
For example, `5` is a prime, because it cannot be divided without a remainder by `2`, `3` and `4`.
|
||||
|
||||
**Write the code which outputs prime numbers in the interval from `2` to `n`.**
|
||||
|
||||
For `n=10` the result will be `2,3,5,7`.
|
||||
For `n = 10` the result will be `2,3,5,7`.
|
||||
|
||||
P.S. The code should work for any `n`, not be hard-tuned for any fixed value.
|
||||
|
|
|
@ -21,7 +21,7 @@ while (condition) {
|
|||
|
||||
While the `condition` is `true`, the `code` from the loop body is executed.
|
||||
|
||||
For instance, the loop below outputs `i` while `i<3`:
|
||||
For instance, the loop below outputs `i` while `i < 3`:
|
||||
|
||||
```js run
|
||||
let i = 0;
|
||||
|
@ -37,7 +37,7 @@ If there were no `i++` in the example above, the loop would repeat (in theory) f
|
|||
|
||||
Any expression or a variable can be a loop condition, not just a comparison. They are evaluated and converted to boolean by `while`.
|
||||
|
||||
For instance, the shorter way to write `while (i!=0)` could be `while (i)`:
|
||||
For instance, the shorter way to write `while (i != 0)` could be `while (i)`:
|
||||
|
||||
```js run
|
||||
let i = 3;
|
||||
|
@ -108,8 +108,8 @@ Let's examine the `for` statement part by part:
|
|||
|
||||
| part | | |
|
||||
|-------|----------|----------------------------------------------------------------------------|
|
||||
| begin | `i=0` | Executes once upon entering the loop. |
|
||||
| condition | `i<3`| Checked before every loop iteration, if fails the loop stops. |
|
||||
| begin | `i = 0` | Executes once upon entering the loop. |
|
||||
| condition | `i < 3`| Checked before every loop iteration, if fails the loop stops. |
|
||||
| step| `i++` | Executes after the body on each iteration, but before the condition check. |
|
||||
| body | `alert(i)`| Runs again and again while the condition is truthy |
|
||||
|
||||
|
@ -188,11 +188,11 @@ We can also remove the `step` part:
|
|||
let i = 0;
|
||||
|
||||
for (; i < 3;) {
|
||||
alert( i );
|
||||
alert( i++ );
|
||||
}
|
||||
```
|
||||
|
||||
The loop became identical to `while (i<3)`.
|
||||
The loop became identical to `while (i < 3)`.
|
||||
|
||||
We can actually remove everything, thus creating an infinite loop:
|
||||
|
||||
|
@ -324,7 +324,7 @@ The ordinary `break` after `input` would only break the inner loop. That's not s
|
|||
|
||||
A *label* is an identifier with a colon before a loop:
|
||||
```js
|
||||
labelName: for(...) {
|
||||
labelName: for (...) {
|
||||
...
|
||||
}
|
||||
```
|
||||
|
@ -369,7 +369,7 @@ For example, it is impossible to do this:
|
|||
```js
|
||||
break label; // jumps to label? No.
|
||||
|
||||
label: for(...)
|
||||
label: for (...)
|
||||
```
|
||||
|
||||
The call to a `break/continue` is only possible from inside the loop, and the label must be somewhere upwards from the directive.
|
||||
|
@ -381,7 +381,7 @@ We covered 3 types of loops:
|
|||
|
||||
- `while` -- The condition is checked before each iteration.
|
||||
- `do..while` -- The condition is checked after each iteration.
|
||||
- `for(;;)` -- The condition is checked before each iteration, additional settings available.
|
||||
- `for (;;)` -- The condition is checked before each iteration, additional settings available.
|
||||
|
||||
To make an "infinite" loop, usually the `while(true)` construct is used. Such a loop, just like any other, can be stopped with the `break` directive.
|
||||
|
||||
|
|
|
@ -403,9 +403,9 @@ If we have only one argument, then parentheses can be omitted, making that even
|
|||
|
||||
```js run
|
||||
// same as
|
||||
// let double = function(n) { return n*2 }
|
||||
// let double = function(n) { return n * 2 }
|
||||
*!*
|
||||
let double = n => n*2;
|
||||
let double = n => n * 2;
|
||||
*/!*
|
||||
|
||||
alert( double(3) ); // 6
|
||||
|
|
|
@ -216,7 +216,7 @@ switch (age) {
|
|||
alert("Won't work"); // the result of prompt is a string, not a number
|
||||
|
||||
case "18":
|
||||
alert("This works!"");
|
||||
alert("This works!");
|
||||
break;
|
||||
|
||||
default:
|
||||
|
@ -273,7 +273,7 @@ We covered three ways to create a function in JavaScript:
|
|||
|
||||
|
||||
- Functions may have local variables: those declared inside its body. Such variables are only visible inside the function.
|
||||
- Parameters can have default values: `function sum(a=1, b=2) {...}`.
|
||||
- Parameters can have default values: `function sum(a = 1, b = 2) {...}`.
|
||||
- Functions always return something. If there's no `return` statement, then the result is `undefined`.
|
||||
|
||||
|
||||
|
|
|
@ -58,8 +58,9 @@ function showPrimes(n) {
|
|||
|
||||
function isPrime(n) {
|
||||
for (let i = 2; i < n; i++) {
|
||||
if ( n % i == 0) return false;
|
||||
if (n % i == 0) return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
```
|
||||
|
|
|
@ -9,7 +9,7 @@ Till now we've only seen strings. Now let's see the advantages that symbols can
|
|||
|
||||
## Symbols
|
||||
|
||||
"Symbol" value represents an unique identifier.
|
||||
"Symbol" value represents a unique identifier.
|
||||
|
||||
A value of this type can be created using `Symbol()`:
|
||||
|
||||
|
@ -141,7 +141,7 @@ let user = {
|
|||
};
|
||||
|
||||
*!*
|
||||
for(let key in user) alert(key); // name, age (no symbols)
|
||||
for (let key in user) alert(key); // name, age (no symbols)
|
||||
*/!*
|
||||
|
||||
// the direct access by the symbol works
|
||||
|
|
|
@ -157,7 +157,7 @@ The first thing is nice. The second is tolerable, because we can use `Array.from
|
|||
```warn header="DOM collections are read-only"
|
||||
DOM collections, and even more -- *all* navigation properties listed in this chapter are read-only.
|
||||
|
||||
We can't replace an child by something else assigning `childNodes[i] = ...`.
|
||||
We can't replace a child by something else assigning `childNodes[i] = ...`.
|
||||
|
||||
Changing DOM needs other methods, we'll see them in the next chapter.
|
||||
```
|
||||
|
|
|
@ -9,7 +9,7 @@ The caret `pattern:^` matches at the beginning of the text, and the dollar `patt
|
|||
For instance, let's test if the text starts with `Mary`:
|
||||
|
||||
```js run
|
||||
let str1 = 'Mary had a little lamb, it's fleece was white as snow';
|
||||
let str1 = "Mary had a little lamb, it's fleece was white as snow";
|
||||
let str2 = 'Everywhere Mary went, the lamp was sure to go';
|
||||
|
||||
alert( /^Mary/.test(str1) ); // true
|
||||
|
|
|
@ -121,7 +121,7 @@ What happen during the search of `pattern:(\d+)*$` in the line `subject:12345678
|
|||
\d+.......
|
||||
(123456789)z
|
||||
```
|
||||
2. Then it tries to apply the start around the parentheses `pattern:(\d+)*`, but there are no more digits, so it the star doesn't give anything.
|
||||
2. Then it tries to apply the star around the parentheses `pattern:(\d+)*`, but there are no more digits, so it the star doesn't give anything.
|
||||
|
||||
Then the pattern has the string end anchor `pattern:$`, and in the text we have `subject:z`.
|
||||
|
||||
|
|
|
@ -49,7 +49,7 @@ As the result is passed along the chain of handlers, we can see a sequence of `a
|
|||
|
||||

|
||||
|
||||
The whole thing works, because a call to `promise.then` returns a promise, so that we can call next `.then` on it.
|
||||
The whole thing works, because a call to `promise.then` returns a promise, so that we can call the next `.then` on it.
|
||||
|
||||
When a handler returns a value, it becomes the result of that promise, so the next `.then` is called with it.
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue