Giter VIP home page Giter VIP logo

es6tutorial's People

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

es6tutorial's Issues

一些问题

勘误

Proxy

Proxy对象的所用用法,都是上面这种形式,不同的只是handler参数的写法。其中,new Proxy()表示生成一个Proxy实例,target参数表示所要拦截的目标对象,handler参数也是一个对象,用来定制拦截行为。

“所用用法“应该是“所有用法“

上面代码中,proxy对象是obj对象的原型,obj对象本身并没有time属性,所有根据原型链,会在proxy对象上读取该属性,导致被拦截。

“所有“应该是“所以“

Reflect对象的方法清单如下。
* Reflect.getOwnPropertyDescriptor(target,name)
* Reflect.defineProperty(target,name,desc)
* Reflect.getOwnPropertyNames(target)
* Reflect.getPrototypeOf(target)

Reflect对象的方法清单漏了 Reflect.setPrototypeOf(obj, newProto),在清单后面的几个方法的解释中提到了这个方法

Iterator

对于类似数组的对象(存在数值键名和length属性),部署Iterator接口,有一个简便方法,就是Symbol.iterator方法直接引用数值的Iterator接口。

“数值的Iterator接口“应该是“数组的Iterator接口”

ES6规定,默认的Iterator接口部署在数据结构的Symbol.iterator属性,或者一个数据结构只要具有Symbol.iterator属性,就可以认为是“可遍历的”(iterable)。也就是说,调用Symbol.iterator方法,就会得到当前数据结构的默认遍历器。Symbol.iterator本身是一个表达式,返回Symbol对象的iterator属性,这是一个预定义好的、类型为Symbol的特殊值,所以要放在方括号内(请参考Symbol一节)。

感觉文中Iterable,Iterator,IteratorResult三个接口并没有明确区分,主要是前两者,比如说上面的引用段落

“默认的Iterator接口“应该是Iterable接口可能更合适些,其它部分也有类似表述问题。

对数组和Set结构进行解构赋值时,会默认调用iterator接口。

文中说的“调用iterator接口”表述上是不是有些不当,我觉得调用接口的方法更加合适些。

上文中说调用Iterable接口的Symbol.iterator方法是不是更准确些。 或者简单说调用Symbol.iterator方法。

Generator

Symbol.iterator属性执行后,返回自身。

属性应为方法

上面代码中,delegatingIterator是代理者,delegatedIterator是被代理者。由于yield* delegatedIterator语句得到的值,是一个遍历器,所以要用星号表示。运行结果就是使用一个遍历器,遍历了多个Genertor函数,有递归的效果。

Genertor 应该为 Generator

如果遍历器函数内部没有部署try...catch代码块,那么throw方法抛出的错误,将被外部try...catch代码块捕获。

这里“遍历器函数“是不是应该是“Generator 函数“

上面代码只输出hello就结束了,因为第二次调用next方法时,遍历器状态已经变成终止了。但是,如果使用throw方法抛出错误,不会影响遍历器状态。

“throw方法“应该为“throw命令“

Promise

上面代码中,Promise指定在下一轮“事件循环”再抛出错误,结果由于没有指定catch语句,就冒泡到最外层,成了未捕获的错误。

文中说“没有指定catch语句“,这里的“catch语句“是指try-catch语句吧,感觉容易误想成catch方法

Class

在ES5中,每一个对象都有__proto__属性,指向对应的构造函数的prototype属性。Class作为构造函数的语法糖,同时有prototype属性和__proto__属性,因此同时存在两条继承链。

__proto__虽然大多数浏览器支持,但是前面章节也讲并没有加入ES6,这里这么说"在ES5中,每一个对象都有__proto__属性“是不是不太合适

Module

然后,main.js文件输入circlek.js模块。

circlek.js 应该为 circle.js

console.log(exp(math.pi));

math.pi是不是应该是math.e

一些疑问

Symbol

http://www.ecma-international.org/ecma-262/6.0/#sec-ecmascript-language-types 有下面的描述

The ECMAScript language types are Undefined, Null, Boolean, String, Symbol, Number, and Object.

为什么Symbol一章中讲的是8种数据类型?

Class

构造函数的prototype属性,在ES6的“类”上面继续存在。事实上,除了constructor方法以外,类的方法都定义在类的prototype属性上面。

constructor不也是prototype的一个属性吗

Module

sfirsetHeader

没明白这个函数名的意思

Class 和 Module 一章 有关 super 的问题

Class 和 Module 一章 Class 的 继承 一节 (1)基本用法 部分:

子类的非 constructor 中如果需要调用父类的方法,还是需要 super.METHOD_NAME() 的,无论方法是否同名。

所以该部分的 demo 应该修改为

class ColorPoint extends Point {

  constructor(x, y, color) {
    super(x, y); // 等同于parent.constructor(x, y)
    this.color = color;
  }

  toString() {
    return this.color+' '+super.toString(); // 等同于parent.toString()
  }

}

同时 demo 下面的描述也需要相应修改。

本地化查看书本的一个小问题

首先很感谢分享,支持开源。

今天从BLOG上查相关资料找到这本书,很想弄成离线的版本,大概知道实现原理之后,发现本地使用localhost/index.html查看的时候任何页面都会是首页。
仔细研究了一把ditto.js以后,发现他是根据hash来进行定位的,然后首先是查询index.html是否,但是注释是path为空:
// default page if hash is empty
if (location.pathname === "/index.html") {
于是我改为:
if (location.pathname === "/index.html" && !path) {
这样不论是不是有些index.html都可以跑了,不知道是否有意修改一下JS,=w=不过还不知道为何本地无法开启,非开一个server,研究一下。

let章节的两个细节

  • 不存在变量提升 这一节结尾对typeof的解释可能引起歧义,这里typeof x 报错的原因并不是不存在变量提升和**x还没有声明**,而是因为下面的let x导致的暂时性死区。单独一句typeof x并不会报错,关于typeof的这一段移到下一节比较好。

  • const命令 中的这一段:

    const foo;
    // SyntaxError: missing = in const declaration

    上面代码表示,对于const来说,只声明不赋值,就会报错。

    const不赋值的话,只有在严格模式下才会报错。

    另外下面的:

    ```javascript
    const foo = Object.freeze({});
    foo.prop = 123; // 不起作用
    ```
    上面代码中,常量foo指向一个冻结的对象,所以添加新属性不起作用。
    

    给冻结对象添加属性,在常规模式下是不起作用,在严格模式下则会报错。
    结合这两段代码示例,前者运行在严格模式,后者运行在常规模式,而不同摸下的结果都不同,我觉得全书的示例最好统一到一个模式下,或者单独标明是哪种模式。

page 17: let实际上为JavaScript新增了块级作用域。

是不是表述有误?
比如:
for(var i = 0;i< 10;i++){
let c = i;
}
将let声明换成var声明,此时,不是每一次for循环都还是会创建一个块级作用域吗?
所以说,let实际上为javascript新增了块级作用域 这种说法是不是不太正确。

您的教程缺失了一些细节

当新的标准振奋着Web程序员时,Worker总被人遗忘。
新的标准哪些能通过MessageChannel哪些不能望讲解,这方面的浏览器的实现很挫,不敢置信

Class 和 Module 一章 有关 prototype 和 __proto__ 的问题

我觉得 Class 和 Module 一章 Class 的 继承 一节 (2)prototype 属性 部分,有点问题。

class A {
}

class B extends A {
}

在 ES6 中这样使得 B 继承 A 之后,会形成两条原型链

  1. B.__proto__ === A
  2. B.prototype.__proto__ === A.prototype

via: http://www.2ality.com/2015/02/es6-classes-final.html

prototype__proto__ 是有区别的,这点阮老师应该了解。

所以这部分的一些说法应该是 子类的 __proto__ 属性都指向父类

以及

class A {
}

A.__proto__ === Function.prototype
// true

class B extends A {
}

B.__proto__ === A
// true

class C extends Object {
}

C.__proto__ === Object
// true

但考虑到如果全部改成这样就跟这部分的标题 (2)prototype 属性 不符了,所以就不直接 PR 了。

界面在某些情况出现了问题

在保证不进入手机画面的前提下缩小网页宽度,会出现左右移动的滚动条,把条条向右移,正文就向左移动了,此时正文会透过目录显示出来。希望把目录的背景设成白色以避免此情况。

不错

阮老师有时间可以翻译ecma-262这本书。专业术语太多了

function.md一章中 展开数组 [...5] 经过测试有误

精彩的教程,非常感谢。
function.md章节中提到:

扩展运算符还可以将字符串转为真正的数组。

[..."hello"]
// [ "h", "e", "l", "l", "o" ]

这里是对的。但是除了展开数组,扩展运算符还可以将一个数值扩展成数组。

[...5]
// [0, 1, 2, 3, 4, 5] 

实际上得到的却是 []

测试使用的 babel.js 将es6 转换成 es5, 并在node下运行。

字符串的扩展(勘误)

http://git.io/vsQ4i

如果大括号中的值不是字符串,将按照一般的规则转为字符串。不如,大括号中是一个对象,将默认调用对象的toString方法。

文中“不如”应该是“比如”吧。

tag函数所有参数的实际值如下。
第一个参数:['Hello ', ' world ']
第二个参数: 15
第三个参数:50

第一个参数是否应该是 `['Hello ', ' world ', '']

本书第16节 `Promise对象` 中的一个问题

书中提供的代码:

var getJSON = function(url) {
  var promise = new Promise(function(resolve, reject){
    var client = new XMLHttpRequest();
    client.open("GET", url);
    client.onreadystatechange = handler;
    client.responseType = "json";
    client.setRequestHeader("Accept", "application/json");
    client.send();

    function handler() {
      if (this.status === 200) {
        resolve(this.response);
      } else {
        reject(new Error(this.statusText));
      }
    };
  });

  return promise;
};

handler 函数的实现上, 在进行检测是否请求完成的时候缺少对readyState的检测,
产生的后果是, 在 readyState 等于 2(第一次触发)的时候, resolve 就被触发了.

见下图:
image

再加上后面第3节中的示例代码:
image

产生的效果就是: 第一个 then 被触发后, 得到了 null, 然后在 null 的基础上去取 post 属性, 从而产生异常, 打断了后面第二个then中绑定的函数.

至此, 我忍不住的想问一下楼主,在您编写文章的时候是否真的运行过文章中所编写的代码?

刚在Google上查了一下 Promise getJSON, 然后发现文章中的代码和rsvp中的很像, 然后又查看了一下参考链接, 发现里面果然有 rsvp.js.

可人家的 handler 中有检测 readyState, 可您的却没有.
image

另有一个建议, 在您文章中帖出代码的时候, 如果不是您自己的, 建议你的代码的后面附上出处哪里, 而不是放在 参考链接 中, 因为 99% 的人, 从不看 参考连接, 这就会让人们误以为,哇他好厉害,什么都知道,这代码真牛b,等等之类的想法.

打不开文档

下载的zip文档, 解压后直接双击index.html, 但是浏览器里只能看到左右两个frame, 没有其他内容, 难道不是这样打开的吗?

关于let的问题

按IE11的实现,全局作用域定义的let变量不作为全局对象的属性,但其它JavaScript引擎像Firefox的和Chromium的都把let变量作为全局对象的属性,但因为它们仅支持eval中的let,实在让人存疑它们的实现是否正确,反而IE11的实现看来更靠谱。阮老师您书中可以讲一下这方面在标准中的说法吗?

let和const章节例子结果错误

ES6允许块级作用域的任意嵌套。

{{{{{let insane = 'Hello World'}}}}};
insane // "Hello World"

上面代码使用了一个五层的块级作用域。外层作用域无法读取内层作用域的变量。

这段insane应该是报错吧.

Promise 的疑问

阮老师,在书中(Page 122-123)的Promise.resolve方法中,其中讲到回调立即执行,我有些疑问:
我将代码做了如下改动(只是增加了些内容)
var p = Promise.resolve('Hello');
var d = '';

p.then(function (s){
console.log(s);
console.log(d);
})
d = 'oked'
console.log(p);
//
结果:
Promise { 'Hello' }
Hello
oked
看此,p仍然是异步等待的
初学node,希望老师解惑

新的JavaScript需要新的子集

记得ECMAScript5之前那会儿,一些JavaScript大牛拟定了JavaScript子集,如今什么都变了,阮老师能不能讲讲现在的JavaScript哪些是“优秀的功能”,哪些是“拖后腿的功能”,以及JavaScript的未来发展方向

畫面顯示問題

頁面放大後(不到最大),將畫面滑到右側,nav bar會遮蓋body正文

「勘误」: 12. Promise对象一节出现错误

错误类型:代码Bug,
错误范畴:Ajax,
错误位置: >> 12. Promise对象一节,
详细信息:

client.onreadystatechange进行回调处理时,handle方法中
没有判断**readyState**的状态, 这样带来的结果是 **readyState == 2**时提前触发了resolve回调函数,导致运行错误。

ArrayComprehension

网站上留言估计看不到。

firefox30已更改为标准实现,赋值表达式是在末尾,for关键字作为lookahead确定进入arraycmph。

https://developer.mozilla.org/en-US/Firefox/Releases/30

ArrayComprehension[Yield] :

[ Comprehension[?Yield] ]

Comprehension[Yield] :

ComprehensionFor[?Yield] ComprehensionTail[?Yield]

ComprehensionTail[Yield] :

AssignmentExpression[In, ?Yield]

ComprehensionFor[?Yield] ComprehensionTail[?Yield]

ComprehensionIf[?Yield] ComprehensionTail[?Yield]

ComprehensionFor[Yield] :

for ( ForBinding[?Yield] of AssignmentExpression[In, ?Yield] )

ComprehensionIf[Yield] :

if ( AssignmentExpression[In, ?Yield] )

ForBinding[Yield] :

BindingIdentifier[?Yield]

BindingPattern[?Yield]

正文内容样式可以美化下的

#content{
    font-size:1.2rem;
    width:auto;
    margin-right:20px;
    font-family:"Segoe UI","Lucida Grande",Helvetica,Arial,"Microsoft YaHei",FreeSans,Arimo,"Droid Sans","wenquanyi micro hei","Hiragino Sans GB","Hiragino Sans GB W3",Arial,sans-serif;
    line-height:1.8;
}

关于 Reflect.get 一节的问题

(1)Reflect.get(target, name, receiver)

查找并返回target对象的name属性,如果没有该属性,则返回undefined。

如果name属性部署了读取函数,则读取函数的this绑定receiver。

var obj = {
get foo() { return this.bar(); },
bar: function() { ... }
}

// 下面语句会让 this.bar()
// 变成调用 wrapper.bar()
Reflect.get(obj, "foo", wrapper);

以上,Relect.get 中提及的是 foo,而产生影响的是 bar,看着很是惊讶,由于本人是 es6 初学者,不能断定是否有误,特此发文提问一个,以作确认~

20. Module - 6. 模块的继承 - 例子中有错别字

第一个例子:
export * from 'circle';
export var e = 2.71828182846; // 这里的 e 是小写
export default function(x) {
return Math.exp(x);
}

第三个例子:
// main.js
module math from "circleplus";
import exp from "circleplus";
console.log(exp(math.E)); // 这里的 E 是大写

第三章-变量的解构赋值

// 错误的写法

var x;
{x} = {x:1};
// SyntaxError: syntax error

babel 4.7.16能通过赋值,反而({x}) = {x:1};这个出错

clone 到本地后无法查看

clone 到本地后,点击index.html 无法查看,浏览器弹出js提示框:
JavaScript 提醒:Opps! can't find the sidebar file to display!

然后是一个空白页面。

array和object两章(勘误)

http://git.io/vsFjw

对于还没有部署该方法的浏览器,可以用Array.prototyp.slice方法替代。

prototyp应该是prototype

http://git.io/vsbee

有两种特殊情况:bind方法创造的函数,name属性返回“bound”加上原函数的名字;Function构造函数创造的函数,name属性返回“anonymous”。

这句前后两个例子其实是一样的。

关于 ECMA6 对 Generator 运行结束后再调用 next 的Issue

文档 中描述

由于此时函数已经运行完毕,next方法直接抛出一个错误。

我测试了一下,在 firefox 版本 29 和 nodejs 上,获取到的结论是不会抛错,返回值为

{value: undefined, done: true}

简单跟了一下,翻了下相关资料,firefox 原本是抛出异常,但这个被视为一个 bug 在 firefox 29 版本中已经修复

相关源码见 1, 2

另外,MDN 上这篇文章 给出了一个不同的写法,也就是没带*****号. 具体看他们的代码:

function simpleGenerator(){ //注意这里,没有*
    yield "first";
    yield "second";
    yield "third";
    for (var i = 0; i < 3; i++)
    yield i;
}
var g = simpleGenerator();
print(g.next()); // prints "first"
print(g.next()); // prints "second"
print(g.next()); // prints "third"
print(g.next()); // prints 0
print(g.next()); // prints 1
print(g.next()); // prints 2
print(g.next()); // StopIteration is thrown

对于这种写法的 case,会抛出异常uncaught exception: [object StopIteration]

这种写法抛出异常属于正确行为,因为它本身是函数,只是因为 yield 关键字的存在能够达到中断执行函数的目的,当函数执行完毕再调用 next 抛出异常可以理解。

但是就 Generator 来说,个人观点是,已经完成的遍历器再调用 next,不管调用多少次依然返回{done:true} 从语义上来说更合理些

否则日后想要判断一个遍历器是否完成都比较繁琐了,当第一次调用 next 完成时返回 {done: true} ,以后再调用都抛错这种机制也稍显混乱。

请阮兄这里再确认一下。

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.