javascript
1var obj = new Object(0); 2//PrimitiveValue = 0 ←この値を変更したい
作成したNumberオブジェクトのPrimitiveValueを変更(加算)していく方法はありますでしょうか?
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答4件
0
ベストアンサー
Primitive 型 (プリミティブ型)
Number 型は Primitive 型 の一種ですが、下記コードは Object 型(プリミティブラッパーオブジェクト)です。
JavaScript
1new Object(1); 2new Number(1);
既存回答の中には「Number オブジェクト」と 1
を同一と見なす意見が見られますが、プリミティブラッパーオブジェクトとプリミティブ型は同一ではありません。
[[PrimitiveValue]] (ES5.1)
[[PrimitiveValue]]
は ES5.1 までは仕様に存在しましたが、ES6 以降は仕様からその名称は消えています。
- 8.6.2 Object Internal Properties and Methods - ECMA-262 Edition 5.1
- 9.1 Ordinary Object Internal Methods and Internal Slots - ECMA-262 6th Edition
- 6.1.7.2 Object Internal Methods and Internal Slots - ECMAScript® 2016 Language Specification
[[NumberData]]
ES6, ES7 では [[PrimitiveValue]]
の代わりに [[NumberData]]
が用意されました。
仕様にざっと目を通す限りでは [[NumberData]]
は内部スロットであり、直接値を変更する方法は用意されていません。
- 7.1.13 ToObject - ECMAScript® 2016 Language Specification
- 20.1.1 The Number Constructor - ECMAScript® 2016 Language Specification
Internal Slots (ES7)
ES7 で規定される [[NumberData]] は Internal Slots(内部スロット) と呼称され、次のように説明されています。
Various algorithms within this specification create objects that have internal slots. However, the ECMAScript language provides no direct way to > associate internal slots with an object.
(機械翻訳) 「この仕様内のさまざまなアルゴリズムは、内部スロットを持つオブジェクトを作成します。しかし、ECMAScript言語は、内部スロットをオブジェクトに関連付ける直接の方法を提供しません。」
従って、[[NumberData]] を直接操作する方法はないと読み取れます。
外部から操作可能なら内部スロットは作らないと思われる為、当然といえば当然ですが…。
valueOf メソッド
一部の機能は Primitive 型に変換する事で数値を得る動作をしています。
例えば、+
演算子は ToNumber
(内部的に ToPrimitive
を参照)で型変換をしていますが、ToPrimitive の過程で valueOf
メソッドの返り値を参照しています。
従って、valueOf メソッドを動的に書き換える事でプリミティブ値を書き換えているかのような挙動にすることが可能です。
- 12.5.6 Unary + Operator - ECMAScript® 2016 Language Specification
- 7.1.3 ToNumber - ECMAScript® 2016 Language Specification
- 7.1.1 ToPrimitive - ECMAScript® 2016 Language Specification
JavaScript
1var obj = new Object(0); 2obj.valueOf = function valueOf () { return 3; }; 3 4console.log(obj + 2); // 5
更新履歴
- 2017/05/24 14:28 「Internal Slots (ES7)」の節を追記
Re: coko1 さん
投稿2017/05/24 04:06
編集2017/05/24 05:28総合スコア18156
0
プリミティブ値
object 型をのぞく全ての型は不変 (immutable) な値 (変更することができない値) として定義されています。
データ構造 - JavaScript | MDN
投稿2017/05/24 02:42
総合スコア35860
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/05/24 04:58
2017/05/24 05:53 編集
0
プリミティブを書き換えるメソッドは用意されていないようですね
javascript
1var obj = new Object(0); 2obj=new Number(obj+1); 3obj=new Number(++obj); 4console.log(obj);
※インクリメント処理はやめたほうがいいかも
投稿2017/05/24 01:48
総合スコア114572
0
普通に0 + 1のように加算すれば良いだけでは?
そういうことではなくて?
ご自身でおっしゃっている通り、javascriptの0や1はNumberオブジェクトですし。
投稿2017/05/24 01:44
総合スコア854
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。