またIEだけで動かないコードが発生したのですが、今回ばかりはIEのせいとも言えない状況でした。
IEだけエラーに
いちおうIE11だけは切り捨てずに維持しているコードで、あるときIEだけがうまく動かないという状態になっていました。確認してみると、Object.keysで、引数が「オブジェクトではありません」とエラーになっていました。
他のブラウザで確認してみたところ、Object.keysにオブジェクト以外を流してもちゃんと動作するようでした。
挙動の違い
で、調べてみたところ、これはIEのバグというわけではなく、ES5とES6で仕様が変化していました。
- ES5→
Object.keysの引数をオブジェクト以外にすると、TypeErrorになる - ES6→
Object.keysの引数をオブジェクト以外にすると、ToObject(内部操作)によってまずオブジェクトに変換される
なお、ToObjectの動作は以下のとおりです(newなしのObject()に近いですが、Object(null)やObject(undefined)は空オブジェクトを返しますので、その違いには要注意です)。
-
null、undefined…変換できずにTypeErrorが発生 - プリミティブ値(
string、boolean、number、symbol)…ラッパーオブジェクトを返す - オブジェクト…そのまま
現実問題
ただし、ラッパーオブジェクトは同じ方法で生成されること、またObject.keysはプロトタイプを見ないこともあって、String以外のラッパーオブジェクト(プリミティブも)は、Object.keysに入れても空配列を返すだけです。Stringの場合は、0からlength-1まで1つずつ詰まった配列を返しますが、そこまで有用でもなさそうです。
意図的にObject.keysの引数をオブジェクト以外とすることは、ほぼ必要ないでしょう。