“嵌套”是否有命名约定;常数;JavaScript值?

“嵌套”是否有命名约定;常数;JavaScript值?,javascript,naming-conventions,Javascript,Naming Conventions,我们应该如何将Java或其他类似C的常量大小写约定传递给JavaScript 在Java中,我们会用全大写字母命名一个“常量”(静态final)成员。如果我们有一组我们想要作为常量的值,我们可以使用一个enum成员,并且,但是单独的enum将是大写的,例如SomeClass.SomeEnum.someu值 让我们假设我有一个用于某个星际迷航游戏的JavaScript库(举一个愚蠢的例子),其中有一个根命名空间对象StarTrek。我有一些常量值(不要介意Js没有常量),我想为外星物种、行星属性构

我们应该如何将Java或其他类似C的常量大小写约定传递给JavaScript

在Java中,我们会用全大写字母命名一个“常量”(静态final)成员。如果我们有一组我们想要作为常量的值,我们可以使用一个enum成员,并且,但是单独的enum将是大写的,例如
SomeClass.SomeEnum.someu值

让我们假设我有一个用于某个星际迷航游戏的JavaScript库(举一个愚蠢的例子),其中有一个根命名空间对象
StarTrek
。我有一些常量值(不要介意Js没有常量),我想为外星物种、行星属性构建。如果不考虑Java约定,我会选择以下内容:

StarTrek.SPECIES = {
    HUMAN: "HUMAN",
    KLINGON: "KLINGON",
    VULCAN: "VULCAN"
};

StarTrek.PLANET_ATTRIBUTE = {
    CLASS: {
        M: "M",
        T: "T",
        ...
    },
    LIFE_FORMS: {
        NONE: "NONE",
        INTELLIGENT: "INTELLIGENT",
        NO_INTELLIGENT: "NO_INTELLIGENT"
    }
};
StarTrek.Species = {
    HUMAN: "HUMAN",
    KLINGON: "KLINGON",
    VULCAN: "VULCAN"
};

StarTrek.PlanetAttribute = {
    Class: {
        M: "M",
        T: "T",
        ...
    },
    LifeForms: {
        NONE: "NONE",
        INTELLIGENT: "INTELLIGENT",
        UNINTELLIGENT: "UNINTELLIGENT"
    }
};
请注意,与Java不同,我们在
PLANET\u属性中有一些类似于嵌套的“enum”。我在这里选择了大写的“enum”名称,因为它感觉像是
StarTrek下面的所有内容。
本质上应该是“常量”(而在Java中,enum实际上是一个类,因此是BumpyCase名称)。所以无论如何,我可以通过使用
StarTrek.PLANET\u ATTRIBUTE.LIFE\u FORMS.no\u intelligent
来指定没有智能生命形式的地方

现在,按照Java的约定,我会选择以下内容:

StarTrek.SPECIES = {
    HUMAN: "HUMAN",
    KLINGON: "KLINGON",
    VULCAN: "VULCAN"
};

StarTrek.PLANET_ATTRIBUTE = {
    CLASS: {
        M: "M",
        T: "T",
        ...
    },
    LIFE_FORMS: {
        NONE: "NONE",
        INTELLIGENT: "INTELLIGENT",
        NO_INTELLIGENT: "NO_INTELLIGENT"
    }
};
StarTrek.Species = {
    HUMAN: "HUMAN",
    KLINGON: "KLINGON",
    VULCAN: "VULCAN"
};

StarTrek.PlanetAttribute = {
    Class: {
        M: "M",
        T: "T",
        ...
    },
    LifeForms: {
        NONE: "NONE",
        INTELLIGENT: "INTELLIGENT",
        UNINTELLIGENT: "UNINTELLIGENT"
    }
};
在这种情况下,我将通过使用
StarTrek.PlanetAttribute.lifeforms.no_intelligent
指定没有智能生命形式的地方

哪个更适合JavaScript?为什么?对此有什么约定吗?

答案是:这真的不重要! 第二个约定看起来更好(第一个对你大喊大叫),也在C#中使用,但这取决于你!我认为这方面没有限制

但是关于javascript中的枚举值:也许这样更好?您可以将枚举用作标志

StarTrek.Species = {
    HUMAN: 1,
    KLINGON: 2,
    VULCAN: 4
}
编辑:


如前所述,javascript中没有常量的概念,因此这取决于您的选择。

第二个看起来不那么烦人。除此之外。请记住,在JavaScript中确实没有常量的概念。在这个场景中,物种只是一个对象,它的值可以更改。我发现key=value模式有时在这里工作得更好,使验证更容易。例如,用户将StarTrek.Species.HUMAN传递给我的函数,但我只得到一个字符串;我可以通过看星际旅行中是否存在来检查
function setSpecies(species){if(!StarTrek.species[species]){throw new Error('Unknown species');};this.species=species;}
我承认在我的问题“别介意Js没有常量”中缺少Js实际常量。然而,虽然不能强制执行,但它仍然是一个好的概念和命名约定。@jlarson是的。我刚才提到了c-sharpy枚举。