Help us understand the problem. What is going on with this article?

Object.keysの挙動の変化

More than 1 year has passed since last update.

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

jkr_2255
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした