アカウント名:
パスワード:
ES5 の tyoeof 演算子 [github.io] の仕様は心から何とかしてほしいですが、ES6 の typeof 演算子 [mozilla.org] でも手を入れられる様子がありません…。
typeof null === 'object' ; // Null 型なのに "object"typeof new Function === 'function'; // Object 型なのに "function"typeof arg === 'hoge' ; // Object 型なのに規定外の文字列
typeof arg === 'hoge' ; // Object 型なのに規定外の文字列
argって何?
typeof arg === 'hoge' ; // Object 型なのに規定外の文字列 argって何?
arg は仮の変数なので意味はありません。Object (non-standard exotic and does not implement [[Call]]) [mozilla.org] だと思ってください。new ActiveXObject 辺りが該当したと思いましたが、具体的な値は忘れました。
null は !object で判別すれば特に困ることはないと思う。undefined も同じだけど null と undefined を区別したい時は typeof 使えば undefined を区別出来るから問題ないよ。
null は !object で判別すれば特に困ることはないと思う。
Null 型に関しては仰るとおり、値で判定すれば良いので実質的には困っていないのですが、型を判定する演算子として用意された「typeof演算子」が「型」となる文字列以外を返している事から統一性がない現状を生み出しており、混乱の元となっている点は否めないと思います。
特に「Object 型として返す文字列値」の広範さは何なんですか、と軽く怒りを覚えます。ES5 までは Object 型の判定として下記コードにようにしていました。https://gist.github.com/think49/887049/38781c5081dd6845fe0d2169192ff4a... [github.com]
ところが、ES6 になって Symbol 型が増えて上記コードは Symbol 型の値を渡したときに期待通りに動作しません。仕方なく、型が増えてもある程度は対応できるように下記コードに修正しました。https://gist.github.com/think49/887049 [github.com]
このコードも ToObject で例外を返す型が増えれば破綻します。いい加減、Object 型を判定するネイティブ機能が実装されて欲しいものです。ES6 で実装予定だった Object.isObject はいつの間にか仕様から外されましたが、どうにかならないものですかね…。
undefined も同じだけど null と undefined を区別したい時は typeof 使えば undefined を区別出来るから問題ないよ。
私も Undefined 型には特に問題点は感じないですね。var undefined で undefined が上書きできてしまう問題も ES5 で対策されましたし。
なるほど、詳しい説明どうも。typeof null の結果は JavaScript の最大の設計ミスと言われてるし…。たけど、Symbol についてはまだ不勉強でよく分かってなかった。教えてもらったコード見ながら、ちょっと調べてみようと思う。
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
ECMAScript は後方互換性を重視してるってだけだと思うけど… null は === で比較できるし… (new Function()) 使うような状況で typeof を回したい意味がよく分からん。arg は arguments のこと?
そもそもオブジェクトかどうか判定しないといけない場面ってなんですか?標準APIの様に、オブジェクト化するか、さもなくば途中の処理でエラーになることを気にしなければいいのでは?
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
あと、僕は馬鹿なことをするのは嫌いですよ (わざとやるとき以外は)。-- Larry Wall
JavaScript (ECMAScript 5) の typeof 演算子 (スコア:1)
ES5 の tyoeof 演算子 [github.io] の仕様は心から何とかしてほしいですが、ES6 の typeof 演算子 [mozilla.org] でも手を入れられる様子がありません…。
Re:JavaScript (ECMAScript 5) の typeof 演算子 (スコア:2)
typeof arg === 'hoge' ; // Object 型なのに規定外の文字列
argって何?
Re:JavaScript (ECMAScript 5) の typeof 演算子 (スコア:1)
arg は仮の変数なので意味はありません。
Object (non-standard exotic and does not implement [[Call]]) [mozilla.org] だと思ってください。
new ActiveXObject 辺りが該当したと思いましたが、具体的な値は忘れました。
Re:JavaScript (ECMAScript 5) の typeof 演算子 (スコア:2)
null は !object で判別すれば特に困ることはないと思う。
undefined も同じだけど null と undefined を区別したい時は typeof 使えば undefined を区別出来るから問題ないよ。
Re:JavaScript (ECMAScript 5) の typeof 演算子 (スコア:1)
Null 型に関しては仰るとおり、値で判定すれば良いので実質的には困っていないのですが、型を判定する演算子として用意された「typeof演算子」が「型」となる文字列以外を返している事から統一性がない現状を生み出しており、混乱の元となっている点は否めないと思います。
特に「Object 型として返す文字列値」の広範さは何なんですか、と軽く怒りを覚えます。
ES5 までは Object 型の判定として下記コードにようにしていました。
https://gist.github.com/think49/887049/38781c5081dd6845fe0d2169192ff4a... [github.com]
ところが、ES6 になって Symbol 型が増えて上記コードは Symbol 型の値を渡したときに期待通りに動作しません。
仕方なく、型が増えてもある程度は対応できるように下記コードに修正しました。
https://gist.github.com/think49/887049 [github.com]
このコードも ToObject で例外を返す型が増えれば破綻します。
いい加減、Object 型を判定するネイティブ機能が実装されて欲しいものです。
ES6 で実装予定だった Object.isObject はいつの間にか仕様から外されましたが、どうにかならないものですかね…。
私も Undefined 型には特に問題点は感じないですね。
var undefined で undefined が上書きできてしまう問題も ES5 で対策されましたし。
Re:JavaScript (ECMAScript 5) の typeof 演算子 (スコア:2)
なるほど、詳しい説明どうも。
typeof null の結果は JavaScript の最大の設計ミスと言われてるし…。
たけど、Symbol についてはまだ不勉強でよく分かってなかった。
教えてもらったコード見ながら、ちょっと調べてみようと思う。
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かどうかをチェックすべき。
で、クラス名はこういうこと
Re: (スコア:0)
ECMAScript は後方互換性を重視してるってだけだと思うけど… null は === で比較できるし… (new Function()) 使うような状況で typeof を回したい意味がよく分からん。arg は arguments のこと?
Re: (スコア:0)
そもそもオブジェクトかどうか判定しないといけない場面ってなんですか?
標準APIの様に、オブジェクト化するか、さもなくば途中の処理でエラーになることを気にしなければいいのでは?