Modern Javascript

## 모던 자바스크립트를 사용할수 있다

```javascript:filename.js
"use strict";
/*일반적으로 변수를 사용하기 전에 변수를 정의해야합니다. 그러나 예전에는 값을 할당하지 않고 변수를 생성하는 것이 기술적으로 가능했습니다 let변수는 우리가하지 않으면 여전히 작동합니다 */
// note: no "use strict" in this example

num = 5; // the variable "num" is created if didn't exist
alert(num); // 5

"use strict";
num = 5; // error: num is not defined
```
## 변수사용

```javascript:filename.js
    // 변수사용
    let user = 'john';
    let age = '38';
    let message = 'hello';

    // 변형1
    let user = 'john',
        age = '38',
        message = 'hello';

    // 변형2
    let user = 'john',age = '38',message = 'hello';

    // 가독성과 개인의 취향 미학적인 면에서 선택사용
    
    // var 변수도 있고 차이가 있지만 let 변수 사용 추천
```

## 상수 사용

```javascript:filename.js
    // 상수사용
    // 상수를 사용할때는 변경되지 않는다는 가정하에 사용해야한다.
    const myBirthday = '18.04.1982';
    myBirthday = '01.01.2001'; // 위와같은 경우 에러가 발생합니다. 선언된값과 틀립니다.

    const pageLoadTime = /* time taken by a webpage to load */;
    // pageLoadTime 는 상수이지만 페이지 로딩타임으로 값자체는 변할수 있다\
    // 하지만 이것은 같은값을 의미하무로 상수이다.

    let   /* 현대 변수 선언입니다. let변수는 Chrome (V8)에서 사용하려면 코드가 "use strict" 여야합니다 .*/
    var   /* 구식 변수 선언입니다. 일반적으로 우리는 그것을 전혀 사용하지 않지만 사용해야 하는 경우가 있다.*/
    const /* let같지만 변수 값을 변경할 수 없습니다.*/
    // 변수의 이름은 내부 내용을 쉽게 이해할 수 있도록 지정해야합니다. 
```

## 세미콜론

```javascript:filename.js
  alert("There will be an error")
    [1, 2].forEach(alert)
    // error

    alert("All fine now");
    [1, 2].forEach(alert)    
    // 문자열 과 1번 2번 alert를 보여준다. 
    // 세미콜론이 아닌 변형은 JavaScript가 대괄호 앞에 세미콜론을 포함하지 않으므로 발생합니다 [...]

    alert("There will be an error")[1, 2].forEach(alert) // error 별개의 2문장이어야 한다.
```
## true 2번나옴

```javascript:filename.js
    // bool
    function checkAge(age) {
        if(age > 18) {
            return true;
        } else {
            return confirm('got a permition from the parents?');
        }
    }
    let age = prompt('how old are you',18);
    if(checkAge(age)) {
        alert('Access granted');
    }else {
        alert('Access denied');
    }
```
## 문자열변환

```javascript:filename.js
let value = true;
alert(typeof value); // boolean

value = String(value); // 값은 문자열 value 이고 true이다.
alert(typeof value); // 문자열
```

## 숫자변환
```javascript:filename.js
alert( "6" / "2" ); // 3, 문자열이 연산자가 삽입되면서 숫자로 변환되었다
-----------------------------------------------------------------
let str = "123"; // 문자열
alert(typeof str); // 문자열
let num = Number(str); // 문자열에서 숫자로 변환
alert(typeof num); // 숫자
-----------------------------------------------------------------
let age = Number("an arbitrary string instead of a number");
alert(age); // NaN, conversion failed
-----------------------------------------------------------------
//숫자열+숫자열=숫자열, 숫자열+문자열=문자열
alert( 1 + '2' ); // '12' (string to the right)
alert( '1' + 2 ); // '12' (string to the left)
```
## true or false

```javascript:filename.js
alert( Boolean(1) ); // true
alert( Boolean(0) ); // false

alert( Boolean("hello") ); // true
alert( Boolean("") ); // false


alert( Boolean("0") ); // true
alert( Boolean(" ") ); // true 공백문자로 인식되어 true를 반환한다
```

## 유형변환 연습

```javascript:filename.js
"" + 1 + 0    // "10" 
"" - 1 + 0    // -1        
true + false  // 1        //숫자로 변환뒤 계산
6 / "3"       // 2
"2" * "3"     // 6
4 + 5 + "px"  // "9px"     
"$" + 4 + 5   // "$45"
"4" - 2       // 2         // 뺄셈은 문자열이 숫자로 변환뒤 계산
"4px" - 2     // NaN    
7 / 0         // Infinity
"  -9\n" + 5  // " -9\n5"       
"  -9\n" - 5  // -14        /
null + 1      // 1          // 숫자값으로 변환후 덧셈
undefined + 1 // NaN        // undefined NaN 넘버로 변환 후 덧셈
```