Finished Chapter 6.5: Testing Properties

master
Jason Zhu 2021-01-12 15:29:35 +11:00
parent 0ab5798d1b
commit 35212b2b19
1 changed files with 54 additions and 0 deletions

View File

@ -288,6 +288,60 @@ delete globalThis.x; // This works
## 6.5 Testing Properties ## 6.5 Testing Properties
JS obj = sets of properties. We want to test membership in the set using:
* `in` operator
* `hasOwnProperty()` method
* `propertyIsEnumerable()` method
* querying property
`in` operator return true if object has an own property or an inherited property **by that name**:
```js
let o = { x: 1 };
"x" in o // => true: o has an own property "x"
"y" in o // => false: o doesn't have a property "y"
"toString" in o // => true: o inherits a toString property
```
`hasOwnProperty()` method of an obj return:
* `true` if obj has an own property with the given name
* `false` for inherited properties
```js
let o = { x: 1 };
o.hasOwnProperty("x") // => true: o has an own property x
o.hasOwnProperty("y") // => false: o doesn't have a property y
o.hasOwnProperty("toString") // => false: toString is an inherited property
```
`propertyIsEnumerable()` refines `hasOwnProperty()`. It returns:
* `true` if named property is not inherited and its *enumerable* attribute is `true`
* Properties created by normal JS code are enumerable unless specified
```js
let o = { x: 1 };
o.propertyIsEnumerable("x") // => true: o has an own enumerable property x
o.propertyIsEnumerable("toString") // => false: not an own property
Object.prototype.propertyIsEnumerable("toString") // => false: not enumerable
```
Qeurying method is simple by using `!=` to make sure whether property is undefined
```js
let o = { x: 1 };
o.x !== undefined // => true: o has a property x
o.y !== undefined // => false: o doesn't have a property y
o.toString !== undefined // => true: o inherits a toString property
```
Simple querying method vs. `in` operator:
* `in` operator can tell whether a property does not exit (`null`) or exit but not defined (`undefined`)
```js
let o = { x: undefined }; // Property is explicitly set to undefined
o.x !== undefined // => false: property exists but is undefined
o.y !== undefined // => false: property doesn't even exist
"x" in o // => true: the property exists
"y" in o // => false: the property doesn't exist
delete o.x; // Delete the property x
"x" in o // => false: it doesn't exist anymore
```
## 6.6 Enumerating Properties ## 6.6 Enumerating Properties
### 6.6.1 Property Enumeration Order ### 6.6.1 Property Enumeration Order