Skip to content

Commit

Permalink
add notes
Browse files Browse the repository at this point in the history
  • Loading branch information
yygmind committed Nov 12, 2018
1 parent b03721a commit 201cdbe
Showing 1 changed file with 104 additions and 0 deletions.
104 changes: 104 additions & 0 deletions daily reading/2018.11.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,114 @@

* [ES6 系列之 defineProperty 与 proxy](https://juejin.im/post/5be4f7cfe51d453339084530)

* `Object.defineProperty(obj, prop, descriptor)`直接在一个对象上定义一个新属性,或者修改一个对象的现有属性, 并返回这个对象。参数`descriptor`是必须的,如果不进行配置,可以如下。

```js
var obj = Object.defineProperty({}, "num", {});
console.log(obj.num); // undefined
```

* watch 函数简写

```js
(function(){
var root = this;
function watch(obj, name, func){
var value = obj[name];
Object.defineProperty(obj, name, {
get: function() {
return value;
},
set: function(newValue) {
value = newValue;
func(value)
}
});
// 调用set
if (value) obj[name] = value
}
this.watch = watch;
})()
```

* 使用 `defineProperty`只能重定义属性的读取(get)和设置(set)行为,ES6中的Proxy可以重定义更多的行为,比如 indelete、函数调用等。new Proxy()表示生成一个Proxy实例,target参数表示所要拦截的目标对象,handler参数也是一个对象,用来定制拦截行为。

```js
var proxy = new Proxy(target, handler);
```

* proxy 的最大问题在于浏览器支持度不够,而且很多效果无法使用 poilyfill 来弥补。

* 区别,当使用 defineProperty时修改原来的 obj 对象就可以触发拦截,而使用 proxy就必须修改代理对象,即 Proxy 的实例才可以触发拦截。

* [一些使 JavaScript 更加简洁的小技巧](https://juejin.im/entry/5bd8e8b75188254a267ef788)

* 在不重新给数组赋值的情况下,清空或截断数组的最简单方法是更改其 `length` 属性值

* 使用ES6默认参数新特性将对象解构

```js
function doSomething({ foo = 'Hi', bar = 'Yo!', baz = 13 } = {}) {
// ...
}
```

* 使用对象解构将数组项分配给各个变量

```js
const csvFileLine = '1997,John Doe,US,john@doe.com,New York';
const { 2: country, 4: state } = csvFileLine.split(',');
```

* 使用 `Promise.all``await` 多个 async(异步)函数

```js
await Promise.all([anAsyncCall(), thisIsAlsoAsync(), oneMore()])
```

* 通过`Object.create(null)`创建纯对象,不会从 Object 继承任何属性或方法(例如,`constructor``toString()` 等)。

* 使用Set语法和 Spread(展开)运算符对数组去重

```js
const removeDuplicateItems = arr => [...new Set(arr)];
removeDuplicateItems([42, 'foo', 42, 'foo', true, true]);
//=> [42, "foo", true]
```

* 使用Spread对多维数组降维

```js
// 仅适用于二维数组
const arr = [11, [22, 33], [44, 55], 66];
const flatArr = [].concat(...arr); //=> [11, 22, 33, 44, 55, 66]
// 递归平铺任意维度的嵌套数组
function flattenArray(arr) {
const flattened = [].concat(...arr);
return flattened.some(item => Array.isArray(item)) ?
flattenArray(flattened) : flattened;
}
const arr = [11, [22, 33], [44, [55, 66, [77, [88]], 99]]];
const flatArr = flattenArray(arr);
//=> [11, 22, 33, 44, 55, 66, 77, 88, 99]
```

* [理解JavaScript中的柯里化](https://juejin.im/post/5be5b5a65188250fa835897e)

* 柯里化将有多个参数的函数转化为一个的嵌套函数队列,然后返回一个新的函数,通过不断返回一个新函数直到所有参数都用完为止,这些参数会一直保持“存活”不会被销毁(闭包)。

* 编写轻松重用和配置的小代码块

* 避免频繁调用具有相同参数的函数

* `bind`就是柯里化函数




#### 119
Expand Down

0 comments on commit 201cdbe

Please sign in to comment.