1. ホーム
  2. ジャバスクリプト

[解決済み】Numberオブジェクトがプロパティを保持し、数値を増加させるこのコードで何が起こっているのでしょうか?

2022-04-02 22:26:35

質問

最近のツイート には、このようなJavaScriptのスニペットが含まれていました。

どなたか、この中で起こっていることを順を追って説明していただけませんか?

> function dis() { return this }
undefined
> five = dis.call(5)
Number {[[PrimitiveValue]]: 5}
> five.wtf = 'potato'
"potato"
> five.wtf
"potato"
> five * 5
25
> five.wtf
"potato"
> five++
5
> five.wtf
undefined
> five.wtf = 'potato?'
"potato?"
> five.wtf
undefined
> five
6

特に、私にはよくわからない。

  • の結果がなぜ dis.call(5)Number を何らかの形で [[PrimitiveValue]] プロパティがありますが、その結果は five++five * 5 は単なる数字にしか見えません。 525 (ただし Number s)
  • なぜ five.wtf プロパティの後に消えます。 five++ インクリメント
  • なぜ five.wtf プロパティの後に設定することさえできなくなります。 five++ インクリメントされたにもかかわらず five.wtf = 'potato?' の代入は、明らかに値をセットしているように見えます。

どのように解決するのですか?

OPです。Stack Overflowでこれを見るのは面白いですね :)

動作のステップを踏む前に、いくつかのことを明確にすることが重要です。

  1. 数値 数値オブジェクト ( a = 3a = new Number(3) ) は非常に異なっています。一方はプリミティブで、もう一方はオブジェクトです。プリミティブには属性を割り当てることができませんが、オブジェクトには割り当てることができます。

  2. 両者間の強制は暗黙のうちに行われる。

    例えば

    (new Number(3) === 3)  // returns false
    (new Number(3) == 3)   // returns true, as the '==' operator coerces
    (+new Number(3) === 3) // returns true, as the '+' operator coerces
    
    
  3. すべての 表現方法 には戻り値があります。このとき レップル を読み込んで実行すると、このように表示されます。戻り値は、しばしばあなたが考えているような意味ではなく、事実とは異なることを暗示しています。

よし、これでいいんだ。

誓約書です。

> function dis() { return this }
undefined
> five = dis.call(5)
[Number: 5]

関数を定義する dis コール である。 5 . これは、関数を実行する際に 5 をコンテキストとして使用します ( this ). ここでは、Number値からNumberオブジェクトに強制変換されています。ここで重要なのは、私たちが ストリクトモード このようなことは起こりません。 .

> five.wtf = 'potato'
'potato'
> five.wtf
'potato'

ここで、属性 five.wtf'potato' で、5をオブジェクトにすると、案の定 単純な割り当て .

> five * 5
25
> five.wtf
'potato'

five をオブジェクトにした場合でも、簡単な算術演算ができることを確認します。できますね。その属性はまだ残っていますか?はい。

ターンです。

> five++
5
> five.wtf
undefined

ここで five++ . でのトリックは ポストフィックスインクリメント は、式全体が元の値に対して評価されることです。 そして をインクリメントする。次のようになります。 five はまだ5ですが、実際には式が5と評価され、次に five6 .

だけでなく five に設定される。 6 が、Number値に強制的に戻され、すべての属性が失われました。プリミティブは属性を保持できないので five.wtf は未定義です。

> five.wtf = 'potato?'
'potato?'
> five.wtf
undefined

再度、属性の再割り当てを試みます。 wtffive . 戻り値は、それが刺さったことを意味しますが、実際には刺さらないためです。 five はNumber値であって、Numberオブジェクトではありません。この式は次のように評価されます。 'potato?' しかし、確認すると、代入されていないことがわかります。

プレステージは。

> five
6

postfixのインクリメント以来、ずっと。 five6 .