JavaScript

【JavaScript】数値か判定するisNumber関数

入力した値が数値か数値以外かを判定するためにisNumber関数を使う。
typeof演算子を使ってnumberなら数値と判定できる。しかし、Infinityと-Infinityはtypeof演算子を使うとnumberと判定されてしまう。isNumber関数ではInfinityと-Infinityをfalseと判定する。
このため、Infinityと-Infinityを数値と判断したくない場合はisNumber関数を使う。

空文字、Infinity、-Infinity、文字列0、nullの場合、isNumber関数はfalseになる。
数値0の場合、isNumber関数はtrueになる。

続きを読む

【JavaScript】$.when()の使い方

$.when()メソッドは複数のオブジェクトを渡して並列で読み込んだ後に成功するとdoneメソッドを実行する。$.when()メソッドは非同期処理である。

これはどういうことかと言うと、
処理A
$.when(オブジェクト1、オブジェクト2).done(function() {});
処理B
の場合を考える。
処理Aを実行後に、$.whenメソッドはオブジェクト1とオブジェクト2の読み込みに成功するとdoneメソッドを実行する。$.whenメソッドは非同期処理であるため、オブジェクトの読み込みが早く終わる場合は、処理A→$.when()でオブジェクトを読み込む→$.when()のdone()を実行→処理Bを実行。
オブジェクトの読み込みに時間がかかってしまう場合は、処理A→$.when()でオブジェクトを読み込む→処理B→$.when()のdone()を実行。
$.when()メソッドは非同期処理なので、doneメソッドの実行が終わるまで待たずに次の処理を実行する

続きを読む

【JavaScript】forEachとarguments

配列はforEach文が使用可能である。
しかし、配列ではなくオブジェクトの場合、forEach文は使用不可能である。
こんな時は、object.key()を使ってオブジェクトのキー(プロパティ名)の配列を通常のループで取得するのと同じ順序で得ることができる。
つまりobject.key().forEach()とする。

すべての関数は実行されるときにthisとargumentsを受け取る。
argumentsはlengthプロパティが存在するためオブジェクトと思いきや、argumentsは配列に似たオブジェクトである。このためargumentsにはforEach文が使用不可能である。

配列の要素を取り出すfor文をforEach文に書き換えをしていると、argumentsの値を取り出すfor文をforEach文に書き換えができなかった。
調べると、argumentsはオブジェクトでありforEach文を使用不可能だった。

「argumentsの値を取り出す」の言い方は正しいのか?よく分からん。

続きを読む

【JavaScript】Array.prototype.concatメソッドとArray.prototype.reduce()メソッド

concatメソッドは、自分自身の配列と引数として渡された要素を連結して、新しいコピー配列を生成する。もし引数として渡された要素が配列なら、そこに含まれる要素がそれぞれ新しく作られた配列に追加される。
concatメソッドとスプレット構文(Spread syntax)とreduceメソッドを使うと2次元配列を1次元配列に変換できる。
簡単に2次元配列を1次元配列に変換可能なことに驚いたわ。

concatenate (他)《コ》[文字などを]連結させる
concatenation (名)(U)連続,連結
spread (自)広がる (他)を広げる

続きを読む

【JavaScript】Array.prototype.reduce()

Array.prototype.reduce()はややこしいな。

簡単な使い方
reduceメソッドで配列の中の数値をすべて足して合計値を求める。
reduceメソッドで配列の中の文字列をすべて連結した文字列を作る。
初期値に関しては、空の配列を初期値なしで実行するとエラーになったり、予期せぬ実行結果になったりする可能性があるため、初期値は設定した方がいい。
配列の中の文字列を連結したいならjoinメソッド使った方が記述内容も少なくて分かりやすいな。

reduce (他)を減らす

配列の中の数値を全部合計する処理にreduceメソッド使えるな。
しかし、なんでreduceという名前なんだ?「減らす」という意味だよな。

続きを読む

【JavaScript】Array.prototype.map()

Array.prototype.map() メソッドは、与えられた関数を配列のすべての要素に対して呼び出し、
その結果からなる新しい配列を生成する。
mapメソッドで返された配列を使用しない場合はmapメソッドを使用すべきではない。

続きを読む

【JavaScript】正規表現の肯定先(後)読みと否定先(後)読み

正規表現の肯定先(後)読みと否定先(後)読みは^(先頭)、$(末尾)、\b(単語の境界)同様に「位置へのマッチ」である。
この「位置へのマッチ」はアンカーと呼ばれる。
長さ0の文字列にマッチすると考えて、ゼロ幅アサーション(zero-length assertion)やゼロ幅マッチ(zero-length match)とも呼ばれる。

assertion(名)《コ》アサーション◆プログラムの形式検証における成立条件

続きを読む

【JavaScript】スプレッド構文とmapを使ってみる

配列namesに格納した文字列の中で最長の文字列を求める
Math.maxとmapメソッドとスプレット構文を使用したが、このときmapメソッドにより新しく生成された配列は使用されないため、forEachを使用する方が良い気がする。
スプレット構文とmapを使用するパターンはあまりよくないパターンかもしれない。
やっぱり、このとき無駄な配列を生成しているからダメなコード例だな。


const names = ['url', 'scheme', 'slash', 'host', 'port', 'path', 'query', 'hash'];
//この場合、mapメソッドで新しく生成した配列を使用しない
const stringLengthMax = Math.max(...names.map(v => v.length));
let stringLengthMax2 = 0;

//forEachを使う
names.forEach(v => {if(stringLengthMax2 < v.length) stringLengthMax2 = v.length;});

console.log("stringLengthMax = " + stringLengthMax);//6
console.log("stringLengthMax2 = " + stringLengthMax2);//6

続きを読む