为什么JavaScript Math模块名称不遵循camelCase?

时间:2014-04-05 01:09:49

标签: javascript

我确信标识符的JavaScript“官方”案例是camelCase,setInterval().round()

那么为什么Math以资本开头呢?

2 个答案:

答案 0 :(得分:5)

嗯,Math在主机JS模块中确实有点独特 - ObjectNumberDateRegExp等等。它不是函数 - 它是一个对象,其原型链中的下一个对象是Object.prototype

typeof Object; // function
typeof Math;   // object
Math.__proto__ === Object.prototype // true

尽管如此,它还是一个非常独特的对象,它拥有相当多的通用JS辅助函数和常量。如果它在源代码中的其他对象中脱颖而出,那将非常不方便。


我说'独特',这几乎是真的。 )请参阅ECMAScript Language specification (edition 5.1)短语'的全文,单个对象'出现两次:首先在Math部分(15.8),第二个 - 在{ {1}}部分(15.12)。实际上有两个这样的“类似服务”的主机对象;两者的名字都以大写字母开头。

答案 1 :(得分:1)

一般来说,以JS中的大写字母开头的东西都是构造函数 - 可以使用new调用它们来创建它们的新实例:

var o = new Object(),
    f = new Function('alert("foo");'),
    d = new Date(),
    s = new String('foo'),
    a = new Array(),
    r = new RegExp('/0-9/')
    n = new Number('2'),
    b = new Boolean(),
    e = new Error('bar');

我一直认为Math只是一个侥幸,或者打算成为一个构造函数,后来决定反对。

但是,在我之前的答案中,由 raina77ow 链接的spec说明MathJSON,"值[[Class]]内部财产"每个分别为MathJSON。这让我进一步深入了解我发现的规范:

  

[[Class]]内部属性的值由此规范为每种内置对象定义。主机对象的[[Class]]内部属性的值可以是除#34;参数","数组","布尔"之一之外的任何字符串值, "日期","错误","功能"," JSON","数学","数& #34;," Object"," RegExp"," String"。内部使用[[Class]]内部属性的值来区分不同类型的对象。请注意,除了通过Object.prototype.toString之外,此规范不提供程序访问该值的任何方法(参见15.2.4.2)。

所以我认为只是决定在" [[Class]]内部属性"的保留名称列表中使用任何资金。任何ECMAScript主机的任何作者都可以将其他主机对象添加到他们正在创建的环境中,但不能在他们的" [[Class]]内部属性中使用这些保留名称。"

但是,我只能想到一个能够回答原意的人,而且我相信他现在并没有对公众说太多。