回答編集履歴

1 追記

Lhankor_Mhy

Lhankor_Mhy score 23684

2015/09/20 19:45  投稿

あまり自信がないのですが。
> threeもobjectだと思うのですが、なぜ評価値は3と表示されるのでしょうか?
数値リテラルは The Number Type だと思います。
[http://www.ecma-international.org/ecma-262/5.1/#sec-8.5](http://www.ecma-international.org/ecma-262/5.1/#sec-8.5)
> numの型がなぜobjectなのに、threeはnumberになるのでしょうか?
new Number () によって生成されると Number Objects になり、リテラルだと The Number Type になるのではないでしょうか。
[http://www.ecma-international.org/ecma-262/5.1/#sec-11.4.3](http://www.ecma-international.org/ecma-262/5.1/#sec-11.4.3)
[http://www.ecma-international.org/ecma-262/5.1/#sec-15.7.2.1](http://www.ecma-international.org/ecma-262/5.1/#sec-15.7.2.1)
> numの評価値をNumber {[[PrimitiveValue]]: 3}ではなく、5など特定の値を返すようにするにはどうすればいいでしょうか?
プリミティブ化には .valueOf () メソッドが用意されているかと思います。
[http://www.ecma-international.org/ecma-262/5.1/#sec-15.7.4.4](http://www.ecma-international.org/ecma-262/5.1/#sec-15.7.4.4)
こちらのブログが参考になるかもしれません。
[valueOfとtoStringとToPrimitive - os0x.blog ](http://os0x.hatenablog.com/entry/20100916/1284650917)
[valueOfとtoStringとToPrimitive - os0x.blog ](http://os0x.hatenablog.com/entry/20100916/1284650917)
コメントを受けて追記します。
> 具体的にはhp={start: 10, glow: 3}というオブジェクトで、ステータスの初期値と成長値をhp.start、hp.glowで取得するようにします。そして、hpとしただけだと、他の変数で管理しているレベルとstartとglowで計算した現在のステータスを表示させるようにしたいです。
> threeの用にプリミティブ値を自分で作れればできるのではないかなと思いました。Number.prototypeに追加すると他の部分数値を扱うところにも影響が出てしまうので、何か別の方法が見つかれば幸いです。
それは無理かと思います。
たとえば、
```javascript
(1).toString(); // "1"
```
このような結果のため、1 というプリミティブに toString メソッドが存在するかのように見えますが、仕様を見ますと分かりますとおり、プリミティブに対する[[Get]]内部メソッドの処理の1番目に、
> Let O be ToObject(base)
[http://www.ecma-international.org/ecma-262/5.1/#sec-8.7.1](http://www.ecma-international.org/ecma-262/5.1/#sec-8.7.1)
とありますから、実際にはNumberオブジェクトに型キャストされているのだと思います。
つまり、プリミティブな 3 を取り扱いたいならそれはNumberオブジェクトではありませんからプロパティやメソッドを持てず、逆にプロパティやメソッドを持っているならそれはプリミティブではない、と考えていいのだと思うのです。
こちらのブログが参考になるかもしれません。
[プリミティブはオブジェクトじゃないし、プリミティブと参照なんて区別はない - uokumura’s diary](http://uokumura.hatenablog.com/entry/20090614/1245016857)

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る