您的位置:首页 > Web前端 > Node.js

Node.js基本语法简介

2016-06-10 23:02 417 查看

首先说以下Javascript 与ECMAScript的关系:JavaScript的创造者Netscape公司将JavaScript提交给国际标准化组织ECMA。1997年,ECMA发布ECMA-262的第一版,规定了浏览器脚本语言的标准,并将这种语言称为ECMAScript。2015年6月ECMAScript 6正式通过,成为国际标准。下面简要介绍以下ES6在ES5新增的语法。

1 ES6的扩展:Class

ES6的类完全可以看作是构造函数的另一种写法。

class Point{ // … }

typeof Point // “function”

Point === Point.prototype.constructor // true

constructor方法是类的默认方法,通过new命令生成对象实例时,自动调用该方法。一个类必须有constructor方法,如果没有显式定义,一个空的constructor方法会被默认添加。constructor方法默认返回实例对象(即this)。

Class之间可以通过extends关键字实现继承。

2 ES6的扩展:let命令

let命令用来声明变量。它的用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效。

{
let a = 10;
var b = 1;
}
a // ReferenceError: a is not defined.
b // 1


let不像var那样会发生“变量提升”现象。所以,变量一定要在声明后使用,否则报错。

console.log(foo); // 输出undefined

console.log(bar); // 报错ReferenceError

var foo = 2;

let bar = 2;

let不允许在相同作用域内,重复声明同一个变量。

3 ES6的扩展:const命令

const 声明一个只读的常量。一旦声明,常量的值就不能改变。

const的作用域与let命令相同,只在声明所在的块级作用域内有效。const命令声明的常量也是不提升,同样存在暂时性死区,只能在声明的位置后面使用。const声明的常量,也与let一样不可重复声明。

对于复合类型的变量,变量名不指向数据,而是指向数据所在的地址。const命令只是保证变量名指向的地址不变,并不保证该地址的数据不变。

const a = [];
a.push("Hello"); // 可执行
a.length = 0;    // 可执行
a = ["Dave"];    // 报错


4 ES6的扩展:=>函数

var f = v => v; 等同于 var f = function(v) { return v; };
var f = ()
4000
=> 5; 等同于 var f = function () { return 5 };
var sum = (num1, num2) => num1 + num2;等同于 var sum = function(num1, num2) { return num1 + num2; };
var getTempItem = id => ({ id: id, name: "Temp" }); //如果箭头函数直接返回一个对象,必须在对象外面加上括号。


5 ES6的扩展:尾调用优化

尾调用(Tail Call)是函数式编程的一个重要概念,指某个函数的最后一步是调用另一个函数。

function f(x) { return g(x); }

函数调用会在内存形成一个“调用记录”,又称“调用帧”(call frame),保存调用位置和内部变量等信息。如果在函数A的内部调用函数B,那么在A的调用帧上方,还会形成一个B的调用帧。等到B运行结束,将结果返回到A,B的调用帧才会消失。如果函数B内部还调用函数C,那就还有一个C的调用帧,以此类推。所有的调用帧,就形成一个“调用栈”(call stack)。

尾调用由于是函数的最后一步操作,所以不需要保留外层函数的调用帧,因为调用位置、内部变量等信息都不会再用到了,只要直接用内层函数的调用帧,取代外层函数的调用帧就可以了。

ES6的尾调用优化只在严格模式下开启,在正常模式下无效。

如果尾调用自身,就称为尾递归。

function factorial(n) {
if (n === 1) return 1;
return n * factorial(n - 1);
} 对比
function factorial(n, total) {
if (n === 1) return total;
return factorial(n - 1, n * total);
}


6 ES6的扩展:Symbol

ES6引入了一种新的原始数据类型Symbol,表示独一无二的值。

JavaScript语言的其它六种数据类型是:Undefined、Null、Boolean、String、Number、Object。

Symbol值通过Symbol函数生成。

let s = Symbol(); typeof s // “symbol“

Symbol函数可以接受一个字符串作为参数,表示对Symbol实例的描述。

var s1 = Symbol(“foo”); var s2 = Symbol(“foo”); s1 === s2 // false

Symbol用于对象的属性名能保证不会出现同名的属性。

var mySymbol = Symbol();
var a = { [mySymbol]: 'Hello!‘ };
a[mySymbol] // "Hello!"


Object.getOwnPropertySymbols方法返回一个数组,成员是当前对象的所有用作属性名的Symbol值。

7 ES6的扩展:二进制数组

二进制数组就是在这种背景下诞生的。它很像C语言的数组,允许开发者以数组下标的形式,直接操作内存,大大增强了JavaScript处理二进制数据的能力,使得开发者有可能通过JavaScript与操作系统的原生接口进行二进制通信。

二进制数组由三类对象组成。

ArrayBuffer对象:代表内存之中的一段二进制数据,可以通过“视图”进行操作。“视图”部署了数组接口,这意味着,可以用数组的方法操作内存。

TypedArray视图:共包括9种类型的视图,比如Uint8Array(无符号8位整数)数组视图, Int16Array(16位整数)数组视图, Float32Array(32位浮点数)数组视图等等。

DataView视图:可以自定义复合格式的视图,比如第一个字节是Uint8(无符号8位整数)、第二、三个字节是Int16(16位整数)、第四个字节开始是Float32(32位浮点数)等等,此外还可以自定义字节序。

很多浏览器操作的API,用到了二进制数组操作二进制数据,例如File API、 XMLHttpRequest、Fetch API、Canvas、WebSockets。

8 ES6的扩展:Set数据结构+Map数据结构

这一部分与其他高级语言的数据结构比较类似,在此就不赘述了。

9 ES6的扩展:异步操作

let promise = new Promise(function(resolve, reject) {
console.log('Promise');
resolve();
});
promise.then(function() {
console.log('Resolved.');
});
console.log('Hi!');
// Promise
// Hi!
// Resolved


上面代码中,Promise新建后立即执行,所以首先输出的是“Promise”。然后,then方法指定的回调函数,将在当前脚本所有同步任务执行完才会执行,所以“Resolved”最后输出。

异步加载图片的例子

function loadImageAsync(url) {
return new Promise(function(resolve, reject) {
var image = new Image();

image.onload = function() {
resolve(image);
};

image.onerror = function() {
reject(new Error('Could not load image at ' + url));
};

image.src = url;
});
}


10 ES6的扩展:Module

模块功能主要由两个命令构成:export和import。export命令用于规定模块的对外接口,import命令用于输入其他模块提供的功能。

// profile.js

export var firstName = ‘Michael’;

export var lastName = ‘Jackson’;

也可写成

var firstName = ‘Michael’;

var lastName = ‘Jackson’;

export {firstName, lastName};

export {lastname as surname};

export命令除了输出变量,还可以输出函数或类。

11 ES6的扩展:严格模式

ES6的模块自动采用严格模式,不需要在模块头部加上”use strict”;

严格模式主要有以下限制。

变量必须声明后再使用

函数的参数不能有同名属性,否则报错

不能使用with语句

不能对只读属性赋值,否则报错

不能使用前缀0表示八进制数,否则报错

不能删除不可删除的属性,否则报错

不能删除变量delete prop,会报错,只能删除属性delete global[prop]

eval不会在它的外层作用域引入变量

eval和arguments不能被重新赋值

arguments不会自动反映函数参数的变化

不能使用arguments.callee

不能使用arguments.caller

禁止this指向全局对象

不能使用fn.caller和fn.arguments获取函数调用的堆栈

增加了保留字(比如protected、static和interface)

关于 ES6在ES5基础上增加的语法还是比较多的,在此就不一一列举了。重要的是如何使用和实践环节。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: