我知道Math
是javascript中的一个Object,但在书中它说,当使用数学对象时,我们不需要使用新的关键字。例如,
var pi = Math.PI;
alert(pi);
我想知道为什么它不需要,而在其他Object中,比如Date
,它需要新的关键字。
typeof Math --> "object"
typeof Date --> "function"
Math是一个Object,Date是构造函数。
new
关键字用于使用构造函数而不是对象初始化实例。
Math
实际上是ECMAScript中隐式global
对象的一个属性的名称,它是一个普通的旧Javascript对象,类型为Math
(通过将属性赋予此单个实例来定义,类似于JSON的工作方式)。规范中对此进行了说明:http://www.ecma-international.org/ecma-262/5.1/#sec-15.8
Math
对象可以这样想:
// within the "global" context:
var Math = {
PI: 3.14,
sin: function(x) { ... },
cos: function(x) { ... }
};
请注意,没有定义构造函数(也没有定义Call
),因此表达式new Math()
是无意义和未定义的。如果是的话,那么它会是这样的:
function Math() {
this.PI = 3.14;
this.sin = function(x) { ... };
this.cos = function(x) { ... };
};
var Math = new Math();
new关键字用于处理构造函数。Math是一个已经实例化的全局对象。
当您调用new Date([optional parameter])
时,您将创建Date
函数的一个新实例,该实例存储特定于该实例的数据(日期和时间)。Math
不需要存储任何特定于实例的数据,因为PI
不会更改,并且所有Math
函数,如sin
、cos
、max
等,它们总是做相同的事情。这就是Math
作为静态对象存在的原因(就像其他语言中的静态类一样)。不需要创建此对象的新实例,您可以在任何地方使用相同的实例。BTW Date
也有静态方法,比如Date.parse()
。使用此方法不需要创建新的Date
。你叫它就像你叫Math.cos(x)
一样,只是Date.parse('2014-11-04')
。