博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[译]ECMAScript.next:TC39 2012年9月会议总结
阅读量:6197 次
发布时间:2019-06-21

本文共 2892 字,大约阅读时间需要 9 分钟。

原文:   译者注:本文可能会看不大明白,推荐看Github上更完整的会议记录.

多亏了 ,我们才能看到这份TC39
在2012年9月18-20日期间的会议上所做的关于ECMAScript.next的决定的 .本文总结并解释了该记录的重点部分. 

9月18号

重点:
  • 国际化API(ECMA-402)的最终草案已经通过(, ).接下来会被提交到Ecma大会进行审批.该API不依附于ECMAScript,单独存在,它将被使用在ECMAScript 5或更高版本的ES标准上.
  • TC39讨论了River Trail ,这是一个能让JavaScript进行并行编程的扩展.River Trail不会被添加到ECMAScript 6中,但有可能被添加到ECMAScript 7或者更新的版本中.
  • 讨论了一段时间关于为属性批量赋值和批量定义属性的运算符.最终的决定是不使用运算符,而使用合并函数配合对象字面量的方式.这种两个对象的合并操作已经在第三方的框架中很流行了.比如,Underscore.js中的.ECMAScript 6将会引入函数:
    Object.assign(target, source)
    • source中所有自身的可枚举属性复制到target身上.
    • 属性会通过[[Get]]读取,通过[[Put]]写入.这就意味着如果target上有setters,则会在复制过程中调用它.
    • 名称为私有标志的属性不会被复制.
    • 名称为唯一标志的属性会被复制.
    • 从原型链上继承到的方法将会进行一些配置,以能够让它们在target身上运行.这些方法会拥有一个指向它们所寄身的对象的属性.
    • 返回:修改后的target.
    目前只能添加一个source,因为未来可能会有另一个参数可以指定多个属性描述符.如果你想添加多个source,你可以这样(source1先被合并进target,然后是source2,依次类推):
    [source1, source2, source3].reduce(Object.assign, target);
    JavaScript中与"定义一个属性和为一个属性赋值的区别" 有关的陷阱仍然能在这里体现.例如,如果你想在一个对象上添加属性foo,同时该对象的原型链上也有一个foo属性,且是访问器属性.那么Object.assign()不会让你在该对象身上添加foo这个属性,而是会调用那个访问器属性上的setter.有个函数Object.define()仍有待于进一步研究,以决定它是否应该被加入到ECMAScript 6中.
    Object.define(target, source)
    • source中所有的自身属性复制到target身上.
    • 属性是这样赋值的:首先读取source身上的属性描述符,然后使用这个属性描述符在target身上定义属性.
    • 名称为私有标志的属性不会被复制.
    • 名称为唯一标志的属性会被复制.
    • 从原型链上继承到的方法将会进行一些配置,以能够让它们在target身上运行.
    • 返回:修改后的target.
  • 可枚举的的方法: ECMAScript.next提供了一种更紧凑的的方式来在对象字面量中定义方法:
    obj = {
    theMethod(x, y) {
    return x * y; } };
    就相当于现在的:
    obj = {
    theMethod: function (x, y) {
    return x * y; } };
    以这种方式定义的方法将会是可枚举的.David Herman说过: “用户期望的现象是:它们创建的东西是可以枚举的,平台创建的东西是不可枚举的.”

9月19号

重点:
  • 提炼更好的proxy API.
  • 属性名对象现在正式称之为标志(symbols)了. 这是一个很好的决定.现在你可以这么说:每个属性都有个名称.名称可以是一个字符串,或者是一个标志.
  • 标志(symbols)的语法一共有两个需要注意的地方:首先,最初引入了一个大部分人难以理解的间接引用写法:
    let sym = new Symbol(); let obj = {
    // 计算出的属性名(已废弃特性!): [sym](x, y) {
    ... } }; console.log(obj[sym](7, 5));
    取而代之的是下面这种更容易理解的写法:
    private @sym; let obj = {
    @sym(x, y) {
    ... } }; console.log(obj.@sym(7, 5));
    其次,如果一个对象或者一个类拥有很多的私有属性的话,会造成冗余,因为你不得不每次都声明一个标志.如何尽可能的避免这种冗余,还需进一步讨论.

9月20号

重点:
  • :该方法提供了一种机制,可以用来进行内置的数据绑定行为.数据绑定已经被使用在了很多的用户界面框架中(比如:qooxdoo, SproutCore):如果有人改变了一个模块对象的某个属性的值,则这次改变马上会在用户界面上体现出来.Object.observe()不会被添加到ECMAScript 6中,但有可能出现在ECMAScript 7中.Chrome已经实现了一个该特性的原型.
  • 瘦箭头:目前,ECMAScript 6中只有胖箭头(=>)函数.它可以提供一种更紧凑的写法来创建一个非方法的函数(non-method functions,拥有词法this,也就是静态this).有些人还希望引入一个瘦箭头(->)函数,它和普通的函数一样,有动态的this.可是,TC39达成的共识是:这两种相似的语法可能会让用户感到困惑,因为他们不得不在完成某项任务前首先思考清楚该使用哪种箭头.传统的函数写法仍然可用,可以用来代替瘦箭头函数.我喜欢这个决定,因为我们多了一个写法更简单的选择:
    • 需要一个方法? 在类或对象字面量中使用紧凑形式的方法定义.
    • 需要一个非方法的函数? 使用一个(胖)箭头函数.
    这就意味着,从长远看来,我们可能不会需要将this作为隐式参数传入一个非方法的函数中了(通过call或apply).在这种情况下,必须显式的将this作为参数传进去.
  • 存在运算符(Existential operator):CoffeeScript给我们提供了一种链式的属性访问方式,其特点是能在出现第一个值为undefined或null的属性时提前结束剩余属性的读取:
    result = obj?.prop1?.prop2?.prop3
    TC39认为这个特性是有用的,但在目前它的优先级还是不够.因此,也许不太可能会出现在ECMAScript 6中.
  • 时间进度表:ECMAScript 6规范应该会在2013年1月完成所有的特性制定工作(feature-complete).

参考

  1. [解释了TC39是什么]

转载地址:http://pcuca.baihongyu.com/

你可能感兴趣的文章
leetcode 237 Delete Node in a Linked List python
查看>>
(转)清华学霸演讲稿:永远不要说你已经尽力了
查看>>
[转载]获取IP
查看>>
4.ASCII码排序
查看>>
关于H5唤醒APP的功能实现
查看>>
java 判断请求来自手机端还是电脑端
查看>>
SQL SERVER的整型运算,让人大吃一惊
查看>>
掀开图片显示介绍的css效果
查看>>
SQL Server基础知识
查看>>
soket.io.js + angular.js + express.js(node.js)
查看>>
开源CMS比较
查看>>
Unity 灯光探针用法教程
查看>>
最高优先级算法——进程调度
查看>>
转载:SVN分支合并
查看>>
nginx 负载均衡5种配置方式
查看>>
LR C语言语句复习,几个简单代码
查看>>
Oracle 内存参数设置
查看>>
HDU4813 Hard Code
查看>>
自测之Lesson16:并发通信
查看>>
2-SAT问题
查看>>