また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
の引数をオブジェクト以外とすることは、ほぼ必要ないでしょう。