Javascriptパターン第3章まで読んで気になったことメモ

# Javascriptパターン ~ 第3章までで気になったことメモ

## "use strict"; の存在
ほえぇそんなものがあったんですね...そしてstringを打ち込むだけなら前のversionだろうと問題なかろうし、うまいなぁと。
ES6ではどうなっているんかなぁと思った所ざっくり次のような感じっぽい。

* Global: not strict
  * Use Strict Directive(Directive Prologue)で付け足し可能
  * Directive Prologue: 関数 or プログラムの先頭にある文字列 + セミコロンの最長部分
  * 今の所特別なDirective Prologueはstrictしかないっぽい。
  * [強そうなサイトには次のような記述があった↓](http://dmitrysoshnikov.com/ecmascript/es5-chapter-2-strict-mode/)

> The meaning of some such directives is special. Currently, ES5 defines only one special directive — already mentioned a Use Strict Directive.

```js
  var x;
  "use strict"; // <= NOT Directive Prologue
``` 

```js
(function(){
  "hogera",// <= FROM Directive Prologue
  "piyo",
  "use strict";// <= TO Directive Prologue
})()
```

英語力が低すぎて[ES6のサイト](http://www.ecma-international.org/ecma-262/6.0/#sec-directive-prologues-and-the-use-strict-directive)から今の所特別なDirective Prologueはstrictしかないってのを読み取れないんだけども、どうなんだろう...
前のバージョンとかであったりしたのかな...

* Module: strict
* Class(ClassDeclaration or a ClassExpression): strict
* eval: not strict
  * Use Strict Directiveで付け足し可能
* Function: not strict
  * 関連するものにstrictなfunctonがあればそれに応じてstrictになる

すんごいざっくりすると多分こんな感じなんだと思う。理解が深くなくてあまり読めんかったが。
今度また読み直そう。


## for loop
言っていることは大概理解できたんだけども、確かに頭いいなって思ったのは次のようなやつ

```js
var a,
    arr = [];
// arrにpushやらなんやら

for(i = arr.length; i--;){
  // 処理
}
```

```js
const arr = [];
let i = 0;
for (let index = 0; index < 10000; index++) {
    arr.push(index);
}

// Test1
const startTime1 = performance.now(); // 開始時間
for (i = arr.length; i--;) {
    // 処理（何もしない）
}
const endTime1 = performance.now(); // 終了時間
console.log(endTime1 - startTime1);

// Test2
const startTime2 = performance.now(); // 開始時間
for (i = 0, max = arr.length; i < max; i++) {
    // 処理（何もしない）
}
const endTime2 = performance.now(); // 終了時間
console.log(endTime2 - startTime2);
```

んで結果が
0.2800000074785203
0.31999999191612005
とりあえず差が出ることはわかった。やっぱ0比較は強いんだろうかねぇ。

## parseInt, Number
今までずっとstring -> numberの時にparseIntを使っていたんだけれど、Number('numberStr')でもいけるらしい。
こっちの方が早いらしいので、さっきのをそれぞれparseInt, Numberの処理を入れてざっくり計測してみたけれど10万くらいになると確かに差が出てくる感じ。

## プリミティブのラッパー
やったことなかったんだけど

```js
var greet = "hello";
greet.smile = true; // <= エラーにならない
greet.slice(0,2); // <= エラーにならない
console.log(greet.smile); // <= undefined
```

sliceとかStringオブジェクトのメソッドを使うときは一旦オブジェクトとして再定義しているらしい。
けどgreet自体がオブジェクトになっているわけではないので、プロパティとか追加してもアクセスはできない。

ほへぇ。

素朴な疑問として、もし毎回stringがStringとしてのsliceやらなんやら使う度にオブジェクトを生成しているのだとしたら、速度としてStringの方でやったほうが早いんじゃないか..？と思うじゃないですか。

```js
const arr = [];
for (let index = 0; index < 100000; index++) {
    arr.push(index.toString());
}
const longPriStr = arr.join("");
const longObjStr = new String(longPriStr);

let i = 0;
// Test1
const startTime1 = performance.now(); // 開始時間
for (i = arr.length; i--;) {
    longPriStr.slice(i, i + 1);
}
const endTime1 = performance.now(); // 終了時間

// Test2
i = 0;
const startTime2 = performance.now(); // 開始時間
for (i = arr.length; i--;) {
    longObjStr.slice(i, i + 1);
}
const endTime2 = performance.now(); // 終了時間
console.log(endTime1 - startTime1);
console.log(endTime2 - startTime2);

```

結果
3.175000019837171
13.64999997895211

めっちゃ遅い。謎。
何かしら別の処理でもなんでもしているのかなぁ...こちらも今度確認せねば。
今回は時間がないのでここまで。