[解決済み】Numberオブジェクトがプロパティを保持し、数値を増加させるこのコードで何が起こっているのでしょうか?
質問
最近のツイート には、このような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
は単なる数字にしか見えません。5
と25
(ただしNumber
s) -
なぜ
five.wtf
プロパティの後に消えます。five++
インクリメント -
なぜ
five.wtf
プロパティの後に設定することさえできなくなります。five++
インクリメントされたにもかかわらずfive.wtf = 'potato?'
の代入は、明らかに値をセットしているように見えます。
どのように解決するのですか?
OPです。Stack Overflowでこれを見るのは面白いですね :)
動作のステップを踏む前に、いくつかのことを明確にすることが重要です。
-
数値 と 数値オブジェクト (
a = 3
対a = new Number(3)
) は非常に異なっています。一方はプリミティブで、もう一方はオブジェクトです。プリミティブには属性を割り当てることができませんが、オブジェクトには割り当てることができます。 -
両者間の強制は暗黙のうちに行われる。
例えば
(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
-
すべての 表現方法 には戻り値があります。このとき レップル を読み込んで実行すると、このように表示されます。戻り値は、しばしばあなたが考えているような意味ではなく、事実とは異なることを暗示しています。
よし、これでいいんだ。
誓約書です。
> 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と評価され、次に
five
を
6
.
だけでなく
five
に設定される。
6
が、Number値に強制的に戻され、すべての属性が失われました。プリミティブは属性を保持できないので
five.wtf
は未定義です。
> five.wtf = 'potato?'
'potato?'
> five.wtf
undefined
再度、属性の再割り当てを試みます。
wtf
を
five
. 戻り値は、それが刺さったことを意味しますが、実際には刺さらないためです。
five
はNumber値であって、Numberオブジェクトではありません。この式は次のように評価されます。
'potato?'
しかし、確認すると、代入されていないことがわかります。
プレステージは。
> five
6
postfixのインクリメント以来、ずっと。
five
は
6
.
関連
-
[解決済み】Kendo Observable Bindingと併用する場合、Kendo Switch Labelsを変更することは可能ですか?[Kendo-UI]です。
-
[解決済み] JavaScriptでオブジェクトのキー/プロパティの数を効率的にカウントする方法
-
[解決済み] オブジェクトをメンバーとして、プレーンなJavaScriptオブジェクトをループさせる方法
-
[解決済み] セレクトボックスのオプションをすべて削除してから、オプションを1つ追加して、jQueryで選択するにはどうすればよいですか?
-
[解決済み] JavaScriptの配列宣言で「Array()」と「[]」はどう違うのですか?
-
[解決済み] オブジェクトのプロパティが存在するかどうかを、プロパティ名を持つ変数で確認するには?
-
[解決済み] '$(this)' と 'this' の違いは何ですか?
-
[解決済み] HTMLのプロパティと属性の違いは何ですか?
-
[解決済み] parseInt()とNumber()の違いは何ですか?
-
[解決済み】オブジェクトを含む配列をループして、そのプロパティにアクセスする方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】TypeError: 'undefined'はオブジェクトではありません。
-
[解決済み] Uncaught TypeError: 未定義のプロパティ 'top' を読み込めない
-
[解決済み】最大呼び出しスタックサイズ超過エラーとその修正方法とは?
-
[解決済み] React with ES7: Uncaught TypeError: Cannot read property 'state' of undefined [duplicate] (未定義のプロパティ'state'を読み込むことはできません。
-
[解決済み] テスト
-
[解決済み】 Uncaught Error: Invariant Violation: 解決済み】 Uncaught Error: Invariant Violation: Element type is invalid: expected a string (for built-in components) or a class/function but got: object.
-
[解決済み】Syntax error: JavaScriptの不正なreturnステートメント
-
[解決済み】TypeError: AngularJSで未定義のプロパティ'get'を読み取れない
-
[解決済み】 \u003C とは何ですか?
-
[解決済み】module.exports "モジュールが定義されていません"