記事一覧:2016年02月15日

Node.js 4.xで廃止となったutil.is系メソッドの代替案

Node.jsの最新長期サポート版(LTS)であるv4.3.0では、それまで利用できたutil.isArray()やutil.isRegExp()、util.isDate()などのメソッドがDeprecated(廃止予定)扱いとなっています(v4.x系のドキュメントv0.12.x系のドキュメント)。

ドキュメントには理由が説明されておらず、代替案も掲載されていないのですが、StackOverflowでの情報によると、「後方互換性がなくなるために修正したくないから」だそうです。例としてutil.isObject()に関数オブジェクトを与えると戻り値はfalseになりますが、JavaScript(ECMAScript)の言語仕様上は関数オブジェクトもオブジェクトであり、これは不適切な実装であることが挙げられています。

isArrayとかisStringとかはあっても良いのでは……と思いますが、まあほかのコードで代替可能なのでコアからは削除する、というのは理解できます。ということで代替案ですが、下記のようにisinstanceof演算子で代替できます。

$ node
> [] instanceof Array
true
> [] instanceof Object
true
> [] instanceof String
false

なお面倒臭いことに、instanceof演算子はプリミティブ型(文字列や数値型など、オブジェクトではないもの)に対してはすべてfalseを返します。そのため、プリミティブ型に対してはtypeof演算子の戻り値を使用して判断する必要があります。

> typeof a
'string'
> typeof []
'object'
> typeof 10.1
'number'
> typeof /ABC/
'object'