1
0
mirror of https://github.com/ruanyf/es6tutorial.git synced 2025-05-27 20:32:21 +00:00

Merge pull request #2 from ruanyf/gh-pages

got new version
This commit is contained in:
xinnix 2016-01-14 22:14:35 +08:00
commit a34e63776e
4 changed files with 45 additions and 16 deletions

View File

@ -1173,7 +1173,7 @@ Generator函数的暂停执行的效果意味着可以把异步操作写在yi
function* loadUI() {
showLoadingScreen();
yield loadUIDataAsynchronously();
hideLoadingScreen();
hideLoadingScreen();
}
var loader = loadUI();
// 加载UI

View File

@ -137,45 +137,41 @@ fproxy.foo; // 'Hello, foo'
拦截`for (var x in proxy)`,返回一个遍历器。
**6has(target, propKey)**
拦截`in`运算符,返回一个布尔值。
**7ownKeys(target)**
**6ownKeys(target)**
拦截`Object.getOwnPropertyNames(proxy)``Object.getOwnPropertySymbols(proxy)``Object.keys(proxy)`,返回一个数组。该方法返回对象所有自身的属性,而`Object.keys()`仅返回对象可遍历的属性。
**8getOwnPropertyDescriptor(target, propKey)**
**7getOwnPropertyDescriptor(target, propKey)**
拦截`Object.getOwnPropertyDescriptor(proxy, propKey)`,返回属性的描述对象。
**9defineProperty(target, propKey, propDesc)**
**8defineProperty(target, propKey, propDesc)**
拦截`Object.defineProperty(proxy, propKey, propDesc``Object.defineProperties(proxy, propDescs)`,返回一个布尔值。
**10preventExtensions(target)**
**9preventExtensions(target)**
拦截`Object.preventExtensions(proxy)`,返回一个布尔值。
**11getPrototypeOf(target)**
**10getPrototypeOf(target)**
拦截`Object.getPrototypeOf(proxy)`,返回一个对象。
**12isExtensible(target)**
**11isExtensible(target)**
拦截`Object.isExtensible(proxy)`,返回一个布尔值。
**13setPrototypeOf(target, proto)**
**12setPrototypeOf(target, proto)**
拦截`Object.setPrototypeOf(proxy, proto)`,返回一个布尔值。
如果目标对象是函数,那么还有两种额外操作可以拦截。
**14apply(target, object, args)**
**13apply(target, object, args)**
拦截Proxy实例作为函数调用的操作比如`proxy(...args)``proxy.call(object, ...args)``proxy.apply(...)`
**15construct(target, args, proxy)**
**14construct(target, args, proxy)**
拦截Proxy实例作为构造函数调用的操作比如`new proxy(...args)`

View File

@ -13,7 +13,7 @@ var s = new Set();
[2,3,5,4,5,2,2].map(x => s.add(x))
for (i of s) {console.log(i)}
for (let i of s) {console.log(i)}
// 2 3 5 4
```
@ -358,7 +358,7 @@ class Foo {
}
```
上面代码保证了`Foo`的实例方法,只能在`Foo`的实例上调用。这里使用WeakSet的好处是数组`foos`对实例的引用,不会被计入内存回收机制,所以删除实例的时候,不用考虑`foos`,也不会出现内存泄漏。
上面代码保证了`Foo`的实例方法,只能在`Foo`的实例上调用。这里使用WeakSet的好处是`foos`对实例的引用,不会被计入内存回收机制,所以删除实例的时候,不用考虑`foos`,也不会出现内存泄漏。
## Map

33
docs/simd.md Normal file
View File

@ -0,0 +1,33 @@
# SIMD 的用法
SIMD是“Single Instruction/Multiple Data”的缩写意为“单指令多数据”。它是JavaScript操作CPU对应指令的接口你可以看做这是一种不同的运算执行模式。与它相对的是SISD“Single Instruction/Single Data”即“单指令单数据”。
SIMD的含义是使用一个指令完成多个数据的运算SISD的含义是使用一个指令完成单个数据的运算这是JavaScript的默认运算模式。显而易见SIMD的执行效率要高于SISD所以被广泛用于3D图形运算、物理模拟等运算量超大的项目之中。
为了理解SIMD请看下面的例子。
```javascript
var a = [1, 2, 3, 4];
var b = [5, 6, 7, 8];
var c = [];
c[0] = a[0] + b[0];
c[1] = a[1] + b[1];
c[2] = a[2] + b[2];
c[3] = a[3] + b[3];
c; // Array[6, 8, 10, 12]
```
上面代码中,数组`a``b`的对应成员相加,结果放入数组`c`。它的运算模式是依次处理每个数组成员一共有四个数组成员所以需要运算4次。
如果采用SIMD模式只要运算一次就够了。
```javascript
var a = SIMD.Float32x4(1, 2, 3, 4);
var b = SIMD.Float32x4(5, 6, 7, 8);
var c = SIMD.Float32x4.add(a,b); // Float32x4[6, 8, 10, 12]
```
上面代码之中,数组`a``b`的四个成员的各自相加只用一条指令就完成了。因此速度比上一种写法提高了4倍。
一次SIMD运算可以处理多个数据这些数据被称为“通道”lane。上面代码中一次运算了四个数据因此就是四个通道。