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基础上增加的语法还是比较多的,在此就不一一列举了。重要的是如何使用和实践环节。
相关文章推荐
- leetcode 19. Remove Nth Node From End of List
- 117. Populating Next Right Pointers in Each Node II
- 116. Populating Next Right Pointers in Each Node
- Node.js: exports与module.exports的区别
- nodejs模块加载的猜想
- nodejs的模块引用
- Node.js 实用工具
- nodejs特性
- openwrt 编译node.js功能(解决Illegal instruction错误)
- Node.js CSV导入功能,上传并读取
- hadoop集群中datanode启动几秒钟自动关闭
- Delete Node in a Linked List
- [TypeScript] Using Typings and Loading From node_modules
- [LeetCode]problem 117. Populating Next Right Pointers in Each Node II
- nodejs Controller层 封装
- [Nutch]Hadoop动态删除DataNode节点和TaskTracker节点
- [Nutch]Hadoop动态增加DataNode节点和TaskTracker节点
- leetcode 19. Remove Nth Node From End of List
- Node.js、Sublime text3便携设置/自定义npm、packages文件夹位置
- 19. Remove Nth Node From End of List