回答編集履歴

7 typo修正

think49

think49 score 16966

2015/09/28 12:44  投稿

> 0. trheeもobjectだと思うのですが、なぜ評価値は 3 と表示されるのでしょうか?
`three` は Number 型であり、Object 型ではない為です。
> 0. num の型がなぜ object なのに、three は number になるのでしょうか?
`num` は Object 型ですが、「`three`は`number`になる」の意味が分かりませんでした。
補足をお願いします。
> 0. num の評価値を Number {[[PrimitiveValue]]: 3} ではなく、5 など特定の値を返すようにするにはどうすればいいでしょうか?
`Number {[[PrimitiveValue]]: 3}` はどこから出てきたのでしょう?
質問者さんの期待する評価値を算出する方法はどのようなものでしょうか。
---
**(2015/09/21 07:59追記)**
> "typeof num"を実行した場合は"number"が、"typeof three"の場合は"object"と表示されます。これはNumberがプリミティブ値"Number"のラッパーオブジェクトということでしょうか?
> しかし、threeがプリミティブなのにNumber型のメソッドが使えるのが不思議です。
Number 型などのいわゆる Premitive 型はプロパティアクセス演算子を使用する時には内部的にプリミティブラッパーオブジェクトに変換される為、Object 型のような振る舞いが可能です。
> "num"と打つと、評価値としてNumber {[[PrimitiveValue]]: 3}が返りました。これを別の表示にしたいです。
> 具体的にはhp={start: 10, glow: 3}というオブジェクトで、ステータスの初期値と成長値をhp.start、hp.glowで取得するようにします。そして、hpとしただけだと、他の変数で管理しているレベルとstartとglowで計算した現在のステータスを表示させるようにしたいです。
Primitive 型が Object 型のように振舞うのは内部仕様で定められている部分なので Primitive 値をユーザ定義することは不可能ですが、Object 型なら可能です。
```JavaScript
var hp = {start: 10,
         glow: 3,
         valueOf: function () { return this.start + this.glow; },
         toString: function () { return String(this.valueOf()); }};
String(hp); // "13"
Number(hp); // 13
```
**(2015/09/22 10:26追記)**
> DateがStringを自動で返すのもまた内部仕様ですね。
`Date()` が返すのは `new Date().toString()`ですので通常の String 型です。
つまり、`String.prototype` のメソッドは使えますが、`Date.prototype` のメソッドは使えません。
> valueOfだと値を取得するときに、Number(13)とオブジェクト化をしないといけないので別変数で扱いたいと思います。
ECMAScript のネイティブ関数では関数の引数に期待する方がある場合、対象をキャスト(型変換)しています。
ECMAScript のネイティブ関数では関数の引数に期待する型がある場合、対象をキャスト(型変換)しています。
例えば、`String.prototype.replace` の第一引数は対象が正規表現オブジェクトでなければ String 型にキャストする仕様です。
従って下記コードは期待通りに動作するのです。
```JavaScript
var hp = {start: 10,
         glow: 3,
         valueOf: function () { return this.start + this.glow; },
         toString: function () { return String(this.valueOf()); }};
'hoge13'.replace(hp, '14'); // "hoge14"
```
`new Date()` も同様の性質を持つ為、私はこちらの動作を期待しているものだと認識していました。
`Date()` の方は上述の通り、単純な String 型なので期待する動作とは異なるように思います。
ユーザ定義関数についても同じように引数をキャストしてやれば、期待通りに動作するはずです。
6 表現がくどかったのを修正

think49

think49 score 16966

2015/09/22 10:29  投稿

> 0. trheeもobjectだと思うのですが、なぜ評価値は 3 と表示されるのでしょうか?
`three` は Number 型であり、Object 型ではない為です。
> 0. num の型がなぜ object なのに、three は number になるのでしょうか?
`num` は Object 型ですが、「`three`は`number`になる」の意味が分かりませんでした。
補足をお願いします。
> 0. num の評価値を Number {[[PrimitiveValue]]: 3} ではなく、5 など特定の値を返すようにするにはどうすればいいでしょうか?
`Number {[[PrimitiveValue]]: 3}` はどこから出てきたのでしょう?
質問者さんの期待する評価値を算出する方法はどのようなものでしょうか。
---
**(2015/09/21 07:59追記)**
> "typeof num"を実行した場合は"number"が、"typeof three"の場合は"object"と表示されます。これはNumberがプリミティブ値"Number"のラッパーオブジェクトということでしょうか?
> しかし、threeがプリミティブなのにNumber型のメソッドが使えるのが不思議です。
Number 型などのいわゆる Premitive 型はプロパティアクセス演算子を使用する時には内部的にプリミティブラッパーオブジェクトに変換される為、Object 型のような振る舞いが可能です。
> "num"と打つと、評価値としてNumber {[[PrimitiveValue]]: 3}が返りました。これを別の表示にしたいです。
> 具体的にはhp={start: 10, glow: 3}というオブジェクトで、ステータスの初期値と成長値をhp.start、hp.glowで取得するようにします。そして、hpとしただけだと、他の変数で管理しているレベルとstartとglowで計算した現在のステータスを表示させるようにしたいです。
Primitive 型が Object 型のように振舞うのは内部仕様で定められている部分なので Primitive 値をユーザ定義することは不可能ですが、Object 型なら可能です。
```JavaScript
var hp = {start: 10,
         glow: 3,
         valueOf: function () { return this.start + this.glow; },
         toString: function () { return String(this.valueOf()); }};
String(hp); // "13"
Number(hp); // 13
```
**(2015/09/22 10:26追記)**
> DateがStringを自動で返すのもまた内部仕様ですね。
`Date()` が返すのは `new Date().toString()`ですので通常の String 型です。
つまり、`String.prototype` のメソッドは使えますが、`Date.prototype` のメソッドは使えません。
> valueOfだと値を取得するときに、Number(13)とオブジェクト化をしないといけないので別変数で扱いたいと思います。
ECMAScript のネイティブ関数では関数の引数に期待する方がある場合、対象をキャスト(型変換)しています。
例えば、`String.prototype.replace` の第一引数は対象が正規表現オブジェクトでなければ String 型にキャストする仕様です。
従って下記コードは期待通りに動作するのです。
```JavaScript
var hp = {start: 10,
         glow: 3,
         valueOf: function () { return this.start + this.glow; },
         toString: function () { return String(this.valueOf()); }};
'hoge13'.replace(hp, '14'); // "hoge14"
```
`new Date()` も同様の性質を持つ為、私はこちらの動作を期待しているものだと認識していました。
`Date()` の方は上述の通り、単純な String 型なので期待する動作とは異なるように思います。
ユーザ定義関数についても同じように引数をキャストしてやれば、期待通りに動作するようになるはずです。
ユーザ定義関数についても同じように引数をキャストしてやれば、期待通りに動作するはずです。
5 暗黙の型変換

think49

think49 score 16966

2015/09/22 10:26  投稿

> 0. trheeもobjectだと思うのですが、なぜ評価値は 3 と表示されるのでしょうか?
`three` は Number 型であり、Object 型ではない為です。
> 0. num の型がなぜ object なのに、three は number になるのでしょうか?
`num` は Object 型ですが、「`three`は`number`になる」の意味が分かりませんでした。
補足をお願いします。
> 0. num の評価値を Number {[[PrimitiveValue]]: 3} ではなく、5 など特定の値を返すようにするにはどうすればいいでしょうか?
`Number {[[PrimitiveValue]]: 3}` はどこから出てきたのでしょう?
質問者さんの期待する評価値を算出する方法はどのようなものでしょうか。
---
**(2015/09/21 07:59追記)**
> "typeof num"を実行した場合は"number"が、"typeof three"の場合は"object"と表示されます。これはNumberがプリミティブ値"Number"のラッパーオブジェクトということでしょうか?
> しかし、threeがプリミティブなのにNumber型のメソッドが使えるのが不思議です。
Number 型などのいわゆる Premitive 型はプロパティアクセス演算子を使用する時には内部的にプリミティブラッパーオブジェクトに変換される為、Object 型のような振る舞いが可能です。
> "num"と打つと、評価値としてNumber {[[PrimitiveValue]]: 3}が返りました。これを別の表示にしたいです。
> 具体的にはhp={start: 10, glow: 3}というオブジェクトで、ステータスの初期値と成長値をhp.start、hp.glowで取得するようにします。そして、hpとしただけだと、他の変数で管理しているレベルとstartとglowで計算した現在のステータスを表示させるようにしたいです。
Primitive 型が Object 型のように振舞うのは内部仕様で定められている部分なので Primitive 値をユーザ定義することは不可能ですが、Object 型なら可能です。
```JavaScript
var hp = {start: 10,
         glow: 3,
         valueOf: function () { return this.start + this.glow; },
         toString: function () { return String(this.valueOf()); }};
String(hp); // "13"
Number(hp); // 13
```
```
**(2015/09/22 10:26追記)**
> DateがStringを自動で返すのもまた内部仕様ですね。
`Date()` が返すのは `new Date().toString()`ですので通常の String 型です。
つまり、`String.prototype` のメソッドは使えますが、`Date.prototype` のメソッドは使えません。
> valueOfだと値を取得するときに、Number(13)とオブジェクト化をしないといけないので別変数で扱いたいと思います。
ECMAScript のネイティブ関数では関数の引数に期待する方がある場合、対象をキャスト(型変換)しています。
例えば、`String.prototype.replace` の第一引数は対象が正規表現オブジェクトでなければ String 型にキャストする仕様です。
従って下記コードは期待通りに動作するのです。
```JavaScript
var hp = {start: 10,
         glow: 3,
         valueOf: function () { return this.start + this.glow; },
         toString: function () { return String(this.valueOf()); }};
'hoge13'.replace(hp, '14'); // "hoge14"
```
`new Date()` も同様の性質を持つ為、私はこちらの動作を期待しているものだと認識していました。
`Date()` の方は上述の通り、単純な String 型なので期待する動作とは異なるように思います。
ユーザ定義関数についても同じように引数をキャストしてやれば、期待通りに動作するようになるはずです。
4 セミコロン追記

think49

think49 score 16966

2015/09/21 08:04  投稿

> 0. trheeもobjectだと思うのですが、なぜ評価値は 3 と表示されるのでしょうか?
`three` は Number 型であり、Object 型ではない為です。
> 0. num の型がなぜ object なのに、three は number になるのでしょうか?
`num` は Object 型ですが、「`three`は`number`になる」の意味が分かりませんでした。
補足をお願いします。
> 0. num の評価値を Number {[[PrimitiveValue]]: 3} ではなく、5 など特定の値を返すようにするにはどうすればいいでしょうか?
`Number {[[PrimitiveValue]]: 3}` はどこから出てきたのでしょう?
質問者さんの期待する評価値を算出する方法はどのようなものでしょうか。
---
**(2015/09/21 07:59追記)**
> "typeof num"を実行した場合は"number"が、"typeof three"の場合は"object"と表示されます。これはNumberがプリミティブ値"Number"のラッパーオブジェクトということでしょうか?
> しかし、threeがプリミティブなのにNumber型のメソッドが使えるのが不思議です。
Number 型などのいわゆる Premitive 型はプロパティアクセス演算子を使用する時には内部的にプリミティブラッパーオブジェクトに変換される為、Object 型のような振る舞いが可能です。
> "num"と打つと、評価値としてNumber {[[PrimitiveValue]]: 3}が返りました。これを別の表示にしたいです。
> 具体的にはhp={start: 10, glow: 3}というオブジェクトで、ステータスの初期値と成長値をhp.start、hp.glowで取得するようにします。そして、hpとしただけだと、他の変数で管理しているレベルとstartとglowで計算した現在のステータスを表示させるようにしたいです。
Primitive 型が Object 型のように振舞うのは内部仕様で定められている部分なので Primitive 値をユーザ定義することは不可能ですが、Object 型なら可能です。
```JavaScript
var hp = {start: 10,
         glow: 3,
         valueOf: function () { return this.start + this.glow },
         valueOf: function () { return this.start + this.glow; },
         toString: function () { return String(this.valueOf()); }};
String(hp); // "13"
Number(hp); // 13
```
3 markdownで引用文が機能するように

think49

think49 score 16966

2015/09/21 08:00  投稿

> 0. `trhee`もobjectだと思うのですが、なぜ評価値は`3`と表示されるのでしょうか?
> 0. trheeもobjectだと思うのですが、なぜ評価値は 3 と表示されるのでしょうか?
`three` は Number 型であり、Object 型ではない為です。
> 0. `num`の型がなぜobjectなのに、`three`は`number`になるのでしょうか?
> 0. num の型がなぜ object なのに、three は number になるのでしょうか?
`num` は Object 型ですが、「`three`は`number`になる」の意味が分かりませんでした。
補足をお願いします。
> 0. `num`の評価値を`Number {[[PrimitiveValue]]: 3}`ではなく、5など特定の値を返すようにするにはどうすればいいでしょうか?
> 0. num の評価値を Number {[[PrimitiveValue]]: 3} ではなく、5 など特定の値を返すようにするにはどうすればいいでしょうか?
`Number {[[PrimitiveValue]]: 3}` はどこから出てきたのでしょう?
質問者さんの期待する評価値を算出する方法はどのようなものでしょうか。
---
**(2015/09/21 07:59追記)**
> "typeof num"を実行した場合は"number"が、"typeof three"の場合は"object"と表示されます。これはNumberがプリミティブ値"Number"のラッパーオブジェクトということでしょうか?
> しかし、threeがプリミティブなのにNumber型のメソッドが使えるのが不思議です。
Number 型などのいわゆる Premitive 型はプロパティアクセス演算子を使用する時には内部的にプリミティブラッパーオブジェクトに変換される為、Object 型のような振る舞いが可能です。
> "num"と打つと、評価値としてNumber {[[PrimitiveValue]]: 3}が返りました。これを別の表示にしたいです。
> 具体的にはhp={start: 10, glow: 3}というオブジェクトで、ステータスの初期値と成長値をhp.start、hp.glowで取得するようにします。そして、hpとしただけだと、他の変数で管理しているレベルとstartとglowで計算した現在のステータスを表示させるようにしたいです。
Primitive 型が Object 型のように振舞うのは内部仕様で定められている部分なので Primitive 値をユーザ定義することは不可能ですが、Object 型なら可能です。
```JavaScript
var hp = {start: 10,
         glow: 3,
         valueOf: function () { return this.start + this.glow },
         toString: function () { return String(this.valueOf()); }};
String(hp); // "13"
Number(hp); // 13
```
2 プリミティブラッパーオブジェクトについて

think49

think49 score 16966

2015/09/21 07:59  投稿

> 0. `trhee`もobjectだと思うのですが、なぜ評価値は`3`と表示されるのでしょうか?
`three` は Number 型であり、Object 型ではない為です。
> 0. `num`の型がなぜobjectなのに、`three`は`number`になるのでしょうか?
`num` は Object 型ですが、「`three`は`number`になる」の意味が分かりませんでした。
補足をお願いします。
> 0. `num`の評価値を`Number {[[PrimitiveValue]]: 3}`ではなく、5など特定の値を返すようにするにはどうすればいいでしょうか?
`Number {[[PrimitiveValue]]: 3}` はどこから出てきたのでしょう?
質問者さんの期待する評価値を算出する方法はどのようなものでしょうか。
質問者さんの期待する評価値を算出する方法はどのようなものでしょうか。
---
**(2015/09/21 07:59追記)**
> "typeof num"を実行した場合は"number"が、"typeof three"の場合は"object"と表示されます。これはNumberがプリミティブ値"Number"のラッパーオブジェクトということでしょうか?
> しかし、threeがプリミティブなのにNumber型のメソッドが使えるのが不思議です。
Number 型などのいわゆる Premitive 型はプロパティアクセス演算子を使用する時には内部的にプリミティブラッパーオブジェクトに変換される為、Object 型のような振る舞いが可能です。
> "num"と打つと、評価値としてNumber {[[PrimitiveValue]]: 3}が返りました。これを別の表示にしたいです。
> 具体的にはhp={start: 10, glow: 3}というオブジェクトで、ステータスの初期値と成長値をhp.start、hp.glowで取得するようにします。そして、hpとしただけだと、他の変数で管理しているレベルとstartとglowで計算した現在のステータスを表示させるようにしたいです。
Primitive 型が Object 型のように振舞うのは内部仕様で定められている部分なので Primitive 値をユーザ定義することは不可能ですが、Object 型なら可能です。
```JavaScript
var hp = {start: 10,
         glow: 3,
         valueOf: function () { return this.start + this.glow },
         toString: function () { return String(this.valueOf()); }};
String(hp); // "13"
Number(hp); // 13
```
1 文体修正

think49

think49 score 16966

2015/09/19 19:57  投稿

> 0. `trhee`もobjectだと思うのですが、なぜ評価値は`3`と表示されるのでしょうか?
`three` は Number 型であり、Object 型ではない為です。
> 0. `num`の型がなぜobjectなのに、`three`は`number`になるのでしょうか?
`num` は Object 型ですが、「`three`は`number`になる」の意味が分かりませんでした。
補足をお願いします。
> 0. `num`の評価値を`Number {[[PrimitiveValue]]: 3}`ではなく、5など特定の値を返すようにするにはどうすればいいでしょうか?
`Number {[[PrimitiveValue]]: 3}` はどこから出てきたのでしょう?
評価値を算出する方法が分かりません。
質問者さんの期待する評価値を算出する方法はどのようなものでしょうか。

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