アカウント名:
パスワード:
ES5 の tyoeof 演算子 [github.io] の仕様は心から何とかしてほしいですが、ES6 の typeof 演算子 [mozilla.org] でも手を入れられる様子がありません…。
typeof null === 'object' ; // Null 型なのに "object"typeof new Function === 'function'; // Object 型なのに "function"typeof arg === 'hoge'
ES7でオーバーロード可能になるよ。ES6ではObject.prototype.toStringされた時のクラス名の表示が自己申告(オーバーロード)できるようになった。あとnullが'object'になったり関数が'function'になったりするのも実用的には便利なことも多いよ。
ES7でオーバーロード可能になるよ。ES6ではObject.prototype.toStringされた時のクラス名の表示が自己申告(オーバーロード)できるようになった。
私の理解不足だと思うのですが、オーバーロードとtypeof演算子の関係性が分かりませんでした。Object.prototype.toString は [[Class]] 判定であって型判定は別と認識しているのですが…。もし、よろしければ解説頂けると有難いです。
あとnullが'object'になったり関数が'function'になったりするのも実用的には便利なことも多いよ。
おそらく、用途の違いだと思うのですが、私の場合、「Object 型に対して~したい」というケースがあります。
厳密にObjectを判定したいというのが間違ってる。そもそもtypeがオブジェクトとわかった所でどんなクラスかもどんな内部スロット抱えてるかもわからないじゃん。クラスがどうでもいいのならそれこそ関数が来たっていいはずだし、そもそもJSの流儀的にはObjectCoercibleという概念があって、簡単にいえば、オブジェクトを期待する場面ではnull、undefined以外は通す。つまりチェックは(obj != null)でいいのよ。そうでなくもし本当に例えばMapが欲しいのならMapかどうかをチェックすべき。
で、クラス名はこういうこと
let o = { [Symbol.toStringTag]: 'ABC'}Object.prototype.toString.call(o) // '[object ABC]' let map = new Mapmap[Symbol.toStringTag] == 'Map' // true
こういう風に判定するといい。
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
犯人は巨人ファンでA型で眼鏡をかけている -- あるハッカー
JavaScript (ECMAScript 5) の typeof 演算子 (スコア:1)
ES5 の tyoeof 演算子 [github.io] の仕様は心から何とかしてほしいですが、ES6 の typeof 演算子 [mozilla.org] でも手を入れられる様子がありません…。
Re: (スコア:0)
ES7でオーバーロード可能になるよ。
ES6ではObject.prototype.toStringされた時のクラス名の表示が自己申告(オーバーロード)できるようになった。
あとnullが'object'になったり関数が'function'になったりするのも実用的には便利なことも多いよ。
Re: (スコア:1)
私の理解不足だと思うのですが、オーバーロードとtypeof演算子の関係性が分かりませんでした。
Object.prototype.toString は [[Class]] 判定であって型判定は別と認識しているのですが…。
もし、よろしければ解説頂けると有難いです。
おそらく、用途の違いだと思うのですが、私の場合、「Object 型に対して~したい」というケースがあります。
Re:JavaScript (ECMAScript 5) の typeof 演算子 (スコア:0)
厳密にObjectを判定したいというのが間違ってる。
そもそもtypeがオブジェクトとわかった所でどんなクラスかもどんな内部スロット抱えてるかもわからないじゃん。
クラスがどうでもいいのならそれこそ関数が来たっていいはずだし、
そもそもJSの流儀的にはObjectCoercibleという概念があって、簡単にいえば、オブジェクトを期待する場面ではnull、undefined以外は通す。
つまりチェックは(obj != null)でいいのよ。
そうでなくもし本当に例えばMapが欲しいのならMapかどうかをチェックすべき。
で、クラス名はこういうこと
こういう風に判定するといい。