2015年6月にECMAScript 2015がリリースされて以降、JavaScriptの機能は大きく強化されました。const
/let
、アロー関数、クラス構文、Promise
などが有名なところですが、ES2016、ES2017、ES2018、そして更にその先へJavaScriptの仕様は日々進化しています。筆者はここ数年JavaScript(主にTypeScript)の開発を進めていますが、これまで当たり前だと思っていた手法を新しい新機能で置き換えることが何度もありました。
本記事では、2017から2018年に向けて筆者が見直したJavaScriptのプログラミング手法について紹介します。記事の末尾にブラウザ対応の手法もまとめていますので、あわせてご覧ください。
☞︎配列要素の存在チェックにはincludes()メソッド
配列内に特定の要素があるかどうかを調べる場合、従来は次のようにindexOf()
メソッドを使っていました。
var targetArray = [ "鈴木" , "田中" , "高橋" ]; |
if (targetArray.indexOf( "田中" ) >= 0) { |
console.log( "田中が含まれています" ); |
console.log( "田中は存在しません" ); |
ES2017で追加された配列のためのincludes()
メソッドを使うと、インデックスではなく真偽値を使って配列内の要素の存在チェックが可能になります。
const targetArray = [ "鈴木" , "田中" , "高橋" ]; |
if (targetArray.includes( "田中" )) { |
console.log( "田中が含まれています" ); |
console.log( "田中は存在しません" ); |
ちなみにES2015では文字列の存在チェックのためのincludes()
メソッドが追加されており、こちらもindexOf()
と代わって使用しています。
const targetUserAgent = navigator.userAgent; |
if (targetUserAgent.includes( "iOS" )) { |
console.log( "iOSブラウザです" ); |
筆者のQiita記事「配列内の要素の存在確認にはArray.includes()メソッドが便利」もあわせて参照ください。
☞︎ゼロパディングにはpadStart()メソッド
時計の秒数表示など、一桁の数字の頭に0をつけて文字列にしたい場合、従来は次のようなコードを書いていました。
var second = new Date().getSeconds(); |
var paddedSecond = String(second); |
paddedSecond = "0" + paddedSecond; |
console.log(paddedSecond); |
ES2017では、文字詰めのためのpadStart()
メソッドが追加されました。次のように指定することで、「文字列」が指定の「長さ」になるように、「詰める文字」を文字列の前に配置します。
先ほどのコードは次のように短く書けます。
const second = new Date().getMinutes(); |
const paddedSecond = String(second).padStart(2, "0" ); |
console.log(paddedSecond); |
☞︎Promiseを使うならasync/awaitをセットに
ES2015で非同期処理のために導入されたPromise
ですが、Promise
の処理を連結し、条件分岐を入れるなどすると見通しが悪くなりがちでした。
次に示すのは、リソース取得のためのFetch APIを用いてその結果response
に応じて処理を出し分ける例です(※)。
.then(response => new Promise((resolve, onrejected) => { |
.then(json => resolve(json)); |
return onrejected(response.status); |
json => console.log(Reflect.get(json, "mytext" )), |
error => console.log(`error status : ${error}`) |
※ 取得結果であるresponse
データには、取得成功・失敗を示すresponse.ok
が含まれます。成功ならばJSONの中身を、失敗ならばエラーコードを出力するコードです。
コード中のReflect.get()
を使うとオブジェクトから指定のプロパティを取り出せます。
ES2017で導入されたawait
/async
を使えば、次のようにネストを深くせずにPromise
による処理を記述可能です。
const response = await fetch( "./myjson.json" ); |
console.log(`error status : ${error}`); |
const json = await response.json(); |
console.log(Reflect.get(json, "mytext" )); |
await
演算子: Promise
による処理の結果が返るのを待つasync
: 関数内でawait
を使うための宣言
☞︎整数部分の取得にはMath.trunc()メソッド
小数を整数に丸める場合、Math.floor()
を使うことが多かったのですが、負の値を丸める場合の挙動が分かりづらく、複数人開発での混乱の元になりがちでした。
ES2015で導入された整数部分だけを取得するMath.trunc()
メソッドを使えば、正の値、負の値が関係なく整数部分を取得でき、直感的な挙動となります。
☞︎べき乗の計算にはべき乗演算子**
2の5乗などのべき乗計算には、従来はMath.pow()
を使っていました。
Math.sqrt(Math.pow(3, 2) + Math.pow(4, 2)); |
ES2016ではべき乗演算子**
(Exponentiation Operator))を使って同じようにべき乗計算が可能になりました。タイプ量が少なくなるメリットがあります。
(3 ** 2 + 4 ** 2) ** 0.5; |
筆者のQiita記事「べき乗をするならMath.pow()よりもExponentiation Operatorが手軽」もあわせて参照ください。
☞︎文字数カウントには配列用のスプレッド演算子
文字数をJavaScriptでカウントする場合は、String
のlength
プロパティを用いてきました。しかし、このプロパティではサロゲートペア文字列(「𦥑(臼ではありません)」や、「𩸽(ホッケ)」などの漢字、「😀」「😺」といった絵文字)の文字数が2以上になります。
ES2015で導入された「...
」で表現されるスプレッド演算子。文字列と配列を組み合わせると、文字数のカウントに使えます。
なお、JavaScriptにおける文字数の数え方についてより詳しくは記事「JavaScript における文字コードと「文字数」の数え方 | blog.jxck.io」を参照ください。
☞︎オブジェクトのコピーにも…(スプレッド演算子)
ES2015では、オブジェクトのコピーのためのObject.assign()
が導入され、オブジェクトのコピー(シャローコピー)が楽になりました。
const copiedObject = Object.assign({}, myObject); |
console.log(copiedObject); |
ES2018で導入予定のオブジェクト用のスプレッド演算子を用いれば、次のような短いコードでオブジェクトのコピーが可能です。
const copiedObject = {...myObject}; |
console.log(copiedObject); |
次のページでは、非同期処理に使用しているObservable
(RxJS)と、未対応ブラウザで最新機能を使う方法、そして未来のJavaScriptの機能について紹介します。