アカウント名:
パスワード:
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 型を判定する必要があるので、typeof演算子で判定する際に [[Call]] の有無や Null 型の存在が邪魔になります。そもそも、[[Call]] の有無は別機能で判定させるべきで typeof 演算子で判定する意味は全くないと思っています。理想的には下記コードにようであって欲しい。
typeof null === 'null'; // truetypeof new Function === 'object'; // true Function.hasCall(new Function); // truenew Function().hasCall() ; // true
厳密にObjectを判定したいというのが間違ってる。そもそもtypeがオブジェクトとわかった所でどんなクラスかもどんな内部スロット抱えてるかもわからないじゃん。クラスがどうでもいいのならそれこそ関数が来たっていいはずだし、そもそもJSの流儀的にはObjectCoercibleという概念があって、簡単にいえば、オブジェクトを期待する場面ではnull、undefined以外は通す。つまりチェックは(obj != null)でいいのよ。そうでなくもし本当に例えばMapが欲しいのならMapかどうかをチェックすべき。
で、クラス名はこういうこと
let o = { [Symbol.toString
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
人生の大半の問題はスルー力で解決する -- スルー力研究専門家
JavaScript (ECMAScript 5) の typeof 演算子 (スコア:1)
ES5 の tyoeof 演算子 [github.io] の仕様は心から何とかしてほしいですが、ES6 の typeof 演算子 [mozilla.org] でも手を入れられる様子がありません…。
Re: (スコア:0)
ES7でオーバーロード可能になるよ。
ES6ではObject.prototype.toStringされた時のクラス名の表示が自己申告(オーバーロード)できるようになった。
あとnullが'object'になったり関数が'function'になったりするのも実用的には便利なことも多いよ。
Re:JavaScript (ECMAScript 5) の typeof 演算子 (スコア:1)
私の理解不足だと思うのですが、オーバーロードとtypeof演算子の関係性が分かりませんでした。
Object.prototype.toString は [[Class]] 判定であって型判定は別と認識しているのですが…。
もし、よろしければ解説頂けると有難いです。
おそらく、用途の違いだと思うのですが、私の場合、「Object 型に対して~したい」というケースがあります。
すると、厳密に Object 型を判定する必要があるので、typeof演算子で判定する際に [[Call]] の有無や Null 型の存在が邪魔になります。
そもそも、[[Call]] の有無は別機能で判定させるべきで typeof 演算子で判定する意味は全くないと思っています。
理想的には下記コードにようであって欲しい。
Re: (スコア:0)
厳密にObjectを判定したいというのが間違ってる。
そもそもtypeがオブジェクトとわかった所でどんなクラスかもどんな内部スロット抱えてるかもわからないじゃん。
クラスがどうでもいいのならそれこそ関数が来たっていいはずだし、
そもそもJSの流儀的にはObjectCoercibleという概念があって、簡単にいえば、オブジェクトを期待する場面ではnull、undefined以外は通す。
つまりチェックは(obj != null)でいいのよ。
そうでなくもし本当に例えばMapが欲しいのならMapかどうかをチェックすべき。
で、クラス名はこういうこと