JavaScriptの判定は融通が効かないという話
JavaScriptで処理を記述する場合、配列や文字列の空チェックを行いたい場面が多々出てきます。
しかし、素直にif (var) というようにすると、期待しているような結果が得られない事があります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
var test = null if(test) {console.log(true)} else {console.log(false)} >> false var test = undefined if(test) {console.log(true)} else {console.log(false)} >> false // 空の文字列 var test = "" if(test) {console.log(true)} else {console.log(false)} >> false // 空の配列 var test = [] if(test) {console.log(true)} else {console.log(false)} >> true // 空のオブジェクト var test = {} if(test) {console.log(true)} else {console.log(false)} >> true |
言語の仕様からどうしても厳密に入ってくる型を指定できない関係上、凡ミスを防ぐためにも汎用的に空チェックを行うことが望ましいです。空チェックが全て同じコードで書かれていれば見通しも良くなりますしね。
なお、Pythonだと同様の事をすると全てFalseとなります。。
自分でクラスを定義して対応する
タイトルの通り、参考ページのものを自分の環境に合わせてES2015(ES6)用にしました。
古い書き方をしなくては行けない方は下部の参考ページを参照してください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
export default class CommonUtil { /** * IsEmpty * @param obj {any} - Target Object */ static isEmpty (obj) { if (obj === undefined || obj === null) { return true } else if (Object.prototype.toString.call(obj).slice(8, -1) === 'String') { if (obj === '') { return true } } else if (Object.prototype.toString.call(obj).slice(8, -1) === 'Array') { if (obj.length === 0) { return true } } else if (Object.prototype.toString.call(obj).slice(8, -1) === 'Object') { if (!Object.keys(obj).length) { return true } } return false } /** * IsNotEmpty * @param obj {any} - Target Object */ static isNotEmpty (obj) { return !this.isEmpty(obj) } } |
参考
【配列対応版公開中】JavaScriptでIsEmptyとIsNotEmptyを実装しよう – 空色エンジニア
(参考というかほぼ引用ですが。)