JS筆記一:nullとundefined、NaN、選択構造
7923 ワード
1変数の宣言と割当は、2つのステップに分かれています.上のコードはそれらを合わせています.実際の手順は以下の通りです.
var a;
a = 1;
変数を宣言するだけで値が与えられない場合、その変数の値はundefined
です.undefined
はJavaScriptのキーワードで、「無定義」を表しています.2変数の割り当て時に、varコマンドを書くのを忘れたら、この文も有効です.var a = 1;
//
a = 1;
しかし、varを書かないというやり方は、意図を表現するのに役立ちませんし、知らず知らずのうちにグローバル変数を作成しやすくなりますので、varコマンドを使って変数を宣言することをおすすめします.JavaScriptはダイナミックタイプの言語です.つまり変数の種類には制限がなく、変数はいつでもタイプを変更できます.
var a = 1;
a = 'hello';
変数の昇格JavaScriptエンジンの動作方法は、先にコードを解析し、宣言されたすべての変数を取得して、もう1行ずつ実行します.この結果、すべての変数のステートメント文が、コードの先頭に引き上げられます.これを変数アップといいます.
console.log(a);
var a = 1;
上記のコードはまずconsolie.log方法を使用して、コンソールに変数aの値を表示します.この時変数aはまだ声明と割当値を持っていませんので、これは間違ったやり方ですが、実際にはエラーを報告しません.変数アップグレードがあるので、本当に実行するのは以下のコードです.
var a;
console.log(a);
a = 1;
最後の結果は、変数aが宣言されていることを示すundefined
を示すが、まだ値が与えられていない.識別子
最初の文字は、任意のUnicode文字(英字と他の言語のアルファベットを含む)とドル記号(
$
)と下線(_
)二番目の文字と後ろの文字はUnicode文字とドル記号と下線のほかに数字も使えます.
0-9
arg0
_tmp
$elem
π
上はすべて合法ですif…else構造
else
コードブロックは、常に自分に一番近いif
文とペアを組む.var m = 1;
var n = 2;
if (m !== 1)
if (n === 2) console.log('hello');
else console.log('world');
上記のコードは出力されません.else
コードブロックは実行されません.一番近いif
文に続くので、以下のようになります.if (m !== 1) {
if (n === 2) {
console.log('hello');
} else {
console.log('world');
}
}
else
コードブロックを一番上のif
文に従いたいなら、大かっこの位置を変更します.if (m !== 1) {
if (n === 2) {
console.log('hello');
}
} else {
console.log('world');
}
// world
switch
構造複数の
if...else
を接続して使用する場合、より便利なswitch
構造に変換することができる.switch (fruit) {
case "banana":
// ...
break;
case "apple":
// ...
break;
default:
// ...
}
上記のコードは、変数fruit
の値に基づいて、対応するcase
を実行するように選択される.すべてのcase
が一致しない場合、最後のdefault
部分が実行される.各case
コードブロック内部のbreak
ステートメントは少なくないが、そうでなければ次のcase
コードブロックを実行し続け、switch
構造から逸脱するのではない.注意
なお、
switch
文の後の表現は、case
文の後の表現と比較して実行結果を示す場合、厳密に等しい演算子(===
)を採用し、等しい演算子(==
)ではなく、比較時にタイプ変換が発生しないことを意味する.var x = 1;
switch (x) {
case true:
console.log('x ');
default:
console.log('x ');
}
// x
上記のコードでは、変数x
にタイプ変換が発生していないため、case true
を実行しない場合があります.これは、switch文の内部に「厳密に等しい演算子」が採用されていることを示しています.詳しくは「演算子」の項を参照してください.三項演算子
?:
JavaScriptにはもう一つの3つの演算子(すなわち、演算子は3つの演算子を必要とする)?:
があり、論理判断にも用いることができる.( ) ? 1 : 2
上記のコードでは、条件がtrue
であれば、「表式1」の値を返します.そうでなければ、「表式2」の値を返します.var even = (n % 2 === 0) ? true : false;
上のコードの中で、nが2で割り切れるなら、evenはtrueに等しい.そうでなければfalseに等しい.これは下の形式と同じです.var even;
if (n % 2 === 0) {
even = true;
} else {
even = false;
}
この3つの要素演算子は、if...else...
の簡略化された形式と見なすことができるので、複数の場合に使用することができる.var myVar;
console.log(
myVar ?
'myVar has a value' :
'myVar do not has a value'
)
// myVar do not has a value
上のコードは三元演算子を利用して、対応するヒントを出力します.var msg = ' ' + n + ' ' + (n % 2 === 0 ? ' ' : ' ');
上のコードは3つの要素演算子を使用して、文字列に異なる値を挿入します.break文とcontine文
break
文とcontinue
文はジャンプ作用があり、コードが既存の順序に従わないようにすることができます.break
文は、コードブロックまたはループを飛び出すために使用されます.var i = 0;
while(i < 100) {
console.log('i :' + i);
i++;
if (i === 10) break;
}
上のコードは10回のループしか実行できません.iが10に等しいと、ループが飛び出します.forサイクルはbreak文を使ってサイクルを飛び出すこともできます.
for (var i = 0; i < 5; i++) {
console.log(i);
if (i === 3)
break;
}
// 0
// 1
// 2
// 3
上のコードはiが3に等しいまで実行すると、ループが飛び出します.continue文は、このサイクルを直ちに終了し、循環構造の頭に戻り、次のサイクルを開始します.
var i = 0;
while (i < 100){
i++;
if (i % 2 === 0) continue;
console.log('i :' + i);
}
上のコードはiが奇数の場合のみ、iの値を出力します.iが偶数であれば、直接に次のサイクルに進む.多重ループがある場合は、パラメータなしのbreak文とcontinue文は、一番内側のループに対してのみ使用されます.
データの種類
データタイプの詳細
typeof演算子
typeof演算子詳細
nullとundefined
同じ点
null
は、undefined
とともに、「ない」という意味であり、非常に似ています.一つの変数をundefined
またはnull
として与えます.正直に言って、文法効果はほとんど違いません.if
文では、いずれもfalse
に自動的に変換され、等しい演算子(==
)は、直接的に2つが等しいと報告される.if (!undefined) {
console.log('undefined is false');
}
// undefined is false
if (!null) {
console.log('null is false');
}
// null is false
undefined == null
// true
違いますnull
が数字に変換されると、自動的に0
Number(null) // 0
5 + null // 5
上記のコードのうち、null
が数字に変換されると、自動的に0
になります.undefined
は、「ここには定義がない」という元の値であり、数値に変換した場合はNaN
である.Number(undefined) // NaN
5 + undefined // NaN
null
関数を呼び出したときの用法null
は空の値を表しています.ここの値は空です.関数を呼び出したとき、あるパラメータには値が設定されていません.このとき、null
に入力して、このパラメータが空であることを表します.例えば、ある関数がエンジンから投げられたエラーをパラメータとして受け入れ、実行中にエラーがなければ、このパラメータはnull
に伝えられ、エラーが発生していないことを示します.undefined
は「未定義」を表し、次にundefinedに戻る典型的なシーン// ,
var i;
i // undefined
// , , undefined
function f(x) {
return x;
}
f() // undefined
//
var o = new Object();
o.p // undefined
// , undefined
function f() {}
f() // undefined
NaNNaN-MDN詳細
NaN
の値は、1つの数字(Not-A-Number)ではないことを示し、NaN
は、1つのグローバルオブジェクトの属性である.NaN
属性の初期値はNaN
であり、Number.NaN
の値と同じである.現代ブラウザ(ES 5)において、NaN
属性は不構成であり、書き込み不可の属性である.NaN
に直接的に使用されることは少ない.Math
のある方法の戻り値として出現する(例えば:Math.sqrt(-1)
)parseInt("blabla")
).NaN === NaN; // false
Number.NaN === NaN; // false
isNaN(NaN); // true
isNaN(Number.NaN); // true
function valueIsNaN(v) { return v !== v; }
valueIsNaN(1); // false
valueIsNaN(NaN); // true
valueIsNaN(Number.NaN); // true
自分のテスト:ブール値
前の論理演算子:(Not)
等しい演算子=============!
比較演算子:>,>=,
false
に変換する以外、他の値はtrue
と見なされる.undefined
null
false
0
NaN
"" ''( )
なお、空配列([]
)および空オブジェクト({}
)に対応するブール値は、いずれもtrue
である.if ([]) {
console.log('true');
}
// true
if ({}) {
console.log('true');
}
// true