JavaScript(2) - strict mode, variable
JavaScript 관련 포스팅
- JavaScript(1) - async vs. defer
- JavaScript(2) - variable
- JavaScript(3) - operator
- JavaScript(4) - function
- JavaScript(5) - class vs. object
- JavaScript(6) - object
- JavaScript(7) - array
- JavaScript(8) - JSON
- JavaScript(9) - callback
- JavaScript(10) - promise
- JavaScript(11) - Regular expressions
- JavaScript(12) - Prototype과 Class 피하기
- JavaScript(13) - localStorage
1. Strict Mode
- ES(ECMAScript) 5부터 추가됨
- Valina JS 문서가 시작될 때,
'use strict';
를 쓰면 strict mode로 시작 - 보다 상식적인 범위 내에서 코딩이 이루어 질 수 있도록 엄격한 잣대로 코드를 실행
- JS engine이 보다 효율적으로 구동됨
Strict mode - JavaScript | MDN
2. Variable
-
Data types
-
primitive, single item
→ 더 이상 작게 쪼갤 수 없는 한 가지 아이템
→ number, string, boolean, null, undefined, symbol
→ 값(value) 자체가 메모리에 저장됨 -
object, box container
→ single item들을 묶어서 관리하는 것
→ object를 가리키는 reference가 메모리에 저장됨 -
function
※ first-class function
→ variable에 할당 가능
→ 다른 함수의 parameter로 전달이 가능
→ return 값으로 지정 가능
-
-
Immutable/Mutable data types
-
Immutable data types
→ data 자체 변경 불가
→ primitive types, frozen objects (i.e. object.freeze()) -
Mutable data types
→ data 변경 가능
→ all objects by default are mutable in JS
-
let
→ ES6에서 추가됨
→ var는 이제 사용하지 말 것!
var hoisting
변수의 선언 지점과 상관없이, JS engine이 선언을 맨 위로 끌어올림
→ var는 block scope가 적용되지 않음
→ block 안에 있는 변수를 block 바깥에서도 부를 수 있는 상황이 발생함
※참고: Variable hoisting - JavaScript | MDN
{
age = 4;
var age;
}
console.log(age);
Console
4
global variable vs. local variable
- global variable
→ 함수의 바깥에 선언한 변수
→ 문서 전체에서 사용 가능함 - local variable
→ 함수의 안에 선언한 변수
→ 함수 안에서만 사용 가능함 (block scope)
※참고: Variable scope - JavaScript | MDN
number
- JS에서는 숫자의 data type과 상관없이 number type으로 할당됨
const count = 17; // integer const size = 17.1; // decimal number console.log(`value: ${count}, type: ${typeof count}`); console.log(`value: ${size}, type: ${typeof size}`);
Console
value: 17, type: number
value: 17.1, type: number
- 양수를 0으로 나누면 infinity
음수를 0으로 나누면 negative infinity
숫자가 아닌 것을 숫자로 나누면 NaN(not a number)
string
- 글자는 수에 상관 없이 모두 string으로 할당됨
+
기호를 사용해 다른 변수와 붙일 수 있음
const brendan = "brendan";
const greeting = "hello " + brendan;
console.log(`value: ${greeting}, type: ${typeof greeting}`);
Console
value: hello brendan, type: string
-
template literals (string literals)
→ `(backtick)을 이용해 string과 ${variable} 을 써주면 결과 값이 붙여져 나옴
→ ‘ ‘(quotes)와+
를 쓰는 것보다 편리함const helloBob = `hi ${brendan}!`; // template literals (template string) console.log(`value: ${helloBob}, type: ${typeof helloBob}`); console.log("value: " + helloBob + ", type: " + typeof helloBob);
consol
value: hi brendan!, type: string
value: hi brendan!, type: string
boolean
- false: 0, null, undefined, NaN, ‘ ‘
-
true: any other value
const canRead = true; const test = 3 < 1; // false console.log(`value: ${canRead}, type: ${typeof canRead}`); console.log(`value: ${test}, type: ${typeof test}`);
consol
value: true, type: boolean
value: false, type: boolean
null / undefined
- null로 할당하면 아무런 값도 없다는 것을 명시하는 것
- undefined로 지정하거나 아무 것도 지정하지 않으면, 선언은 되었지만 값이 정해지지 않은 상황
// null
let nothing = null;
console.log(`value: ${nothing}, type: ${typeof nothing}`);
// undefined
let x = undefined; // let x; 도 같은 뜻
console.log(`value: ${x}, type: ${typeof x}`);
consol
value: null, type: object
value: undefined, type: undefined
symbol
// symbol, create unique identifiers for objects
const symbol1 = Symbol("id");
const symbol2 = Symbol("id");
console.log(symbol1 === symbol2);
const gSymbol1 = Symbol.for("id");
const gSymbol2 = Symbol.for("id");
console.log(gSymbol1 === gSymbol2); // true
consol
false
true
※ .description을 이용해 string으로 변환한 뒤, 출력해야 함!
console.log(`value: ${symbol1}, type: ${typeof symbol1}`); // error!
console.log(`value: ${symbol1.description}, type: ${typeof symbol1}`);
console
Uncaught TypeError: Cannot convert a Symbol value to a string at ~
value: id, type: symbol
object
object 문서 연결하기!
3. Constant
const
- 가능하면 const로 선언하는 것이 좋음
- block scope (like let)
let은 mutable(변경 가능), const는 immutable(변경 불가) data type - reassignment(재할당)로 값이 바뀌거나, redeclare(재선언) 불가
- 장점
- 보안상 좋음
- 다양한 threads의 동시 접속으로 변수 값 변경이 일어나는 것을 방지
- 코드 변경시 실수를 줄여줌
4. Dynamic typing
- JS = dynamically typed language
→ run time 동안 할당된 값에 따라 data type 변화됨 - C, JAVA = statically typed language
→ 변수 선언시 data type 명시 필요let text = "hello"; console.log(text.charAt(0)); // h console.log(`value: ${text}, type: ${typeof text}`); text = 1; console.log(`value: ${text}, type: ${typeof text}`); text = "7" + 5; console.log(`value: ${text}, type: ${typeof text}`); text = "8" / "2"; console.log(`value: ${text}, type: ${typeof text}`); console.log(text.charAt(0));
console
h
value: hello, type: string
value: 1, type: number
value: 75, type: string
value: 4, type: number
Uncaught TypeError: text.charAt is not a function at ~
→ string과 숫자가 합쳐지면 string이 되고,
숫자로 이루어진 string끼리의 연산이 이루어지면 number가 되는 오류 발생
(→ TS(typescript)가 나오게 되는 계기)
출처: “자바스크립트 3. 데이터타입, data types, let vs var, hoisting 프론트엔드 개발자 입문편 (JavaScript ES5+),” 유튜브 비디오, 27:58, 게시자 “드림코딩 by 엘리,” 2020년 4월 11일, https://youtu.be/tJieVCgGzhs