摘要:的包管理器,是全球最大的开源库生态系统。函数级别严格模式语法允许把变量的作用域限制在块级域中。这个声明创建一个常量可以全局或局部的函数声明。方法默认返回实例对象即,完全可以指定返回另外一个对象。一个类只能拥有一个名为的方法,否则会抛出异常。
简介
Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。Node.js 使用了一个事件驱动、非阻塞式 I/O 的模型,使其轻量又高效。Node.js 的包管理器 npm,是全球最大的开源库生态系统。
Node.js 4.0.0这个版本是Node和iojs合并后发布的首个稳定版本,并且为开发者带来了大量的ES6语言扩展。了解 Node.js中包括的ES6语言扩展。本课将会为你介绍如何使用这些新特性。
Node.js 4.0.0 可以让您享受最尖端的技术,保持项目的先进性。其中对 v8 的升级几乎做到了与 Chromium / Google Chrome 同步,达到了 4.5.x,它提供了很多新的语言功能。ECMA-262 是 JavaScript 语言规范的最新版本,而且好多新特性数都是开箱即用的。
这些新特性包括:
classes - 各种 ‘类’,再也无需用 CoffeeScript 的语法糖写类了
generators - 未来的.js 代码中将有无数生成器,不学一点就看不懂 JS 代码了哦
collections - 集合、映射、弱集合、弱映射
arrow functions - 箭向函数
block scoping - 使用 let 、const 作用域,块辖域
template strings - 模板字串
promises - 用标准化了的方法进行延迟和异步计算
symbols - 唯一的、不可修改的数据
严格模式严格模式在语义上与正常的JavaScript有一些不同。
首先,严格模式会将JavaScript陷阱直接变成明显的错误。
其次,严格模式修正了一些引擎难以优化的错误:同样的代码有些时候严格模式会比非严格模式下更快。
第三,严格模式禁用了一些有可能在未来版本中定义的语法。
因为我们ECMAScript 6中的一些特性,必须在严格模式下,才可以使用,而不报错。
严格模式可以应用到整个script标签或某个别函数中。
为整个script标签开启严格模式, 需要在所有语句之前放一个特定语句 “use strict”; (或 ‘use strict’;)
// 整个语句都开启严格模式的语法 "use strict"; let v = "Hi! I"m a strict mode script!";
同样的,要给某个函数开启严格模式,得把 “use strict”; (或 ‘use strict’; )声明一字不漏地放在函数体所有语句之前。
function strict() { // 函数级别严格模式语法 "use strict"; return "Hi! I"m a strict mode function!" ; } function notStrict() { return "I"m not strict."; }let
let 允许把变量的作用域限制在块级域中。与 var 不同处是:var 申明变量要么是全局的,要么是函数级的,而无法是块级的。
let vs var
let的作用域是块,而var的作用域是函数
"use strict"; var a = 5; var b = 10; if (a === 5) { let a = 4; // The scope is inside the if-block var b = 1; // The scope is inside the function console.log(a); // 4 console.log(b); // 1 } console.log(a); // 5 console.log(b); // 1
let在循环中
可以使用let关键字绑定变量在循环的范围而不是使用一个全局变量(使用var)定义。
"use strict"; for (let i = 0; i < 10; i++) { console.log(i); // 0, 1, 2, 3, 4 ... 9 } console.log(i); // i is not defined
上面报错,因为变量i不存在于for语句外的作用域中。let创建块级作用域变量的,使用var创建一个全局变量。
constconst这个声明创建一个常量,可以全局或局部的函数声明。
一个常量可以是全局的或者是局部的,常量遵循与变量相同的作用域规则。
一个常量不可以被重新赋值,并且不能被重复声明.所以,虽然可以在声明一个常量的时候不进行初始化,但这样做是没有意义的,因为这个常量的值永远会保持undefined。
一个常量不能和它所在作用域内的其他变量或函数拥有相同的名称。
示例
下面的例子演示了常量的行为。
const num = 10; num =20; console.log(num); // 10
如果我们在上面声明常量num,在声明var num,这时会报错,num已经声明。
const num = 10; var num = 20; console.log(num); // "num" has already been declared块级作用域
很多语言中都有块级作用域,JavaScript使用var声明变量,以function来划分作用域,大括号“{}” 却限定不了var的作用域。用var声明的变量具有变量提升(declaration hoisting)的效果。
ES6里增加了一个let,可以在{}, if, for里声明。用法同var,但作用域限定在块级,let声明的变量不存在变量提升。
"use strict"; function f1() { var a = 1; let n = 2; if (true) { var a = 20; let n = 10; } console.log(n); // 2 console.log(a); // 20 } f1();类声明和类表达式
ES6 中的类实际上就是个函数,而且正如函数的定义方式有函数声明和函数表达式两种一样,类的定义方式也有两种,分别是:类声明、类表达式。
类声明类声明是定义类的一种方式,就像下面这样,使用 class 关键字后跟一个类名(这里是 Ploygon),就可以定义一个类。
"use strict"; class Polygon { constructor(height, width) { this.height = height; this.width = width; } }变量提升
类声明和函数声明不同的一点是,函数声明存在变量提升现象,而类声明不会。也就是说,你必须先声明类,然后才能使用它,否则代码会抛出 ——ReferenceError 异常,像下面这样:
var p = new Polygon(); // ReferenceError class Polygon {}类表达式
类表达式是定义类的另外一种方式,就像函数表达式一样,在类表达式中,类名是可有可无的。如果定义了类名,则该类名只有在类体内部才能访问到。
"use strict"; // 匿名类表达式 var Polygon = class { constructor(height, width) { this.height = height; this.width = width; } }; // 命名类表达式 var Polygon = class Polygon { constructor(height, width) { this.height = height; this.width = width; } };构造函数
类的成员需要定义在一对花括号 {} 里,花括号里的代码和花括号本身组成了类体。类成员包括类构造器和类方法(包括静态方法和实例方法)。
class 根据 constructor 方法来创建和初始化对象。
constructor方法是类的默认方法,通过new命令生成对象实例时,自动调用该方法。一个类只能有一个constructor方法,如果没有显式定义,一个空的constructor方法会被默认添加。
constructor() {}
constructor方法默认返回实例对象(即this),完全可以指定返回另外一个对象。
"use strict"; class Foo { constructor() { return Object.create(null); } } new Foo() instanceof Foo // false
上面代码中,constructor函数返回一个全新的对象,结果导致实例对象不是Foo类的实例。
constructor 方法是一个特殊的类方法,它既不是静态方法也不是实例方法,它仅在实例化一个类的时候被调用。一个类只能拥有一个名为 constructor 的方法,否则会抛出 SyntaxError 异常。
严格模式类和模块的内部,默认就是严格模式,所以不需要使用use strict指定运行模式。只要你的代码写在类或模块之中,就只有严格模式可用。
静态方法static关键字定义了一个类的静态方法。静态方法被称为无需实例化类也可当类被实例化。静态方法通常用于为应用程序创建实用函数。
示例
"use strict"; class Point { constructor(x, y) { this.x = x; this.y = y; } static distance(a, b) { const dx = a.x - b.x; const dy = a.y - b.y; return Math.sqrt(dx*dx + dy*dy); } } const p1 = new Point(5, 5); const p2 = new Point(10, 10); console.log(Point.distance(p1, p2));使用 extends 关键字创建子类
extends 关键字可以用来创建继承于某个类的子类。
这个例子是根据名为Animal类创建一个名为Dog的类。
"use strict"; class Animal { constructor(name) { this.name = name; } speak() { console.log(this.name + " makes a noise."); } } class Dog extends Animal { speak() { console.log(this.name + " barks."); } } var dog = new Dog("NiNi"); dog.speak();
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/78277.html
摘要:前言相信做前端的朋友没有不知道的,都知晓新增了不少新的特性,但是你知道是怎么来的吗今天就让闰土来带大家大话的前世今生。之前可能是自己娱乐为主,大家来旁观为辅。还有一个比较大的版本就是,它是年正式诞生的。大话前端系列文章较长,未完待续。 showImg(https://segmentfault.com/img/bV4pck?w=1280&h=693); 前言 相信做前端的朋友没有不知道E...
摘要:更好的安全性随着的发布,从升级到了,更安全且更易配置。通过使用,程序可以减少握手所需时间来提升请求性能。提供诊断报告有一项实验功能,根据用户需求提供诊断报告,包括崩溃性能下降内存泄露使用高等等。前端精读帮你筛选靠谱的内容。 1. 引言 Node12 发布有几个月了,让我们跟随 Nodejs 12 一起看看 Node12 带来了哪些改变。 2. 概述 Node12 与以往的版本不同,带来...
答案自己谷歌或百度找。 一、来源背景 面试题是来自微博@牛客网发布的真实大厂前端面经题目,我一直在收集题目长期一个一个的记录下来的,可能会有重复,但基本前端的面试大纲和需要掌握的知识都在其中了,面试题仅做学习参考,学习者阅后也要用心钻研其中的原理,重要知识需要系统学习、透彻学习,形成自己的知识链。 二、532道前端真实大厂面试题 express和koa的对比,两者中间件的原理,koa捕获异常多种情...
答案自己谷歌或百度找。 一、来源背景 面试题是来自微博@牛客网发布的真实大厂前端面经题目,我一直在收集题目长期一个一个的记录下来的,可能会有重复,但基本前端的面试大纲和需要掌握的知识都在其中了,面试题仅做学习参考,学习者阅后也要用心钻研其中的原理,重要知识需要系统学习、透彻学习,形成自己的知识链。 二、532道前端真实大厂面试题 express和koa的对比,两者中间件的原理,koa捕获异常多种情...
答案自己谷歌或百度找。 一、来源背景 面试题是来自微博@牛客网发布的真实大厂前端面经题目,我一直在收集题目长期一个一个的记录下来的,可能会有重复,但基本前端的面试大纲和需要掌握的知识都在其中了,面试题仅做学习参考,学习者阅后也要用心钻研其中的原理,重要知识需要系统学习、透彻学习,形成自己的知识链。 二、532道前端真实大厂面试题 express和koa的对比,两者中间件的原理,koa捕获异常多种情...
阅读 3021·2021-11-18 10:07
阅读 3764·2021-11-17 17:00
阅读 2102·2021-11-15 18:01
阅读 925·2021-10-11 10:58
阅读 3372·2021-09-10 10:50
阅读 3441·2021-08-13 15:05
阅读 1229·2019-08-30 15:53
阅读 2639·2019-08-29 13:01