62669
Angular(stable v8.2.9)のチュートリアル[入門 - ルーティング - ルーティング情報を使う -
セクション3](https://angular.jp/start/routing#%E3%83%AB%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0%E6%83%85%E5%A0%B1%E3%82%92%E4%BD%BF%E3%81%86)をさらっています。下記のソースコードが載っているのですが、３行目の"+"はどういう意味があるのでしょうか。  
"+"を除いてもうまく動作しているように見えます。

```

    ngOnInit() {
      this.route.paramMap.subscribe(params => {
        this.product = products[+params.get('productId')];
      });
    }
    
```

「配列、インデックス」に加えて、演算子、アノテーションなどで調べてみたのですがよくわからず…。"+"にはどういう効果・意味があるのか、お教えいただけませんでしょうか。
CC BY-SA 4.0
2020-01-30T16:56:50.460
62667
2020-09-12T11:41:12.993
2020-09-12T11:41:12.993
32986
15462
question
typescript angular
TypeScriptの配列インデックスにある"+"(プラス記号)は何を表す？
おそらくですが、number型へのcast(変換)です。

```

    // 文字列の前に + を付けるとnumber型が返る
    const str = '0';
    const num = +'0';
    
    console.log(str + 1);
    console.log(num + 1);
```

例えば他にも以下のような方法があります。

JavaScriptにおける数値⇔文字列の型変換あれこれ - console.lealog();  
<https://lealog.hateblo.jp/entry/2013/02/28/005010>

>
```

>     var str = '123';
>  
>     +str; // 123
>     -(-str); // 123
>     ~~str; // 123
>     str&-1; // 123
>     str|0; // 123
>     str^0; // 123
>     str>>0; // 123
>     str<<0; // 123
>  
```

余談ですが、ビット演算によるnumber型への変換の場合、結果が32bitの整数になることに注意してください。

```

    console.log(+'1.10');
    
    console.log(~~'1.10');
    console.log('1.10'&-1);
    console.log('1.10'|0);
    console.log('1.10'^0);
    
    console.log('1.10' >> 0);
    console.log('1.10' << 0);
    
    console.log('1.10' >>> 0);
```

32bitの範囲を超える数値の場合、意図しない結果になります。

```

    console.log('2147483647' | 0);
    console.log('2147483648' | 0);
    
    console.log('2147483647' >> 0);
    console.log('2147483648' >> 0);
    
    console.log('4294967295' >>> 0);
    console.log('4294967296' >>> 0);
```

ビット演算子 - JavaScript | MDN  
<https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Bitwise_Operators>
CC BY-SA 4.0
2020-01-30T17:04:57.163
62669
2020-01-30T19:33:18.970
2020-01-30T19:33:18.970
3068
3068
62667
answer
MDN では **単項正値演算子** という名称で説明されていました。  
[#単項演算子 式と演算子 - JavaScript |
MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators#Unary_operators)

この演算子が文字列に対して使用された場合、

  * 数値に変換可能な文字列であった場合は数値
  * 数値に変換不可能であった場合は [`NaN`](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/NaN)

に変換されます。

また、[#数値 JavaScript 「再」入門 - JavaScript |
MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/A_re-
introduction_to_JavaScript#Numbers)では、  
[`parseInt()`](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/parseInt)
や
[`parseFloat()`](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/parseFloat)
との違いが説明されており、

> parseInt() および parseFloat()
> 関数は文字列を、規定の数値書式に該当しない文字が現れるまで解析し、その箇所までの数値を返します。一方、"+" 演算子は適切でない文字を含む文字列を
> NaN に変換します。

と書かれています。  
実際に以下の様に実行することで違いが分かります。

```

    console.log(parseInt("10.2abc"));   // 10
    console.log(parseFloat("10.2abc")); // 10.2
    console.log(+"10.2abc");            // NaN
```
CC BY-SA 4.0
2020-07-02T03:31:43.927
68208
2020-07-02T20:58:59.993
2020-07-02T20:58:59.993
40900
40900
62667
answer