看iOS的 Node.js 进阶之路 之 ECMAScript(ES6) 篇

看iOS的 Node.js 进阶之路 之 ECMAScript(ES6) 篇


@author Jou Email Weibo or Github

又有点时间,聊聊天。先丢出来几篇有意思的文章。

About Objc.

  1. Clang Attributes 黑魔法小记

About Swift.

  1. Protocol-Oriented Views in Swift

About Tools.

  1. Core animator 帮助你制作关键帧动画。

从 React Native 到 JSPatch, 我真真切切的感觉到 JS 是一门足够全栈的语言。
Node.JS 不单单可以帮助我们在鄙视链或技能树上走的更远, 也可以帮助我们写出更好的 RN 和 JSPatch 代码, 开拓新的心里安全区。 而且 Node.JS 它真的是足够简单,简单到可以分分钟上手。
相比其他发展,移动端还足够稚嫩,以至于我们常常需要借鉴不同的知识帮助我们完成最佳实践的过度。
这些最佳实践的参考包括从 Haskell 到 Swift, 抑或 从前后端 gem pip maven npm 三方依赖解耦到 Cocoapods or 分布式的 Carthage。
或者如果你还不知道eTag, 那么这些方面的探究就更加必要。

ECMAScript vs. Javascript

Javascript实际上是ECMAScript-262标准的实现和扩展。
Javascript 通行版本,包括这三部分

  1. ECMAScript
  2. DOM (Document Object Model)
  3. BOM (Browser Object Model)

DOM & BOM

一张图看懂,DOM 与 BOM

屏幕快照 2016-05-24 下午3.21.21.png

ECMAScript

ECMAScript History, ECMAScript 的黑历史。

.1998.Y ECMAScript 2.0 发布。 1999.Y ECMAScript 3.0 版本发布,继而成为JavaScript的通行标准。
而后,.2007.Y 由于 ECMAScript 4.0 版本改动过于激进 or 过于前瞻,引发分歧.
时间到了 .2008.Y 3.0 吸纳了小部分改善,成为了日后的 ECMAScript 3.1, 后更名成 ECMAScript 5.0。 原 4.0 开始使用代号 "Harmony".
.1999.Y ECMAScript 5.0版正式发布. Harmony项目则一分为二,一些较为可行的设想定名为
JavaScript.next继续演变,成为了现在的 ECMAScript 6.
.2000. ECMAScript 6发布正式版本,即 令人激动人心的ECMAScript 2015.

Brendan Eich (inventor of JavaScript) 主要方向和兴趣是函数式编程, 所以,ECMAScript 在很多方面,都像在帮助这门语言,更好的支持函数式编程。

查看 node 版本对Hamony的支持情况,可以通过命令:


node --v8-options | grep harmony


或者通过更符合人类能读懂的方式,通过 npm 安装 es-checker,查看本机 node 对Hamony的支持。
输出结果是基于 node v6.2.0


$ npm install -g es-checker
$ es-checker

=========================================
Passes 36 feature Dectations
Your runtime supports 83% of ECMAScript 6
=========================================

如何用 node 暂时不支持的 ES 6 特性呢?!
可以使用 (Babel)[https://babeljs.io/]。帮助我们做 es 6 到 es 5 语法的转换。

同时,npm run 也有很多有趣的玩法, 有关 Babel or npm run很可能会放到下一篇。

ECMAScript 6

打算系统研讨ECMAScript 6的小伙伴可以参考(ECMAScript 6)[http://es6.ruanyifeng.com/#README], 作者是便是无处不在的 阮一峰

在了解 ES 6 之前, 先解释下 ES 5 的标记 'use strict'

'use strict'

很多情况下, 第一行都有标记'use strict', 在初学的过程中,由于学习曲线陡峭,我们很有可能忽略他。

'use strict', 会要求JS的解释更严格,帮助我们,开发更符合预期的,更合理、更安全、更严谨的代码,消除很多不可预期的行为。
例如代码

PS 在 ES6 中,默认便是 'use strict', 这也便是为什么 react-native init 出来的项目工程,在index.js里没有这行代码。

  i = 1; // error,i未声明

窥视 ECMAScript 6 新特性

如果你像我一样在使用Atom, 强烈建议安装package 'es6-javascript'。
Code 片段,我都尽量保证了核心特性的同时又不显得冗余。打算深入研究的,再次推荐ECMAScript 6这篇文章。

0x0. 新增 let, const, let 但不同于 swift

身为 iOS 专业搬砖员, 我们都知道 swift 引入了 let,用于声明不可变的变量。
ES 6 中 let 同样是变量, 但增加了块内有效的限制,所以在 ES 6 中,在全局, 函数的基础上,新增了块作用域。
const 就尤为明显了, 用于常量声明。

{
  let a = 10;
  var b = 1;
}

a // ReferenceError: a is not defined.
b // 1

const PI = 3.1415;
PI = 3; // 常规模式时,重新赋值无效,但不报错
PI // 3.1415

0x1. 全局变量

node.js 中全局变量

    global.num = 1;
    

0x2. 数组的模式匹配赋值

//普通模式匹配
let [head,tail] = [1, 2, 3, 4];
//head 1 tail 2

//复杂一点的模式匹配
let [head, ...tail] = [1, 2, 3, 4];

//head 1
//tail [2,3,4] ...将按数组模式匹配

//再复杂一点的模式匹配
let [head,[mid], ...tail] = [1,[2, 3], 4];
//head 1
//mid 2
//tail [4]

0x3. 对象的模式匹配赋值


let { bar:foo } = { foo: "aaa", bar: "bbb" };

所以此刻 bar,foo 是什么呢?!
log:

foo 'bbb'

bar //not define

你们感受下。

0x4. 新增字符串索引方法

includes(), startsWith(), endsWith().

含义很清晰,所以很好理解,顺手与 iOS 中的消息做下对比。

  1. includes -> rangof:
  2. startsWith -> hasPrefix:
  3. endsWith - > hasSuffix:

let rlt = 'apple'.includes('a')

0x5. 模板字符串

注意这里模板字符串这里是反引号(`)。

let count = 1;
let money = 100;
let content = 
`
  There are <b>${count}</b> items
   in your basket, <em>${money}</em>
  are on sale!
  
`

0x6. 声明对象更简洁


let gender = 'male';

let cat = {

  name: '雪球',

  gender,
  //等同于 ES5 gender: gender

  desc() { return `我有个宠物叫, ${this.name}`; }
  // 等同于 ES5 desc: function ()...

};

0x7. Class 语法糖

  • ES5 对象声明

let cat = {
    name: '雪球',
    gender: 'male'
}

简单直接, 但问题有:

  1. 缺少结构化特性,声明多个比较困难
  2. 缺少类型判断

演进: 构造函数声明:


function Cat(name,color){
    this.name = name;
    this.color = color;
    this.type = "猫科动物";
    this.eat = function(){alert("吃老鼠");};
  }

  • ES6

class Cat {
    constructor(name,gender) {
      this.name = name;
      this.gender = gender;
    }
  }

0x8. 元编程

元编程,即对编程语言进行编程。ES6 中 Proxy,可以帮助我们切入编程语言的某些环节,做拦截处理。

var animal = new Proxy({}, {
  set: function (target, key, value, receiver) {
    console.log(`setting ${key}!`);
    return Reflect.set(target, key, value, receiver);
  }
});

animal.name = 'animal';

// setting name!

所以我们可以使用这种方式,切入很多环节。

0x9. Promise

其实CommonJS规范就包括Promise规范,Promise完全改变了js异步编程的写法,让异步编程变得十
分的易于理解。然后 ES6 令人激动的加入了 Promise

So what is Promise ?

其实 Promise 解决的问题并不局限于 JS 语言,Promise 解决了一种长久以来诟病很多的异步处理方式,并提出了优秀的解决方案,

在异步处理中, 我们常会使用回调函数(匿名函数,抑或,闭包), 形成一种金字塔似的代码, 比如:


Parse.User.logIn("user","pass", {
 success:function(user) {
  query.find({
   success:function(results) {
    results[0].save({ key: value }, {
     success:function(result) {
      // the object was saved.
     }
    });
   }
  });
 }
});

使用 Promise 解决方案 后的 样子:


Parse.User.logIn("user","pass").then(function(user) {
 return query.find(); // find user
}).then(function(results) {
 return results[0].save({ key: value }); // save object
}).then(function(result) {
 // the object was saved.
});

使用函数编程,链式调用后的异步处理流程,变得异常清晰。扁平化后的金子塔结构瞬间清爽了。

其实 Promise 使用上非常简单,
首先, Promise 有三种状态:

  1. Pending(进行中)
  2. Resolved(已完成)
  3. Rejected(已失败)

then 方法返回一个新的 promise 实例,所以可以链式调用。


let promise = new Promise(function(resolve, reject) {
   let cat = new Cat('雪球','male');
    console.log('Promise');
    resolve(cat);
  });

  promise.then(function(cat) {
    console.log('Resolved.'+ cat.name);
    return cat.name;
  }).then(function(name) {
    console.log(name);
  });
  

Promise.resolve() 帮助我们普通实例 到 promise 实例的转换。

PS objc, swift 有相关 Promise 实现。 感兴趣,可以探索相关实践。

后言

希望多多反馈,多多交流。

还在酝酿中的下一篇 : Node.js Rock Rock 进阶之路 之 RESTFul API 搭建 Express 篇

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,108评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,699评论 1 296
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,812评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,236评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,583评论 3 288
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,739评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,957评论 2 315
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,704评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,447评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,643评论 2 249
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,133评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,486评论 3 256
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,151评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,108评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,889评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,782评论 2 277
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,681评论 2 272

推荐阅读更多精彩内容

  • Node.js是目前非常火热的技术,但是它的诞生经历却很奇特。 众所周知,在Netscape设计出JavaScri...
    w_zhuan阅读 3,578评论 2 41
  • Node.js是目前非常火热的技术,但是它的诞生经历却很奇特。 众所周知,在Netscape设计出JavaScri...
    Myselfyan阅读 4,042评论 2 58
  • 一次宿舍在闲聊,聊到了关于熬夜的这个事,突然意识到好像从初中开始,我们就开始有熬夜这个习惯了,算到大学差不多有七八...
    过日子的绘酱阅读 346评论 1 2
  • 2014年的2月6日,我给自己制定了新年计划,与文字相关的有四条。1、坚持夜话栏目(这是我每周给朋友群发的一封信,...
    寂静欢喜阅读 423评论 1 2
  • 生活总是不经意的触碰残忍的现状,我替母亲岁月里未得到或已失去的感到深深委屈,泪流满面的回想生活的真相是这般朴素另人...
    397f2d7b7d0b阅读 175评论 0 0