数学是一个对象还是一个类?

3

我看到的所有JavaScript参考资料都将Math视为内置对象。那么为什么它不像大多数其他编程语言中一样是一个类呢?


为什么JavaScript中的Math不像大多数其他编程语言一样是一个类呢?这个问题很模糊。无论如何,我相信这是一个设计选择,据我所知,没有官方规范解释为什么它不是一个类并且没有构造函数。我个人的猜测是,由于数学运算的本质,特定情况下的构造函数是无用的。尽管如此,据我回忆,这不是Math不是类的唯一情况,或者至少,让我纠正一下,Math没有构造函数。 - briosheje
@briosheje 这是一个设计选择,没有官方规范,也许这就是重点。谢谢。 - HITMAN
我个人认为下面Quentin的回答实际上是正确的答案。上面只是我的猜测。官方MDN规范自1997年以来就存在了,没有提到为什么会这样,他们只是提到它是一个没有构造函数并且不能用.call调用的对象。再次强调,尽管如此,这是有道理的,我也会以完全相同的方式设计它。您可以在此处阅读更多信息:https://www.ecma-international.org/ecma-262/5.1/#sec-15.8 - briosheje
比较 Math.PInew Math().PI。由于 class 需要后者,我怀疑从客户端的角度来看没有任何单一的好处。对于运行时也没有任何好处。 - Wiktor Zychla
@WiktorZychla 类可以拥有静态属性和方法。如果我们说 Math 是一个类,这并不意味着我们一定需要使用 new 关键字。 - HITMAN
@HITMAN:请记住,Javascript的运行时中没有。在ES6标准化class关键字之前(技术上仍然是一个函数),对于大多数人来说,意味着使用new调用的构造函数。一旦引入静态属性,它就只是一个(对象*(尽管技术上它可以是一个函数)。 - Wiktor Zychla
2个回答

3
在大多数编程语言中,Math 不是一个类。但为了比较 JavaScript 和 Java,我们可以假设 Math 是一个类。
在 Java 中,Math 是一个静态类,不能被实例化。new Math 没有意义。
在 JavaScript 中,类只是一个用于通过 new 运算符调用的函数,而不存在静态类的概念。
既然 Math 不设计实例化且不能被当作函数调用,那么没有理由将它定义成函数(或者类)。它只是一个用于收集一堆属性的东西......这正好是 JavaScript 中对象的基本定义。

这可能是正确的答案。只有一件事,你说:“在 JavaScript 中,类只是一个设计成使用 new 操作符调用的函数,并且没有静态类这样的东西。” 但是 ES6 类允许创建普通类(像其他语言一样)具有静态属性和方法,因此可以将 Math 实现为一个类。 - HITMAN
1
@HITMAN — 不过当Math被引入时并不是这样。 - Quentin
@HITMAN 嗯,如果我们想要在技术上讲究一些,ES6类是建立在原型继承之上的语法糖,而不是真正的类。 - santanaG
当你说“不过在引入Math之前”时,是否意味着:当JavaScript中引入Math时,ES6尚未发布(这就是为什么ES6没有用于编写JavaScript中的Math代码)?@Quentin - f877576
@Quentin 你好吗? - f877576
当你说“不是在引入Math时”时,您的意思是:当JavaScript中引入Math时,ES6尚未发布(这就是为什么ES6没有用于编写JavaScript中的Math代码)吗?(因为英语不是我的母语,所以我想确保我完全正确地理解了你的意思)@Quentin - f877576

1

数学是一个对象,Math对象的所有方法和属性都是静态的,可以通过调用Math对象而不是创建它来使用。它不是一个构造函数。


在其他编程语言中,Math被认为是一个包含静态属性和方法的类。我的问题是为什么JavaScript在这里不同呢? - HITMAN
2
这并没有回答原始问题,即为什么它被设计成这样。 - briosheje
因为在Javascript中,最接近“包含静态属性的类”的东西可能就是一个普通的Javascript对象了吧? - santanaG

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接