「JavaScript/変数」の版間の差分

削除された内容 追加された内容
Ef3 (トーク | 投稿記録)
→‎変数の宣言方法の全体像: const も要素の変更は妨げられない。複合オブジェクトの代入は別名を作り出す。
Ef3 (トーク | 投稿記録)
const に関する記述を移動。また変数がメモリ管理に関与しているやの記述を修正。
58 行
 
{{code|const}} キーワードで定数を宣言する事が出来ます。JavaScriptにおける「定数」とは、その名の通り、値の変更を許さない変数のことです。(「定数」を「変数」の特殊なものに分類するのは、数学的には違和感を感じる人もいるかもしれないが、プログラミングでは便宜上、このように分類する。プログラミングでいう「変数」とは、単に値を格納するもの、という意味である。数学でいう、値の変動する代数とは、プログラミング「変数」は意味が異なることに、読者は留意してもらいたい。)
 
<syntaxhighlight lang="javascript">
const x = 12;
const y = x * 2; // 初期化には既知の値のみで組み立てられた式が使える
x = 1; // SyntaxError: Identifier 'x' has already been declared
</syntaxhighlight>
 
const は定数を宣言しますが、Array(配列)オブジェクトや Object(連想配列)オブジェクトのように、複合的なオブジェクトの要素の変更は妨げません。
<syntaxhighlight lang="javascript" line>
const ary1 = [1,2,3];
const ary2 = ary1;
ary2[1] = "abc";
console.log(ary); // 1,abc,3
</syntaxhighlight>
* 3行目で定数な筈のaryの要素を書き換えています(ary1を書き換えるのは出来ませんが要素は可能)。
* 3行目で変更したのは ary2 の1番めの要素なのに、4行目で表示するとary1の要素が書き換わっています。
** これは、2行目でary2をary1で初期化しているためで、この時 ary2 は ary1 の別名になっています。
 
== 変数の自動判定 ==
126 ⟶ 109行目:
 
 
なお、文字列型で宣言された数字の変数を、同じ内容の数値型に置き換える命令メソッドがあります。
 
たとえば、数値計算をするには、たとえば整数どうしの計算に置き換えたいなら、下記のように <code> parseInt( )</code> を使い、
 
<syntaxhighlight lang="html5javascript">
<script>
var suuji = "2";
var kazu = 3;
 
document.write( parseInt(suuji) + kazu ); // 数値計算 2+3 の結果の「5」を表示
</script>
</syntaxhighlight>
<!--
148 ⟶ 129行目:
 
のように書きます。これなら、文字列型で宣言された「2」を数値に置き換えるので、足し算 2+3 の結果の「5」が表示されます。
 
 
 
次のように複数の変数をまとめて宣言することもできます。
208 ⟶ 187行目:
 
{{コラム|JavaScriptの数値の型|
C言語の数値変数には、整数型(int)や浮動小数型(float)などといった型があります。しかし JavaScript の数値変は倍精度の64ビットの浮動小に、しかなく整数型は浮動小数といの仮数部を使た区別て表現されます。これプリミティブく、JavaScriptの場合で、BigIntやTypedArrayすべ異なる内部構造を持っnumber型とうもので<ref> 大槻有一郎『JavaScript 入門教室』、翔泳社、2012年2月13日 初版 第1刷発行、44ページ</ref>}}
 
※ ただし、初心者レベルでは、JavaScriptの場合、型を意識する必要にせまられることは、めったに無い。
 
余談ですが、JavaScriptの派生言語のTypeScriptでも同様、もともとのJavaScriptにnumber型しか数値の型がないため、TypeScriptでも数値型はnumber型のみです。(つまりTypeScript にも int や float は無い。)}}
 
== 変数名 ==
243 ⟶ 218行目:
== 定数 ==
定数(ていすう)は<code>const</code>キーワードで宣言します。
 
 
数学において、定数(ていすう)とは、変動しないで、同じまま値のことです。
 
 
JavaScriptにおける定数は、宣言と同時に代入しなければならず、値は変更できません。
286 ⟶ 259行目:
 
定数名は全大文字で、<code>const CONSTANT_VALUES_LIKE_THIS</code>のようにスネークケースで書く慣習があります。
 
constと宣言された定数への代入は SyntaxError を throw します。
<syntaxhighlight lang="javascript">
const x = 12;
const y = x * 2; // 初期化には既知の値のみで組み立てられた式が使える
x = 1; // SyntaxError: Identifier 'x' has already been declared
</syntaxhighlight>
 
const は定数を宣言しますが、Array(配列)オブジェクトや Object(連想配列)オブジェクトのように、複合的なオブジェクトの要素の変更は妨げません。
<syntaxhighlight lang="javascript" line>
const ary1 = [1,2,3];
const ary2 = ary1;
ary2[1] = "abc";
console.log(ary); // 1,abc,3
</syntaxhighlight>
* 3行目で定数な筈のaryの要素を書き換えています(ary1を書き換えるのは出来ませんが要素は可能)。
* 3行目で変更したのは ary2 の1番めの要素なのに、4行目で表示するとary1の要素が書き換わっています。
** これは、2行目でary2をary1で初期化しているためで、この時 ary2 は ary1 の別名になっています。
 
== 変数のスコープ ==
398 ⟶ 389行目:
 
<syntaxhighlight lang="JavaScript">
<script>
// 1 秒間隔で 0, 1, 2 と出力したい
 
// for の次が var i = 0 でなく let i = 0 に変わっている
for (let i = 0; i < 3; i++) { // ECMA2015なのでアロー関数によるラムダ式を使った
setTimeout(function() {=> document.write(i), 1000);
document.write(i);
}, 1000);
}
 
// -- 実際の出力は「012」となり、成功。
</script>
</syntaxhighlight>
 
 
なお、ECMAScript 5以前はletキーワードが無かったので、上述の問題を解決するには次のように無理やり即時関数(関数を定義すると同時に実行するためのイデオム)を使って関数スコープを作るしかありませんでした。
 
<syntaxhighlight lang="JavaScript">
<script>
for (var i = 0; i < 3; i++) (function(i) {
setTimeout(function() {
422 ⟶ 408行目:
}, 1000);
})(i);
</script>
</syntaxhighlight>