LoginSignup
3
1

More than 5 years have passed since last update.

Object.keysの挙動の変化

Posted at

また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)は空オブジェクトを返しますので、その違いには要注意です)。

  • nullundefined…変換できずにTypeErrorが発生
  • プリミティブ値(stringbooleannumbersymbol)…ラッパーオブジェクトを返す
  • オブジェクト…そのまま

現実問題

ただし、ラッパーオブジェクトは同じ方法で生成されること、またObject.keysはプロトタイプを見ないこともあって、String以外のラッパーオブジェクト(プリミティブも)は、Object.keysに入れても空配列を返すだけです。Stringの場合は、0からlength-1まで1つずつ詰まった配列を返しますが、そこまで有用でもなさそうです。

意図的にObject.keysの引数をオブジェクト以外とすることは、ほぼ必要ないでしょう。

3
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1