パスワードを忘れた? アカウント作成
この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。

悩まされてしまうプログラミング言語の奇妙な特徴は?」記事へのコメント

  • 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って何?

      親コメント
    • 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 で対策されましたし。

        親コメント
    • by Anonymous Coward

      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';           // true
        typeof new Function === 'object'; // true
         
        Function.hasCall(new Function); // true
        new Function().hasCall()      ; // true

        親コメント
        • by Anonymous Coward

          厳密にObjectを判定したいというのが間違ってる。
          そもそもtypeがオブジェクトとわかった所でどんなクラスかもどんな内部スロット抱えてるかもわからないじゃん。
          クラスがどうでもいいのならそれこそ関数が来たっていいはずだし、
          そもそもJSの流儀的にはObjectCoercibleという概念があって、簡単にいえば、オブジェクトを期待する場面ではnull、undefined以外は通す。
          つまりチェックは(obj != null)でいいのよ。
          そうでなくもし本当に例えばMapが欲しいのならMapかどうかをチェックすべき。

          で、クラス名はこういうこと

          let o = {
            [Symbol.toString

    • by Anonymous Coward

      ECMAScript は後方互換性を重視してるってだけだと思うけど… null は === で比較できるし… (new Function()) 使うような状況で typeof を回したい意味がよく分からん。arg は arguments のこと?

    • by Anonymous Coward

      そもそもオブジェクトかどうか判定しないといけない場面ってなんですか?
      標準APIの様に、オブジェクト化するか、さもなくば途中の処理でエラーになることを気にしなければいいのでは?

Stay hungry, Stay foolish. -- Steven Paul Jobs

処理中...