2.1 数据类型
类型基础:
2.2 类型比较和转换
相等运算符==(判断两个操作数没有相同的值)和严格相等===(判断两个操作数有没有相同的值以及是否为相同的数据类型)
2.3 函数
基本概念:
函数作用域:
2.4 语言结构
JavaScript包含了几乎所有的语言操作符和语句结构,其中包括绝大部分逻辑操作符和算术操作符。
2.5 类、原型和继承
JavaScript的面向对象编程与其他语言有很大不同,因为JavaScript没有明确的类(class)关键字或类型。事实上,JavaScript中所有的类都是以函数的形式定义的:
function Shape () {
this.X = 0;
this.Y = 0;
this.move = function (x, y) {
this.X = X;
this.Y = y;
}
this.distance_from_origin = function () {
return Math.sqrt( this.X * this.X + this.Y * this.Y );
}
}
var s = new Shape();
s.move(10, 10);
console.log( s.distance_from_origin() );
这种创建类的方式存在两个问题:
首先,效率似乎有点低下,每个对象都必须自己实现类方法。
其次,我们可能需要继承这个类来创建圆形和方形,并让新的类继承基类(base class)的方法和属性而不必做任何额外的工作。
原型和继承
默认情况下,所有的JavaScript对象都有一个原型对象,它是一种继承属性和方法的机制。原型是多年来JavaScript中很多混乱的源头,往往是因为不同的浏览器使用不同的命名和略微不同的实现。
function Shape () {
}
Shape.prototype.X = 0;
Shape.prototype.Y = 0;
Shape.prototype.move = function (x, y) {
this.X = x;
this.Y = y;
}
Shape.prototype.distance_from_origin = function () {
return Math.sqrt(this.X * this.X + this.Y * this.Y );
}
Shape.prototype.area = function () {
throw new Error("I don't have a form yet");
}
var s = new Shape();
s.move(10, 10);
console.log(s.distance_from_origin());
除了可能稍微提升内存的效率之外(如果创建了大量的实例,它们都将共享而不是自己创建move和distance_from_origin方法),如果添加一个area方法,则所有的shape实例都会拥有这个方法。而在基类中,这种方式却行不通,它会抛出错误。
更为重要的是,我们可以很容易地对类进行扩展:
function Square() {
}
Square.prototype = new Shape();
Square.prototype.__proto__ = Shape.prototype;
Square.prototype.Width = 0;
Square.prototype.area = function () {
return this.Width * this.Width;
}
var sq = new Square();
sq.move(-5, -5);
sq.Width = 5;
__proto__属性,它能够告诉JavaScript声明的新类的基本原型应该是指定的类型,因此也就可以从指定的类进行扩展。
2.6 错误和异常
JavaScript中,通常使用Error对象和一条信息来表示一个错误。
2.7 几个重要的Node.js全局对象
global变量:任何附加到该对象上的东西在node应用中的任何地方都是可见的:
function printit(var_name) {
console.log(global[var_name]);
}
global.fish = "swordfish";
global.pet = "cat";
printit("fish");
console对象:有一个全局变量console。它有些有趣的函数:
- warn(msg) --- 与log类似的函数,但打印的是标准错误(stderr)。
- time(label)和timeEnd(label) --- 第一个函数被调用时会标识一个时间戳,而当第二个函数被调用时,会打印出从time函数被调用后中间经过的时间。
- assert(cond, message) --- 如果cond等价于false,则抛出一个AssertionFailure异常。
process对象:它包含许多信息和方法。exit方法是中止Node.js程序的方式之一,而env函数会返回一个对象,它包含了当前用户的环境变量,而cwd则返回应用程序当前的工作目录。