質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

4回答

1638閲覧

javascript Numberオブジェクト プリミティブ値 加算

coko1

総合スコア276

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

1クリップ

投稿2017/05/24 00:24

編集2017/05/24 00:49

javascript

1var obj = new Object(0); 2//PrimitiveValue = 0 ←この値を変更したい

作成したNumberオブジェクトのPrimitiveValueを変更(加算)していく方法はありますでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

ベストアンサー

Primitive 型 (プリミティブ型)

Number 型は Primitive 型 の一種ですが、下記コードは Object 型(プリミティブラッパーオブジェクト)です。

JavaScript

1new Object(1); 2new Number(1);

既存回答の中には「Number オブジェクト」と 1 を同一と見なす意見が見られますが、プリミティブラッパーオブジェクトとプリミティブ型は同一ではありません

[[PrimitiveValue]] (ES5.1)

[[PrimitiveValue]] は ES5.1 までは仕様に存在しましたが、ES6 以降は仕様からその名称は消えています。

[[NumberData]]

ES6, ES7 では [[PrimitiveValue]] の代わりに [[NumberData]] が用意されました。
仕様にざっと目を通す限りでは [[NumberData]] は内部スロットであり、直接値を変更する方法は用意されていません。

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 メソッドを動的に書き換える事でプリミティブ値を書き換えているかのような挙動にすることが可能です。

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
think49

総合スコア18156

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

プリミティブ値

object 型をのぞく全ての型は不変 (immutable) な値 (変更することができない値) として定義されています。
データ構造 - JavaScript | MDN

投稿2017/05/24 02:42

Lhankor_Mhy

総合スコア35860

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

think49

2017/05/24 04:08 編集

> object 型をのぞく全ての型は不変 (immutable) な値 (変更することができない値) として定義されています。 new Object(0); は Object 型ですので、その資料によれば「不変 (immutable)ではない」という結論になるのではないでしょうか。
Lhankor_Mhy

2017/05/24 04:58

たしかに、Number型とNumberオブジェクトは別のものですから、Number型がNumberオブジェクトにキャストされた途端にそのプリミティブ値?がイミュータブルではなくなる、という仕様もありえますね。 おっしゃるとおりです。 もっとも、Number型がイミュータブルである、というのも、そもそも仕様に明記されてなかったような…… どこかにありましたっけ?
think49

2017/05/24 05:53 編集

> もっとも、Number型がイミュータブルである、というのも、そもそも仕様に明記されてなかったような…… どこかにありましたっけ? 仰る通り、ES7 仕様では「Number 型が immutable である」とは明記されていません(ES7 で immutable と明記されているのは Symbol 型ぐらいでしょうか) [[NumberData]] が Internal Slots であり、Internal Slots が非公開(ユーザ側で参照不可)な事から、ユーザ側でみれば immutable と判断できると思います。(回答に追記しておきました) 最も、[[NumberData]] を書き換えているビルトイン関数がある可能性はあるので、厳密に immutable であるかはわかりませんが…。 そういう観点では(少なくとも私の理解では)、「Object 型の Primitive 値も immutable である」と思うのですが、MDN では何を持って Object 型だけ除外したのか不明です。 「valueOfプロパティを書き換え可能だから、immutable ではない」と結論付けているのかもしれませんが、内部的には [[NumberData]] が書き換わっていないので、厳密には違うような。
guest

0

プリミティブを書き換えるメソッドは用意されていないようですね

javascript

1var obj = new Object(0); 2obj=new Number(obj+1); 3obj=new Number(++obj); 4console.log(obj);

※インクリメント処理はやめたほうがいいかも

投稿2017/05/24 01:48

yambejp

総合スコア114572

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

coko1

2017/05/24 02:09

用意されていないんですね... 上記のやり方ですとobjのプロパティを拡張しても初期化されてしまいますよね?オブジェクトのプリミティブを書き換えるだけの処理をしたい場合には使いづらいですかね...
guest

0

普通に0 + 1のように加算すれば良いだけでは?

そういうことではなくて?

ご自身でおっしゃっている通り、javascriptの0や1はNumberオブジェクトですし。

投稿2017/05/24 01:44

harashow1701

総合スコア854

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

coko1

2017/05/24 01:52

obj = obj + 1ということですか?
think49

2017/05/24 04:10

> javascriptの0や1はNumberオブジェクトですし。 0 や 1 はNumber型であり、オブジェクトではないと思います。 詳しくは別で回答しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問