少しずつ違うところがあります。
説明する相手のレベルがわかりませんが、参考までに説明を載せておきますので、質問があればコメントでおお願いします。
定数xに対して、「a: 1」と「b: 2」の二つのプロパティをオブジェクトとして代入。
変数x
に、「a: 1」と「b: 2」という2つのプロパティを持つオブジェクトを代入する。
説明
まず、JavaScriptには、他のプログラミング言語でいうところの「定数」はありません。
const
は、var
やlet
と同様に変数です。波括弧(ブロック{}
)が有効範囲です。
なぜ「定数」のイメージがあるのかといえば「変数が有効なスコープ内で再代入ができない」からです。
ブラウザ(Google Chromeがおすすめ)のデベロッパーツールのコンソールで、以下のコードを実行すると理解できます。
const x = 1
x = 2 // -> Uncaught TypeError: Assignment to constant variable.
上記のコードは、「constant変数(=variable)に(再)代入がある」とうエラーです。
オブジェクトxからKeyのデータ値(a, b)を取ってくるよう設定。
オブジェクトx
について、キー
(プロパティ名)を配列として取得する。
説明
Object.keys()
は、引数に渡されたオブジェクトの、プロパティ名を配列として取得します。
fumi44さんの説明にあるのはObject.values()
というメソッドです。
ちなみに、キーと値の両方を配列で取得したい場合、Object.entries()
が使えます。
Object.keys(x)
// -> `[ 'a', 'b' ]` or `[ 'b', 'a' ]`
Object.values(x)
// -> `[ 1, 2 ]` or `[ 2, 1 ]`
Object.entries(x)
// -> `[ [ 'a', 1 ], [ 'b', 2 ] ]` or `[ [ 'b', 2 ], [ 'a', 1 ] ]`
補足(1):配列内の要素順は保証されていません(=定義した順番とは限らない)。
補足(2):3つのメソッドは、ブラウザにより対応状況が異なります。
配列(Object.keys(x))から要素を一つずつ取ってくるよう設定。
Object.keys(x)
で取得した配列について、forEach()
メソッドを実行する。
forEach()
メソッドは、第1引数に関数を受け取り、その関数の第1引数として配列の要素を渡し関数を実行する。これを配列のすべての要素に対して行う。
説明
説明のためにコードのまとまりを変えました。
以下のコードを見た方が理解できるかもしれません。
const valuesOfX = Object.values(x)
valuesOfX.forEach(function(value, index) {
console.log(index, value) // -> 1回目: 0, 'a', 2回目: 'b'
})
補足(1):元のソースコードは、アロー関数を使用しています。アロー関数は、第1引数だけだと()
を省略できます。
補足(2):forEach()
の第1引数は関数であり、その関数の引数は、「要素、要素のインデックス、元の配列」です。
console.log(`${y}: ${x[y]}`);
「(オブジェクトxのKeyのデータ値): (定数xの配列数)」をテンプレートリテラルを使って出力。
「(オブジェクトxのキー):(オブジェクトxのキー)」をテンプレートリテラルを使ってコンソールに出力する。
説明
出力される内容が異なります。また、「定数xの配列数」は前述の説明にあるように間違いです。
もとの説明にあるような文字列を出力したい場合、以下のソースコードである必要があります。
const x = {
a: 1,
b: 2
};
Object.values(x).forEach((value, index) => {
console.log(`${value}: ${index}`);
});
もし、「x
のキーと値を文字列で出力する」ことを意図しているのであれば、ソースコードは以下のようになります。
const x = {
a: 1,
b: 2
}
Object.entries(x).forEach(entry => {
const key = entry[0]
const value = entry[1]
console.log(`${key}: ${value}`);
});
補足(1):テンプレートリテラルは、ブラウザにより対応状況が異なります。
追記(2019/3/19)
think49さん
const
まわりは訳語や用途によって意味がややこしいのですが、自分の理解している限り以下の通りです。
Variable(変数) の定義(MDNより引用)
A variable is a named location for storing a value.
-> var
, let
, const
のすべてがvariable(変数)
Declarations(宣言)の定義(MDNより引用)
var
Declares a variable, ...
let
Declares a ... variable, ...
const
Declares a ... constant.
-> var
, let
はvariable(変数)、const
はconstant
(定数)
つまり、一言で言えば「変数」「定数」という用語が使用されている文脈が異なります。
定義上、3つすべてが変数であり、宣言上(宣言するものは)、2つが変数で1つが定数です。
ただ、think49さんが言う通り、const
で宣言したものの参照は変更できませんが、参照先の中身(オブジェクトのプロパティなど)は変更可能なので、使用上も一部「変数」的な振る舞いをすると言えるかもしれません。
Object.freeze()
やObject.defineProperty()
でread-onlyなプロパティは作れますが、もはや「宣言」ではないので、、、
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2019/03/18 10:44