JavaScriptの場合、
・クラスはPasalケース記法 →MySimpleApp
・変数/関数(メソッド)はキャメルケース記法 →mySimpleApp
・定数はスネークケース記法 →MY_SIMPLE_APP, my_simple_app
で表すのが通例とJavaScriptの書籍に記載されていました。
定数だと
const CHECK_ALL = document.getElementsByClassName('ip-check');
になります。
では下記のように定数の中に関数(メソッド)が入っている場合、キャメルケースとスネークケースどちらになるのでしょうか。
const cRect = () => element.getBoundingClientRect();
何卒お願い致します。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答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
を「定数」ではないと私は捉えます。
- 4.5. Interface Document - DOM Standard
- 4.2.10. Old-style collections: NodeList and HTMLCollection - DOM Standard
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総合スコア18189
0
変数や関数名クラス名の命名規則は、
他の人や将来の自分がそのコードを見たときに
読みやすくなるように規則化されています。
・クラスはPasalケース記法
・変数/関数(メソッド)はキャメルケース記法
・定数はスネークケース記法
逆に言えば
Pascalケース記法は、クラス
キャメルケース記法は、変数/関数
スネークケースは定数
という風になり、コードを見て、クラスなのか関数・変数なのか定数なのか、判断しやすくなりますよね?
つまり、定数は、値の設定方法の如何を問わず、スネークケース記法が規則になります。
投稿2021/08/12 05:51
総合スコア1124
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
定数だと
const CHECK_ALL = document.getElementsByClassName('ip-check');
になります。
ここでいう「定数」は、意味が違うと思われます。単に「const
で宣言したもの」ではなく、文字列や数値など、「実行前から特定の値に決められているもの」と解釈したほうが適当だと考えました。
投稿2021/08/12 05:36
総合スコア145934
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/02/19 11:06