我知道在javascript中,Math
是一个对象,然而在这本书中它说当使用Math对象时,我们不需要使用new关键字。例如:
var pi = Math.PI;
alert(pi);
我想知道为什么它不需要,而在其他对象中,比如Date
,它需要使用new关键字。
我知道在javascript中,Math
是一个对象,然而在这本书中它说当使用Math对象时,我们不需要使用new关键字。例如:
var pi = Math.PI;
alert(pi);
我想知道为什么它不需要,而在其他对象中,比如Date
,它需要使用new关键字。
Math
是 ECMAScript 中隐式全局对象的一个属性名,它是一个普通的 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();
Math
实例的Math
构造函数是没有意义的,因为构造函数在我们希望每个实例都有自己的状态时非常有用;就像每个Person都有一个独特的姓名和地址。数学表达式有一个特定的定义(你不能改变PI的值),而且你不能改变它们的定义。这就是为什么我认为Math
对象被实现为单例的原因。基本上,Math就是_数学_,所以拥有多个Math就是同样的事情,为什么不只有一个呢? - istostypeof Math --> "object"
typeof Date --> "function"
数学是一个对象,日期是构造函数。
new
关键字用于使用构造函数初始化实例,而不是使用对象。
new Date([可选参数])
时,您创建了一个新的Date
函数实例,该实例存储特定于此实例(日期和时间)的数据。 Math
不需要存储任何实例特定数据,因为PI
不会改变,所有Math
函数(如sin
,cos
,max
等)始终执行相同的操作。这就是为什么Math
存在作为静态对象(像其他语言中的静态类)的原因。没有必要创建此对象的新实例,您可以在任何地方使用相同的实例。顺便说一句,Date
也有静态方法,例如Date.parse()
。您不需要创建新的Date
来使用此方法。您可以像调用Math.cos(x)
一样调用它,只需Date.parse('2014-11-04')
即可。