Node.js入门(四) : Node.js与ES6

ES6

  • ECMAScript es标准的作用 定义js的发展方向的一套标准,新的语法,写起来更严谨更安全更简便。
  • 是向下兼容ECMAScript 5.1的
  • 2015年6月就已经发布了,但是由于浏览器的兼容性,在前端开发中,应用性并没有在Hybid APP、nodejs开发中那么高
  • ES6对JavaScript的改变还是很大的,个人感觉如同jdk 1.5之于Java了,不过一系列的新增语法,也让一些js开发朋友褒贬不一,有人说限制了js的简洁性,也有人说是对开发性的一种提高(不过,刚开始上手的话,还是建议ES5开始,体验一下js作为脚本语言没有逐步进化时灵活的魅力)
  • 目标:让JavaScript语言可以用来编写大型的复杂的应用程序,称为企业级开发语言。

为什么前端不用,node要用?

  • 前端

    • 太受浏览器的限制(IE Chrome Safari Firefox等等)
  • Node.js

    • Node.js代码是只运行在Chrome v8平台上,其对ES6的兼容性还是不错的,并且只运行在服务器端,所以不用考虑其他兼容性
    • ES6确实能给我们带来很多方便
    • Node.js 覆盖了93%的ECMAScript 6
  • 阮一峰es6入门 http://es6.ruanyifeng.com/#README 阮老师这本书很系统,本文中,只会简单讲一些nodejs比较常用的新增语法,有什么不足之处,欢迎指正

严格模式: strict mode

消除Javascript语法的一些不合理、不严谨之处,减少一些怪异行为;
  - 消除代码运行的一些不安全之处,保证代码运行的安全;
  - 提高编译器效率,增加运行速度;
  - 为未来新版本的Javascript做好铺垫。
'use strict' 一旦使用这个,就表示必须要摒弃旧语法
保留字:
一旦出现Unexpected strict mode reserved word这样的错误说明你用保留字做了参数名了。
es6-->implements, interface, let, package, private, protected, public, static, yield
es5-->class, enum, export, extends, import, super

阮一峰 严格模式 http://www.ruanyifeng.com/blog/2013/01/javascript_strict_mode.html

块级作用域

凡是被{}包裹的代码属于一个代码块,自成一块作用域

ES6之前,JavaScript是: 词法作用域  + 函数作用域  +  变量提升规则。
ES6:
    但凡是let、const定义的变量,都增加了块级作用域的限制(var的不受限制,大括号外还是能访问到)
    但凡是let、const定义的变量都取消了变量提升规则,即先访问,再定义行不通了. "严格模式下,运行会报错"
    ES6里面不建议使用var了,因为var定义的变量没有块级作用域,还会出现变量提升的情况,这样经常会导致你意想不到的错误
  • 块级作用域对函数定义的影响
function foo () {
    console.log('I am the outside one')
};

(function(){
    //因为在ES5中是没有块级作用域的,if中的函数定义,会被提升到这
    //function foo() { console.log('I am the inside one') }
    if(false){
        // 重复声明一次函数
        function foo() {
            console.log('I am the inside one')
        }
    }

    foo();  // 在ES5中运行会得到“Iam inside”, 但是在ES6中运行,则会得到“Iam outside”
}());

这个特性很容易引起冲突,因为我们很难判断我们代码的运行环境究竟在哪里,是遵循ES5的法则还是遵循ES6的法则。所以当这段代码运行在nodejs环境中的时候,编译器会选择直接报错,而并不像理论上分析得到的结果那样。
我们应该尽量规避上面那种情况,使用严格模式。在严格模式下,函数必须定义在顶级作用域,定义在if,for语句中会直接报错。

  • 块级作用域对变量定义的影响(死区)
let foo = 'foo';
if(true){
    console.log(foo);
    let foo = 'foo bar';
    console.log(foo);
}

下面的代码在第一次输出foo的时候会报错,提示foo没有定义,这就是死区效应

只要块级作用域内存在let命令,它所声明的变量就绑定在这个区域,不再受外部影响。ES6明确规定,只要块级作用域中存在let命令,则这个块区对这些命令声明的变量从一开始就形成封闭的作用域。只要声明之前,使用这些变量,就会报错。只需要记住:在块级作用域内如果使用let声明了某个变量,那么这个变量名必须在声明它的语句后使用,即使块外部的变量有与之重名的也不行。从块开头到声明变量的语句中间的部分,称为这个变量的“暂时性死区”

这样也意味着我们不再能使用typeof关键字检测某个变量是否被声明了:

typeof x; // 返回'undefined',即使x没有声明
typeof x // 与let x =10。一起使用则报错。
let x = 10;

ES6之所以如此设计,是为了减少运行时错误,防止变量在声明前使用。

为了避免死区,提供两种方法:
一、是像java那样在编写代码时里层和外层尽量不重名。
二、是像编写传统的js代码那样,把变量在块级作用域顶层进行声明,虽然let的产生实现了java中声明变量的效果,很多人推荐使用就近原则。

参考链接:https://blog.csdn.net/hukaihe/article/details/70142802

let、const

let

  1. 在for循环中,let命令每次定义的作用域都在本次循环的方法体内
        let arr = [];
          for(var i = 0; i <6; i++){
              arr.push(function () {
              console.log(i);
              i++;  //注意这里
          });
        }
        arr[0](); 
        arr[0](); 
        arr[1]();
        //如果上面是var,那么打印的都是6,如果是let,那么打印结果是0 1 1
        //"证明let是为每个function声明了一个单独的相互没影响的i变量"
    
  2. 在使用let命令声明变量时,一个变量名只能声明一次,不存在命名冲突。不能再像var 一样,同一个作用域内定义两次相同的变量名
  3. 对全局对象的属性影响
  • 在ES5中,全局对象的属性和全局变量是等价的。ES6规定,使用var, function声明的全局变量依旧作为全局变量的属性存在,而使用let,const,class声明的全局变量则不属于全局变量的属性
  • nodejs中有所不同,var let定义的全局变量就是所属当前文件的,不使用let var const,直接定义的才是全局变量global的属性,详情见我 Node.js入门(二):包、模块化、Repl环境及全局对象Global
    //浏览器中
    var foo = 'foo';
    let bar = 'bar';
    console.log( foo === window.foo ); // =>true
    console.log( bar === window.bar );// => false

    //Nodejs中
    var foo = 'foo';
    let bar = 'bar';
    string = 'str';
    console.log( foo === global.foo ); // => false
    console.log( bar === global.bar );// => false
    console.log( string === global.string );// => true

const

  • 定义常量,不会发生变化
    如定义了常量,再去修改就会报错error Assignment to constant variable 不可以给常量赋值
  • const定义的常量,作用域与let相同
  • 应用场景const用来定义静态变量,加载模块的时候,定义个常量,把模块赋值给常量

注意,使用const声明对象的时候,只能保证对象的引用地址不被更改,并非此对象不被修改。

const foo = {nickname:'John Doe'}
foo.nickname = 'Jane'; //okay
foo.age = 25; // okay
foo = {nickname:'Kyle Hu'} // 报错,因为改变了引用关系    

promise

https://cnodejs.org/topic/560dbc826a1ed28204a1e7de

异步流程控制的解决方案
回调地狱
异步流程--->回调函数的嵌套
异步流程控制---->用同步的方式去写异步的代码

箭头函数

箭头函数就是一种语法糖
语法糖是一种语法,用这种语法能尝到甜头,能是编程高效
当函数体有一个参数有返回值的时候

var foo=function(v){ return v;}
var foo=v=>v;
当函数体没有参数有返回值的时候

var foo=function(){ return v;}

var foo=()=>v;
当函数体有多个参数有返回值的时候

var foo=function(v1,v2){ return v1+v2;}
var foo=(v1,v2)=>v1+v2;
当函数体有多个参数没有返回值的时候
var foo=function(v1,v2){ 
  console.log(v1); console.log(v2);
  }
var foo=(v1,v2)=>{
  console.log(v1); console.log(v2);
  };

只是简单介绍了一些比较常接触的语法,后续感觉经常遇到的,再补充说明吧

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

推荐阅读更多精彩内容