TypeScriptに入門したいのでJavaScriptに入門してみる(文と式)
続: JavaScript入門
教材は
文と式
JavaScriptは文と式で成り立つ。
式は評価すると値を得ることができ、この値のことを評価値と呼ぶ。
文は処理の一部として式を含むことがある。
式文
式は文になることができる。文となった式のことを式文と呼ぶ。
条件分岐
if, else if, else
省略
switch文
switch
は言語によって結構差がある部分なので一応メモする。
switch (式) {
case ラベル1:
// something to do
break;
case ラベル2:
// something to do
break;
default:
// something to do
break;
}
C言語などと同じですね。breakを忘れるとその下のcaseの内容も実行される。
ループと反復処理
while, do-while, for
C言語と同じ。省略。
配列の forEach
メソッド
他の言語と似てるが、メソッド名が forEach
(Eが大文字) ですね。
// forEachにはコールバック関数を渡す
const array = [1,2,3];
array.forEach( currentValue => {
// 配列の要素ごとに呼び出される処理
});
実例
function sum(numbers) {
let total = 0;
numbers.forEach(num => {
total += num;
});
return total;
}
sum([1, 2, 3, 4, 5]); // -> 15
break
省略
配列の some
メソッド
some
メソッドは配列の各要素に対して何か処理をしたい場合に使えるメソッドで、処理内容をコールバック関数で渡すことができる。
以下は配列に偶数が含まれているか判定をする例。
function isEven(num) {
return num % 2 === 0;
}
const numbers = [1, 5, 10, 15, 20];
console.log(numbers.some(isEven)); // -> true
continue
省略
配列の filter
メソッド
配列から特定の値だけを集めた新しい配列を作るには filter
メソッドを利用できる。
function isEven(num) {
return num % 2 === 0;
}
const array = [1,2,3,4,5];
const filteredArray = array.filter((currentValue, index, array) => {
});
fA = array.filter(isEven);
console.log(fA); // -> [2,4]
for…in文(基本的に使わない方がよい)
for…in文はオブジェクトのプロパティに対して 順不同で 反復処理を行います。
for(プロパティ in オブジェクト) {
// something to do...
}
for…in 文の問題
JavaScriptのオブジェクトは何らかのオブジェクトを継承している。
対象となるオブジェクトのプロパティを列挙する場合、親オブジェクトまで列挙可能なものがあるかを探索して列挙する。そのため、オブジェクト自身が持っていないプロパティも列挙されてしまい、意図しない結果になる場合がある。
安全にオブジェクトのプロパティを列挙するには Object.keys
メソッド、 Object.values
メソッド、 Object.entries
メソッドがなどが利用できる。
for…in 文は配列に対しても利用できるが、こちらにも問題がある。
const numbers = [5, 10];
let total = 0;
for (const num in numbers) {
// 0+"0"+"1" という文字列結合が行われる
total += num;
}
console.log(total); // -> "001"
このように、配列の要素がnumに代入されるのではなく、配列のプロパティ名(ここでは要素のインデックス"0"や"1")がnumに代入されてしまう。
配列の要素に対して何かしらの処理を行う場合、 for文または forEachメソッド、もしくは後述の for…of 文を使うべき。
[ES2015] for…of 文
JavaScriptでは Symbol.iterator
という特別な名前のメソッドを実装したオブジェクトを iterable と呼び、iterableオブジェクトは for…of 文で反復処理できる。
iterableオブジェクトは反復処理時に次に返す値を定義する。それに対してfor…of文では iterable
から値を1つ取り出し、variable
に大入試反復処理を行う。
for(variable of iterable) {
// something to do
}
Arrayもiterableオブジェクトなので、以下のように配列の要素を取り出すことができる。
const array = [1,2,3];
for (const value of array) {
console.log(value);
}
Stringオブジェクトもiterableなので、文字を1つずつ取り出すことができる。他にも TypedArray
, Map
, Set
など Symbol.iterator
が実装されているオブジェクトは多数あるので、for…of文はそれらの iteratable
オブジェクトを扱うことができる。
reduce
メソッド
function sum(numbers) {
return numbers.reduce((total, num) => {
return total + num; // 今回の合計が 次のループの totalに代入される。numは次の値が入る。
}, 0); // 初期値が0
}
sum([1,2,3,4,5]); // -> 15
reduceメソッドを使った例では、そもそも変数宣言をする必要がない。