文档

2009年,Node.js 项目诞生,所有模块一律为 CommonJS 格式。
https://www.w3cschool.cn/ecmascript/

et const var的区别

es5时候只有var定义变量,只有全局作用域和函数作用域
es6新增 let和const,存在块级作用域  let替换es5中的var

let:块级作用域	
var:全局作用域
const:常常定义常量 也是块级作用域
let const定义变量不存在变量提成,var存在声明提前。
let 和const定义变量必须先定义再使用,否则会报错。
const定义变量不能直接修改赋值

基础

变量是弱类型的

// 自动识别类型,而不需要什么类型
let color = "red";
let num = 5;
let visible = true;

命名变量

第一个字符必须是字母、下划线(_)或美元符号($)
余下的字符可以是下划线、美元符号或任何字母或数字字符
// 合法变量
var test;
var $test;
var $1;
var _$te$t2;

注释

// 这是一条单行注释

/*这是一个多行
注释*/

代码块

// 括号表示代码块
if (colorTest == "red") {
    colorTest= "blue";
    alert(colorTest);
}

ECMAScript 关键字

break case catch continue default delete do else finally for function if in instanceof new return switch this throw try typeof var void while with

ECMAScript 保留字

abstract boolean byte char class const debugger double enum export extends final float goto implements import int interface long native package private protected public short static super synchronized throws transient volatile

ECMAScript 原始类型

ECMAScript有5种原始类型(primitive type),即Undefined、Null、Boolean、Number和String。

typeof运算符有一个参数,即要检查的变量或值。例如:

var sTemp = "test string";
alert (typeof sTemp);    //输出 "string"
alert (typeof 86);    //输出 "number"

ECMAScript 引用类

// 引用类型通常叫做类(class),也就是说,遇到引用值,所处理的就是对象。
var o = new Object();
// 等价于(如果没有参数可以忽略括号)
var o = new Object;

注意:尽管括号不是必需的,但是为了避免混乱,最好使用括号。

// 所有对象继承Object

// Object基础属性
	constructor
	对创建对象的函数的引用(指针)。对于Object对象,该指针指向原始的Object()函数。
	Prototype
	对该对象的对象原型的引用。对于所有的对象,它默认返回Object对象的一个实例。


// Object 对象还具有几个方法:
	hasOwnProperty(property)
	判断对象是否有某个特定的属性。必须用字符串指定该属性。(例如,o.hasOwnProperty("name"))
	IsPrototypeOf(object)
	判断该对象是否为另一个对象的原型。
	PropertyIsEnumerable
	判断给定的属性是否可以用for...in语句进行枚举。
	ToString()
	返回对象的原始字符串表示。对于Object对象,ECMA-262没有定义这个值,所以不同的ECMAScript实现具有不同的值。
	ValueOf()
	返回最适合该对象的原始值。对于许多对象,该方法返回的值都与ToString()的返回值相同。


// 示例
let o = new Object();
console.log(o.hasOwnProperty('zaza'));

Boolean 对象
Number 对象 自带几个方法
String 对象

运算符

// 条件运算符
variable = boolean_expression ? true_value : false_value;
var iMax = (iNum1 > iNum2) ? iNum1 : iNum2;

// 赋值运算符
var iNum = 10;
iNum += 10;

乘法/赋值(*=)
除法/赋值(/=)
取模/赋值(%=)
加法/赋值(+=)
减法/赋值(-=)
左移/赋值(<<=)
有符号右移/赋值(>>=)
无符号右移/赋值(>>>=)

// 逗号运算符
var iNum1 = 1, iNum = 2, iNum3 = 3;

语句

# 至少执行一次
do
 {statement} 
while
 (expression);

while
 (expression) statement

for
(initialization; expression; post-loop-expression) statement

// 枚举对象
for
 (property 	in
 expression) statement

// 标签语句(goto效果)
// break 语句和 continue 语句都可以与有标签的语句联合使用,返回代码中的特定位置。
label : statement


switch (sColor) {
  case BLUE: alert("Blue");
    break;
  case RED: alert("Red");
    break;
  case GREEN: alert("Green");
    break;
  default: alert("Other");
}

函数

function functionName(arg0, arg1, ... argN) {
  statements
}

// 示例
function diff(iNum1, iNum2) {
  if (iNum1 > iNum2) {
    return iNum1 - iNum2;
  } else {
    return iNum2 - iNum1;
  }
}

arguments对象(函数参数位置处理)

function doAdd() {
  if(arguments.length == 1) {
    alert(arguments[0] + 5);
  } else if(arguments.length == 2) {
    alert(arguments[0] + arguments[1]);
  }
}

Function 对象(类)

var function_name = new function(arg1, arg2, ..., argN, function_body)
在上面的形式中,每个 arg 都是一个参数,最后一个参数是函数主体(要执行的代码)。这些参数必须是字符串。

注意:尽管可以使用 Function 构造函数创建函数,但最好不要使用它,因为用它定义函数比用传统方式要慢得多。不过,所有函数都应看作 Function 类的实例。



var doAdd = new Function("iNum", "alert(iNum + 10)");
var alsodoAdd = doAdd;
doAdd(10);	//输出 "20"
alsodoAdd(10);	//输出 "20"	
在这里,变量 doAdd 被定义为函数,然后 alsodoAdd 被声明为指向同一个函数的指针。用这两个变量都可以执行该函数的代码,并输出相同的结果 - "20"。因此,如果函数名只是指向函数的变量,那么可以把函数作为参数传递给另一个函数吗?回答是肯定的!

闭包(closure)

闭包,指的是词法表示包括不被计算的变量的函数,也就是说,函数可以使用函数之外定义的变量。

面向对象技术

ECMA-262 把对象(object)定义为“属性的无序集合,每个属性存放一个原始值、对象或函数”。严格来说,这意味着对象是无特定顺序的值的数组。
尽管 ECMAScript 如此定义对象,但它更通用的定义是基于代码的名词(人、地点或事物)的表示。

面向对象语言的要求
一种面向对象语言需要向开发者提供四种基本能力: 	
	封装 - 把相关的信息(无论数据或方法)存储在对象中的能力
	聚集 - 把一个对象存储在另一个对象内的能力
	继承 - 由另一个类(或多个类)得来类的属性和方法的能力
	多态 - 编写能以多种方法运行的函数或方法的能力


// 声明和实例化
对象的创建方式是用关键字 new 后面跟上实例化的类的名字:
var oObject = new Object(); // 等价于 var oObject = {}; 
var oStringObject = new String();

// 对象类型
Object Function Array String Boolean Number Date RegExp Error EvalError RangeError ReferenceError SyntaxError TypeError URIError

关键字 this

在 ECMAScript 中,要掌握的最重要的概念之一是关键字 this 的用法,它用在对象的方法中。关键字 this 总是指向调用该方法的对象,例如:

定义类或对象

如前所述,目前使用最广泛的是混合的构造函数/原型方式。
联合使用构造函数和原型方式,就可像用其他程序设计语言一样创建对象。这种概念非常简单,即用构造函数定义对象的所有非函数属性,
用原型方式定义对象的函数属性(方法)。结果是,所有函数都只创建一次,而每个对象都具有自己的对象属性实例。

// 混合的构造函数/原型方式
function Car(sColor,iDoors,iMpg) {
  this.color = sColor;
  this.doors = iDoors;
  this.mpg = iMpg;
  this.drivers = new Array("Mike","John");
}

Car.prototype.showColor = function() {
  alert(this.color);
};

var oCar1 = new Car("red",4,23);
var oCar2 = new Car("blue",3,25);

oCar1.drivers.push("Bill");

alert(oCar1.drivers);	//输出 "Mike,John,Bill"
alert(oCar2.drivers);	//输出 "Mike,John"

let和const命令

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

上面代码使用了一个五层的块级作用域。外层作用域无法读取内层作用域的变量。
{{{{
  {let insane = 'Hello World'}
  console.log(insane); // 报错
}}}};

// 多个块级别声明
{{{{
  let insane = 'Hello World';
  {let insane = 'Hello World'}
}}}};


const声明一个只读的常量。一旦声明,常量的值就不能改变。
const PI = 3.1415;
PI // 3.1415

PI = 3;
// TypeError: Assignment to constant variable.

模块

模块引用(require);模块定义(exports);模块标识(module)
require // python import
exports // def ?
module // as ?

module跟module.exports有什么区别
1.exports 是指向的 module.exports 的引用
2.module.exports 初始值为一个空对象 {},所以 exports 初始值也是 {}
3.require() 返回的是 module.exports 而不是 exports

常见模块

path

const path = require('path');
// 格式化路径
console.log('normalization : ' + path.normalize('/test/test1//2slashes/1slash/tab/..'));

// 连接路径
console.log('joint path : ' + path.join('/test', 'test1', '2slashes/1slash', 'tab', '..'));

// 转换为绝对路径
console.log('resolve : ' + path.resolve('main.js'));

// 路径中文件的后缀名
console.log('ext name : ' + path.extname('main.js'));

process

process.env.NODE_ENV
process对象是全局变量。它对于node应用程序是始终可用的,无需require()。

require加载顺序

Vue里require('../config') 如何加载index.js
http://www.ruanyifeng.com/blog/2015/05/require.html

require('../config') 加载顺序

将 config 当成文件,依次查找下面文件,存在立即退出
config
config.js
config.json
config.node

将 config 当成目录
config/package.json(main字段)
config/index.js
config/index.json
config/index.node

变量命名规则

Camel 标记法
首字母是小写的,接下来的字母都以大写字符开头。例如:
var myTestValue = 0, mySecondValue = "hi";

Pascal 标记法
首字母是大写的,接下来的字母都以大写字符开头。例如:

var MyTestValue = 0, MySecondValue = "hi";

匈牙利类型标记法
在以 Pascal 标记法命名的变量前附加一个小写字母(或小写字母序列),说明该变量的类型。例如,i 表示整数,s 表示字符串,如下所示:

var iMyTestValue = 0, sMySecondValue = "hi";