\r\n```\r\n\r\nNumber型のプロパティが「定数」と思われる不変性を有している事がわかります。\r\n\r\n### Google JavaScript Style Guide(原文)\r\n\r\nES仕様にない以上、採用するコーディング規約で「定数」の概念および命名規則が決定されます。\r\n\r\n---\r\n\r\n- [6.2.5 Constant names - Google JavaScript Style Guide](https://google.github.io/styleguide/jsguide.html#naming-constant-names)\r\n\r\n> ##### 6.2.5 Constant names\r\n> Constant names use CONSTANT_CASE: all uppercase letters, with words separated by underscores. There is no reason for a constant to be named with a trailing underscore, since private static properties can be replaced by (implicitly private) module locals.\r\n> \r\n> ##### 6.2.5.1 Definition of “constant”\r\n> Every constant is a @const static property or a module-local const declaration, but not all @const static properties and module-local consts are constants. Before choosing constant case, consider whether the field really feels like a deeply immutable constant. For example, if any of that instance's observable state can change, it is almost certainly not a constant. Merely intending to never mutate the object is generally not enough.\r\n> Examples:\r\n> \r\n> ```JavaScript\r\n> // Constants\r\n> const NUMBER = 5;\r\n> /** @const */ exports.NAMES = ImmutableList.of('Ed', 'Ann');\r\n> /** @enum */ exports.SomeEnum = { ENUM_CONSTANT: 'value' };\r\n> \r\n> // Not constants\r\n> let letVariable = 'non-const';\r\n> class MyClass { constructor() { /** @const {string} */ this.nonStatic = 'non-static'; } };\r\n> /** @type {string} */ MyClass.staticButMutable = 'not @const, can be reassigned';\r\n> const /** Set */ mutableCollection = new Set();\r\n> const /** ImmutableSet */ mutableElements = ImmutableSet.of(mutable);\r\n> const Foo = goog.require('my.Foo'); // mirrors imported name\r\n> const logger = log.getLogger('loggers.are.not.immutable');\r\n> Constants’ names are typically nouns or noun phrases.\r\n> ```\r\n> \r\n> Constants’ names are typically nouns or noun phrases.\r\n\r\n以下、機械翻訳結果。\r\n\r\n##### 6.2.5 定数名\r\n定数名はCONSTANT_CASEを使用します。すべて大文字で、単語はアンダースコアで区切られます。プライベート静的プロパティは(暗黙的にプライベート)モジュールローカルに置き換えることができるため、定数に末尾にアンダースコアを付ける理由はありません。」\r\n\r\n##### 6.2.5.1 「定数」の定義\r\nすべての定数は@const静的プロパティまたはモジュールローカルconst宣言ですが、すべての@const静的プロパティおよびモジュールローカル定数が定数であるとは限りません。定数の場合を選択する前に、フィールドが本当に不変の定数のように感じられるかどうかを検討してください。たとえば、そのインスタンスの監視可能な状態のいずれかが変化する可能性がある場合、それはほぼ確実に一定ではありません。通常、オブジェクトを決して変更しないことを意図するだけでは十分ではありません。\r\n...(中略)...\r\n定数の名前は通常、名詞または名詞句です。\r\n\r\n---\r\n\r\nコード例を見ればわかるように、`const` 宣言された変数のすべてを「定数」として扱っているわけではありません。\r\n\r\n### 関数の返り値\r\n\r\n関数の返り値を「定数」とみなすのは非常に困難です。\r\n\r\n> 定数だと\r\n> \r\n> ```JavaScript\r\n> const CHECK_ALL = document.getElementsByClassName('ip-check');\r\n> ```\r\n> \r\n> になります。\r\n\r\n`getElementsByClassName()` の返り値は `HTMLCollection` オブジェクトですが、これは**live**であり、後から書き換わる可能性があります。\r\nその性質から、変数 `CHECK_ALL` を「定数」ではないと私は捉えます。\r\n\r\n- [4.5. Interface Document - DOM Standard](https://dom.spec.whatwg.org/#interface-document)\r\n- [4.2.10. Old-style collections: NodeList and HTMLCollection - DOM Standard](https://dom.spec.whatwg.org/#old-style-collections)\r\n\r\n---\r\n\r\n`querySelctorAll()` の返り値は **live** ではありませんが、`querySelctorAll()` 実行前にDOMを書き換える事で返り値が変化する可能性がある為、私なら「定数」と扱いません。\r\n\r\n---\r\n\r\n`getElementById()` の返り値は、IDに一意性があることから定数とみなしやすいですが、一定の条件は必要です。\r\n\r\n- `getElementById()` 実行前後にid属性値が重複していない\r\n- `getElementById()` 実行前後にid属性値を書き換えない\r\n- `getElementById()` 実行前後に対象idを持つ要素の存在性を変更しない(存在しなかった要素を追加or存在していた要素を削除)\r\n\r\n---\r\n\r\n> では下記のように定数の中に関数(メソッド)が入っている場合、キャメルケースとスネークケースどちらになるのでしょうか。\r\n> \r\n> ```JavaScript\r\n> const cRect = () => element.getBoundingClientRect();\r\n> ```\r\n\r\n`element` 値の状態に応じて返り値が変化する為、「定数」ではないと私は考えます。\r\n\r\n---\r\n\r\n**参照透過性**がない関数は、返り値が変動する可能性がある為、返り値を「定数」とみなしにくい、といえます。\r\n参照透過性があり、引数やthis値を固定できるのなら「返り値」は不変ですが、それならば約束された「関数の返り値」を初めから変数に代入すれば良いことになります。\r\n「関数の返り値」を「定数」とみなすのは非常に困難だと思います。\r\n\r\nRe: rei78087487 さん","dateModified":"2021-08-15T14:01:29.408Z","datePublished":"2021-08-15T13:54:49.455Z","upvoteCount":0,"url":"https://teratail.com/questions/353936#reply-484676","comment":[{"@type":"Comment","text":"> element 値の状態に応じて返り値が変化する為、「定数」ではないと私は考えます。\n\n> 「関数の返り値」を「定数」とみなすのは非常に困難だと思います。\n\nこの場合、返り値は無関係だと思います。\n\n> const cRect = () => element.getBoundingClientRect();\n\ncRect に入るのは getBoundingClientRect の返り値ではありません。\n ","datePublished":"2022-02-19T11:06:17.626Z","dateModified":"2022-02-19T11:06:17.626Z"}]},{"@type":"Answer","text":"変数や関数名クラス名の命名規則は、\r\n他の人や将来の自分がそのコードを見たときに\r\n読みやすくなるように規則化されています。\r\n\r\n> ・クラスはPasalケース記法\r\n> ・変数/関数(メソッド)はキャメルケース記法\r\n> ・定数はスネークケース記法\r\n\r\n逆に言えば\r\n\r\nPascalケース記法は、クラス\r\nキャメルケース記法は、変数/関数\r\nスネークケースは定数\r\n\r\nという風になり、コードを見て、クラスなのか関数・変数なのか定数なのか、判断しやすくなりますよね?\r\n\r\nつまり、定数は、値の設定方法の如何を問わず、スネークケース記法が規則になります。","dateModified":"2021-08-12T05:51:29.546Z","datePublished":"2021-08-12T05:51:29.546Z","upvoteCount":0,"url":"https://teratail.com/questions/353936#reply-484099","comment":[]},{"@type":"Answer","text":"> 定数だと\r\nconst CHECK_ALL = document.getElementsByClassName('ip-check');\r\nになります。\r\n\r\nここでいう「定数」は、**意味が違う**と思われます。単に「`const`で宣言したもの」ではなく、文字列や数値など、「**実行前から**特定の値に決められているもの」と解釈したほうが適当だと考えました。","dateModified":"2021-08-12T05:36:25.633Z","datePublished":"2021-08-12T05:36:25.633Z","upvoteCount":0,"url":"https://teratail.com/questions/353936#reply-484097","comment":[]}],"breadcrumb":{"@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"item":{"@id":"https://teratail.com","name":"トップ"}},{"@type":"ListItem","position":2,"item":{"@id":"https://teratail.com/tags/%E5%A4%89%E6%95%B0","name":"変数に関する質問"}},{"@type":"ListItem","position":3,"item":{"@id":"https://teratail.com/questions/353936","name":"JavaScript 定数の命名規則について"}}]}}}
質問するログイン新規登録

Q&A

3回答

10673閲覧

JavaScript 定数の命名規則について

rei78087487

総合スコア12

変数

変数は、プログラミングにおいて値や文字列などのデータを保持できる仕組みを指します。自由に名前を付けることができるため、管理しやすくなるのが特徴です。プログラムで変数の宣言を行い、値を代入して利用。保持したデータが通用する範囲でローカル変数とグローバル変数に分けられます。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2021/08/12 05:31

編集2021/08/12 05:51

0

0

JavaScriptの場合、
・クラスはPasalケース記法 →MySimpleApp
・変数/関数(メソッド)はキャメルケース記法 →mySimpleApp
・定数はスネークケース記法 →MY_SIMPLE_APP, my_simple_app
で表すのが通例とJavaScriptの書籍に記載されていました。

定数だと
const CHECK_ALL = document.getElementsByClassName('ip-check');
になります。

では下記のように定数の中に関数(メソッド)が入っている場合、キャメルケースとスネークケースどちらになるのでしょうか。
const cRect = () => element.getBoundingClientRect();

何卒お願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

const (ES2021)

ES2021仕様上、const キーワードで宣言される変数名に縛りはありません。
他言語にあるような「変数」と「定数」を区別する概念もありません。
const キーワードで宣言される変数は「再代入不可能な変数」の意味しか持ちません。

ビルトインオブジェクトのプロパティ

ES仕様上の概念ではありませんが、[\dA-Z_]+ の命名規則を持つプロパティを抽出してみました。

HTML

1<script> 2'use strict'; 3const getType = value => { 4 if (value === null) return 'Null'; 5 6 const typeofValue = typeof value; 7 8 if (Object(value) === value) { 9 return typeofValue === 'function' ? 'Object(function)' : 'Object'; 10 } 11 12 return typeofValue[0].toLocaleUpperCase() + typeofValue.slice(1); 13}; 14 15const setConstProp = (map, object, prefix) => { 16 const propList = Object.getOwnPropertyNames(object); 17 const entries = propList.filter(name => /^[\dA-Z_]+$/.test(name)).map(function (name) { 18 const value = this[name]; 19 20 return [ 21 getType(value), 22 { 23 propertyName: prefix ? prefix + name : name, 24 value: value 25 }]; 26 }, object); 27 28 for (let [key, value] of entries) { 29 if (map.has(key)) { 30 map.get(key).push(value); 31 } else { 32 map.set(key, [value]); 33 } 34 } 35 36 return map; 37} 38 39const constMap = new Map; 40setConstProp(constMap, this, ''); 41 42for (let name of Object.getOwnPropertyNames(this)) { 43 const value = this[name]; 44 45 if (Object(value) === value) { 46 setConstProp(constMap, value, name + '.') 47 } 48} 49 50console.log(constMap); 51</script>

Number型のプロパティが「定数」と思われる不変性を有している事がわかります。

Google JavaScript Style Guide(原文)

ES仕様にない以上、採用するコーディング規約で「定数」の概念および命名規則が決定されます。


6.2.5 Constant names

Constant names use CONSTANT_CASE: all uppercase letters, with words separated by underscores. There is no reason for a constant to be named with a trailing underscore, since private static properties can be replaced by (implicitly private) module locals.

6.2.5.1 Definition of “constant”

Every constant is a @const static property or a module-local const declaration, but not all @const static properties and module-local consts are constants. Before choosing constant case, consider whether the field really feels like a deeply immutable constant. For example, if any of that instance's observable state can change, it is almost certainly not a constant. Merely intending to never mutate the object is generally not enough.
Examples:

JavaScript

1// Constants 2const NUMBER = 5; 3/** @const */ exports.NAMES = ImmutableList.of('Ed', 'Ann'); 4/** @enum */ exports.SomeEnum = { ENUM_CONSTANT: 'value' }; 5 6// Not constants 7let letVariable = 'non-const'; 8class MyClass { constructor() { /** @const {string} */ this.nonStatic = 'non-static'; } }; 9/** @type {string} */ MyClass.staticButMutable = 'not @const, can be reassigned'; 10const /** Set<string> */ mutableCollection = new Set(); 11const /** ImmutableSet<SomeMutableType> */ mutableElements = ImmutableSet.of(mutable); 12const Foo = goog.require('my.Foo'); // mirrors imported name 13const logger = log.getLogger('loggers.are.not.immutable'); 14Constants’ names are typically nouns or noun phrases.

Constants’ names are typically nouns or noun phrases.

以下、機械翻訳結果。

6.2.5 定数名

定数名はCONSTANT_CASEを使用します。すべて大文字で、単語はアンダースコアで区切られます。プライベート静的プロパティは(暗黙的にプライベート)モジュールローカルに置き換えることができるため、定数に末尾にアンダースコアを付ける理由はありません。」

6.2.5.1 「定数」の定義

すべての定数は@const静的プロパティまたはモジュールローカルconst宣言ですが、すべての@const静的プロパティおよびモジュールローカル定数が定数であるとは限りません。定数の場合を選択する前に、フィールドが本当に不変の定数のように感じられるかどうかを検討してください。たとえば、そのインスタンスの監視可能な状態のいずれかが変化する可能性がある場合、それはほぼ確実に一定ではありません。通常、オブジェクトを決して変更しないことを意図するだけでは十分ではありません。
...(中略)...
定数の名前は通常、名詞または名詞句です。


コード例を見ればわかるように、const 宣言された変数のすべてを「定数」として扱っているわけではありません。

関数の返り値

関数の返り値を「定数」とみなすのは非常に困難です。

定数だと

JavaScript

1const CHECK_ALL = document.getElementsByClassName('ip-check');

になります。

getElementsByClassName() の返り値は HTMLCollection オブジェクトですが、これはliveであり、後から書き換わる可能性があります。
その性質から、変数 CHECK_ALL を「定数」ではないと私は捉えます。


querySelctorAll() の返り値は live ではありませんが、querySelctorAll() 実行前にDOMを書き換える事で返り値が変化する可能性がある為、私なら「定数」と扱いません。


getElementById() の返り値は、IDに一意性があることから定数とみなしやすいですが、一定の条件は必要です。

  • getElementById() 実行前後にid属性値が重複していない
  • getElementById() 実行前後にid属性値を書き換えない
  • getElementById() 実行前後に対象idを持つ要素の存在性を変更しない(存在しなかった要素を追加or存在していた要素を削除)

では下記のように定数の中に関数(メソッド)が入っている場合、キャメルケースとスネークケースどちらになるのでしょうか。

JavaScript

1const cRect = () => element.getBoundingClientRect();

element 値の状態に応じて返り値が変化する為、「定数」ではないと私は考えます。


参照透過性がない関数は、返り値が変動する可能性がある為、返り値を「定数」とみなしにくい、といえます。
参照透過性があり、引数やthis値を固定できるのなら「返り値」は不変ですが、それならば約束された「関数の返り値」を初めから変数に代入すれば良いことになります。
「関数の返り値」を「定数」とみなすのは非常に困難だと思います。

Re: rei78087487 さん

投稿2021/08/15 13:54

編集2021/08/15 14:01
think49

総合スコア18196

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2022/02/19 11:06

> element 値の状態に応じて返り値が変化する為、「定数」ではないと私は考えます。 > 「関数の返り値」を「定数」とみなすのは非常に困難だと思います。 この場合、返り値は無関係だと思います。 > const cRect = () => element.getBoundingClientRect(); cRect に入るのは getBoundingClientRect の返り値ではありません。
guest

0

変数や関数名クラス名の命名規則は、
他の人や将来の自分がそのコードを見たときに
読みやすくなるように規則化されています。

・クラスはPasalケース記法
・変数/関数(メソッド)はキャメルケース記法
・定数はスネークケース記法

逆に言えば

Pascalケース記法は、クラス
キャメルケース記法は、変数/関数
スネークケースは定数

という風になり、コードを見て、クラスなのか関数・変数なのか定数なのか、判断しやすくなりますよね?

つまり、定数は、値の設定方法の如何を問わず、スネークケース記法が規則になります。

投稿2021/08/12 05:51

TetsujiMiwa

総合スコア1124

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

定数だと
const CHECK_ALL = document.getElementsByClassName('ip-check');
になります。

ここでいう「定数」は、意味が違うと思われます。単に「constで宣言したもの」ではなく、文字列や数値など、「実行前から特定の値に決められているもの」と解釈したほうが適当だと考えました。

投稿2021/08/12 05:36

maisumakun

総合スコア146851

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.29%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問