Typos & spacing
This commit is contained in:
parent
43c197889e
commit
14a926c7a3
1 changed files with 10 additions and 10 deletions
|
@ -9,7 +9,7 @@ In contrast, objects are used to store keyed collections of various data and mor
|
||||||
|
|
||||||
An object can be created with figure brackets `{…}` with an optional list of *properties*. A property is a "key: value" pair, where `key` is a string (also called a "property name"), and `value` can be anything.
|
An object can be created with figure brackets `{…}` with an optional list of *properties*. A property is a "key: value" pair, where `key` is a string (also called a "property name"), and `value` can be anything.
|
||||||
|
|
||||||
We can imagine an object as a cabinet with signed files. Every piece of data is stored in it's file by the key. It's easy to find a file by it's name or add/remove a file.
|
We can imagine an object as a cabinet with signed files. Every piece of data is stored in its file by the key. It's easy to find a file by its name or add/remove a file.
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
|
@ -224,7 +224,7 @@ alert(obj.__proto__); // [object Object], didn't work as intended
|
||||||
|
|
||||||
As we see from the code, the assignment to a primitive `5` is ignored.
|
As we see from the code, the assignment to a primitive `5` is ignored.
|
||||||
|
|
||||||
That can be come a source of bugs and even vulnerabilies if we intent to store arbitrary key-value pairs in an object, and allow a visitor to specify the keys. In that case the visitor may choose "__proto__" as the key, and the assignment logic will be ruined (as shown above).
|
That can become a source of bugs and even vulnerabilities if we intend to store arbitrary key-value pairs in an object, and allow a visitor to specify the keys. In that case, the visitor may choose "__proto__" as the key, and the assignment logic will be ruined (as shown above).
|
||||||
|
|
||||||
There's another data structure [Map](info:map-set-weakmap-weakset), that we'll learn in the chapter <info:map-set-weakmap-weakset>, which supports arbitrary keys. Also there's a way to make objects treat `__proto__` as a regular property, but first we need to know more about objects to understand it.
|
There's another data structure [Map](info:map-set-weakmap-weakset), that we'll learn in the chapter <info:map-set-weakmap-weakset>, which supports arbitrary keys. Also there's a way to make objects treat `__proto__` as a regular property, but first we need to know more about objects to understand it.
|
||||||
````
|
````
|
||||||
|
@ -335,12 +335,12 @@ Situations like this happen very rarely, because `undefined` is usually not assi
|
||||||
|
|
||||||
## The "for..in" loop
|
## The "for..in" loop
|
||||||
|
|
||||||
To walk over all keys of an object, there exists a special form of the loop: `for..in`. This is a completely different thing from the `for(;;)` construct that we studied before.
|
To walk over all keys of an object, there exists a special form of the loop: `for..in`. This is a completely different thing from the `for (;;)` construct that we studied before.
|
||||||
|
|
||||||
The syntax:
|
The syntax:
|
||||||
|
|
||||||
```js
|
```js
|
||||||
for(key in object) {
|
for (key in object) {
|
||||||
// executes the body for each key among object properties
|
// executes the body for each key among object properties
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
@ -354,7 +354,7 @@ let user = {
|
||||||
isAdmin: true
|
isAdmin: true
|
||||||
};
|
};
|
||||||
|
|
||||||
for(let key in user) {
|
for (let key in user) {
|
||||||
// keys
|
// keys
|
||||||
alert( key ); // name, age, isAdmin
|
alert( key ); // name, age, isAdmin
|
||||||
// values for the keys
|
// values for the keys
|
||||||
|
@ -364,7 +364,7 @@ for(let key in user) {
|
||||||
|
|
||||||
Note that all "for" constructs allow us to declare the looping variable inside the loop, like `let key` here.
|
Note that all "for" constructs allow us to declare the looping variable inside the loop, like `let key` here.
|
||||||
|
|
||||||
Also, we could use another variable name here instead of `key`. For instance, `"for(let prop in obj)"` is also widely used.
|
Also, we could use another variable name here instead of `key`. For instance, `"for (let prop in obj)"` is also widely used.
|
||||||
|
|
||||||
|
|
||||||
### Ordered like an object
|
### Ordered like an object
|
||||||
|
@ -385,7 +385,7 @@ let codes = {
|
||||||
};
|
};
|
||||||
|
|
||||||
*!*
|
*!*
|
||||||
for(let code in codes) {
|
for (let code in codes) {
|
||||||
alert(code); // 1, 41, 44, 49
|
alert(code); // 1, 41, 44, 49
|
||||||
}
|
}
|
||||||
*/!*
|
*/!*
|
||||||
|
@ -443,7 +443,7 @@ let codes = {
|
||||||
"+1": "USA"
|
"+1": "USA"
|
||||||
};
|
};
|
||||||
|
|
||||||
for(let code in codes) {
|
for (let code in codes) {
|
||||||
alert( +code ); // 49, 41, 44, 1
|
alert( +code ); // 49, 41, 44, 1
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
@ -700,7 +700,7 @@ user.sizes.width++; // change a property from one place
|
||||||
alert(clone.sizes.width); // 51, see the result from the other one
|
alert(clone.sizes.width); // 51, see the result from the other one
|
||||||
```
|
```
|
||||||
|
|
||||||
To fix that, we should use the cloning loop that examines each value of `user[key]` and, if it's an object, then replicate it's structure as well. That is called a "deep cloning".
|
To fix that, we should use the cloning loop that examines each value of `user[key]` and, if it's an object, then replicate its structure as well. That is called a "deep cloning".
|
||||||
|
|
||||||
There's a standard algorithm for deep cloning that handles the case above and more complex cases, called the [Structured cloning algorithm](https://w3c.github.io/html/infrastructure.html#internal-structured-cloning-algorithm). In order not to reinvent the wheel, we can use a working implementation of it from the JavaScript library [lodash](https://lodash.com), the method is called [_.cloneDeep(obj)](https://lodash.com/docs#cloneDeep).
|
There's a standard algorithm for deep cloning that handles the case above and more complex cases, called the [Structured cloning algorithm](https://w3c.github.io/html/infrastructure.html#internal-structured-cloning-algorithm). In order not to reinvent the wheel, we can use a working implementation of it from the JavaScript library [lodash](https://lodash.com), the method is called [_.cloneDeep(obj)](https://lodash.com/docs#cloneDeep).
|
||||||
|
|
||||||
|
@ -721,7 +721,7 @@ To access a property, we can use:
|
||||||
Additional operators:
|
Additional operators:
|
||||||
- To delete a property: `delete obj.prop`.
|
- To delete a property: `delete obj.prop`.
|
||||||
- To check if a property with the given key exists: `"key" in obj`.
|
- To check if a property with the given key exists: `"key" in obj`.
|
||||||
- To iterate over an object: `for(let key in obj)` loop.
|
- To iterate over an object: `for (let key in obj)` loop.
|
||||||
|
|
||||||
Objects are assigned and copied by reference. In other words, a variable stores not the "object value", but a "reference" (address in memory) for the value. So copying such a variable or passing it as a function argument copies that reference, not the object. All operations via copied references (like adding/removing properties) are performed on the same single object.
|
Objects are assigned and copied by reference. In other words, a variable stores not the "object value", but a "reference" (address in memory) for the value. So copying such a variable or passing it as a function argument copies that reference, not the object. All operations via copied references (like adding/removing properties) are performed on the same single object.
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue