SlideShare a Scribd company logo
You don't know JS
Cardoc Dev.Intern 김정규
후기.
JS는 적당히 알기는 정말 쉽다. 그러나 완전히 알기는 어렵다.
타입
값
네이티브
강제변환
문법
스코프
렉시컬 스코프
함수 vs 블록 스코프
호이스팅
스코프 클로저
JS는 적당히 알기는 정말 쉽다. 그러나 완전히 알기는 어렵다.
타입
값
네이티브
강제변환
문법
스코프
렉시컬 스코프
함수 vs 블록 스코프
호이스팅
스코프 클로저
자바 스크립트에서 타입이란 말의 의미는 무엇일
까?
자바 스크립트에서 타입이란 말의 의미는 무엇일
까?
타입과 자료형의 차이는 무엇일까?
Javascript의 다양한 타입
그래서... typeof 라는 안전 가드
예를 들어.
예외 존재.
바로 Null 과 Function
나는 변수를 선언한적 없는데...
Cardoc 의 monitor 프로젝트를 비춰보면...?
값
값
배열
문자열
숫자
특수 값
값 VS 레퍼런스
배열
문자열
숫자
특수 값
값 VS 레퍼런스
숫자
- toFixed( ) vs toPrecision( )
- Number.EPSILON
- Number.MAX_SAFE_INTEGER
- Number.isInteger( )
- Number.isSafeInteger( )
- A | 0 ?
숫자
- toFixed( ) vs toPrecision( )
숫자
- Number.EPSILON
0.1 + 0.3 === 0.4 ?
Number.EPSILON = Math.pow(2,-52);
숫자
- Number.MAX_SAFE_INTEGER
Number.MAX_VALUE := 1.7976931348623157e+308
Number.MAX_SAFE_INTEGER ?
숫자
- Number.isInteger( )
- Number.isSafeInteger( )
Number.MAX_VALUE := 1.7976931348623157e+308
Number.MAX_SAFE_INTEGER := 2^53-1
숫자
숫자
A | 0
Any Integer -> 32비트 부호있는 정수
특수 값
값 아닌 값
Undefined
Void
-0
+0
-Infinity
+Infinity
특수 값
값 VS 레퍼런스
"자바스크립트는 포인터라는 개념 자체가 없고 참조하는 방법도 조금 다르다. 우선 어떤 변수가 다른 변수를 참조할 수 없다.
그냥 안된다.
더구나 자바스크립트에는 값 또는 레퍼런스의 할당 및 전달을 제어하는 구문 암시(Syntactic Hint)가 전혀 없다.
대신, 값의 타입만으로 값-복사, 레퍼런스-복사 둘 중 한쪽이 결정된다."
- 카일 심슨의 You don't know JS
네? 타입으로 결정한다?
값 VS 레퍼런스
강제변환
강제변환
어떤 값을 다른 타입의 값으로 바꾸는 과정이 명시적이면 '타입 캐스팅'
(값이 사용되는 규칙에 따라) 암시적이면 '강제변환(Coercion)이라고 한다.
또는
'타입 캐스팅'은 정적 타입언어에서 컴파일 시점에,
'강제변환'은 동적 타입 언어에서 런타임 시점에 발생한다.
그러나 자바스크립트에서는
대부분 모든 유형의 타입변환을 강제변환으로 뭉뚱그려 일컫는 경향이 있어서,
여기서는 '암시적 강제변환'과 '명시적 강제변환' 두 가지로 구별한다.
강제변환
Ok. 명시적 형변환 필요해!
'명시적:암시적 = 명백한 : 숨겨진 부수 효과'
그럼 왜 암시적인 형변환이 필요한 걸까?
자 더글라스 크락포드 는 자바스크립트 강제변환은 반드시 피해야 한다고 말한다. 그렇게 말하지만
다시 물어보자. 암시적 강제변환은 위험한 것일까?
암시적 강제변환의 목적은 중요한 내용으로부터
주의를 분산시켜 코드를 잡동사니로 가득 채워버리는
장황함(Verbosity), 보일러플레이트(Boilerplate), 불필요한 상세 구현을 줄이는 것
강제변환
var a = '1' + 0;
var b = '1' - 0;
일반적으로 자바스크립트엔진에 맡겨 타입을 결정하는데,
+의 경우 문자열이
숫자보다 우선순위가 높고
+ 를 제외한 나머지 사칙연산자는 숫자가 문자열보다 우선순위가 높다.
강제변환
느슨한/엄격한 동등 비교
느슨한 동등 비교는 ==
엄격한 동등 비교는 ===
일반적으로 우리가 아는 이 둘의 차이점은 Value 비교는 물론,
Type 까지 Check해서 결과를 알려준다.
하지만.... 이곳에는 무서운 진실이 숨겨져 있다.
강제변환
강제변환
느슨한/엄격한 동등 비교
비교 과정에서 강제변환의 개입 여부가 들어있다.
ES5 11.9.3 추상적 동등 비교 알고리즘
모든 가능한 타입별 조합마다 (필요시) 강제변환을 수행한다.
var a = 42;
var b = "42";
a === b; //false
a == b; //true
이번에는 Boolean으로 비교한다면?
강제변환
느슨한/엄격한 동등 비교
비교 과정에서 강제변환의 개입 여부가 들어있다.
이번에는 Boolean으로 비교한다면?
var a = "42";
var b = true;
a == b ?
var a = "42";
var b = true;
a === b ?
강제변환
느슨한/엄격한 동등 비교
비교 과정에서 강제변환의 개입 여부가 들어있다.
if( a === null || a === undefined ) {
return ... }
if( a == null ){
return ... }
강제변환
마지막으로 말도 안되는... 불편한 진실.
비교 과정에서 `==`는 강제변환의 개입이 들어있다.
강제변환
이제 암시적 강제변환의 결론을 내려보자.
- 피연산자 중 하나가 true/false 일 가능성이 있다면 '절대로' == 연산자를 쓰지 말자.
- 피연산자 중 하나가 [], " ", , 0이 될 가능성이 있으면 가급적 == 연산자를 쓰지 말자.
이런 상황이라면 == 대신 ===를 사용하여 여러분이 의도하지 않은 강제변환을 차단하는게 훨씬 좋다
문법
문법
문의 완료 값
표현식의 부수 효과
콘텍스트 규칙
연산자 우선순위
세미콜론 자동 삽입
문의 완료 값
표현식의 부수 효과
콘텍스트 규칙
연산자 우선순위
세미콜론 자동 삽입
문법
문의 완료 값
"The result of evaluating a Statement is always a Completion value"
_ES5.1 12
var b;
if (true){
b = 4 + 38;
}
모든 문은 (그 값이 undefined라 해도) 완료 값을 가진다는 사실!!
var a, b;
a = if (true){
b = 4 + 38;
}
문법
표현식의 부수 효과
부수 효과란?
https://ko.wikipedia.org/wiki/부작용_(컴퓨터_과학)
문법
표현식의 부수 효과
표현식의 부수 효과
function foo() {
a = a + 1;
}
var a = 1;
foo();
var a = 42;
var b = a++;
var a = 42;
var b = ++a; // 42
var a = 42, b;
b = (a++, a);
a; b;
문법
표현식의 부수 효과
표현식의 부수 효과
function vowels(str){
var matches;
if (str) {
// 모든 모음을 추출한다.
matches = str.match( /[aeiou]/g);
if(matches){
return matches
}
}
}
vowels("Hello World");
function vowels(str){
var matches;
if (str && (matches = str.match(/[aeiou]/g))) {
return matches
}
}
vowels("Hello World");
문법
연산자 우선 순위
var a = 42;
var b = "foo";
a && b; // "foo"
a || b' // 42
var a = 42;
var b = "foo";
var c = [1,2,3];
a && b || c; // ?
a || b && c; // ?
문법
연산자 우선 순위
a || b := a || b ? b : a
a && b := a && b ? a : b
단락 평가
function doSOmething(opts){
if (opts && opts.cool) {
// ...
}
}
문법
세미콜론 자동 삽입(ASI)
세미콜론을 써야한다는 주장
// 원래 코드
function getData() {
return
{
title: 'Maintainable Javascript',
author: 'Nicholas C. Zakas'
}
}
// 파서가 생각하는 코드
function getData() {
return;
{
title: 'Maintainable Javascript',
author: 'Nicholas C. Zakas'
};
}
이 예제에서 우리가 보기에 `getData()`는 데이터가 포함된 객체를 반환하는 함
수입니다. 하지만 ASI는 return 문 이후에 새로운 줄이 있으니 당연히 세미콜론
을 삽입합니다. 따라서 getDate( ) 함수는 undefined를 반환합니다.
문법
세미콜론 자동 삽입(ASI)
세미콜론을 써야한다는 주장
// 세미콜론은 빠졌지만 정상 동작합니다.
function getData() {
return {
title: 'Maintainable Javascript',
author: 'Nicholas C. Zakas'
}
}
문법
세미콜론 자동 삽입(ASI)
세미콜론을 쓰지 않아도 된다(쓰지 말아야 한다) 주장
function foo () {
return 42; // ok
}; // <– AVOID!
class Foo {
constructor () {
if (baz) {
return 42; // ok
}; // <– AVOID!
return 12; // ok
}; // <– AVOID!
}; // <– AVOID!
이 예제에서 우리가 보기에 `getData()`는 데이터가 포함된 객체를 반환하는 함
수입니다. 하지만 ASI는 return 문 이후에 새로운 줄이 있으니 당연히 세미콜론
을 삽입합니다. 따라서 getDate( ) 함수는 undefined를 반환합니다.
?

More Related Content

What's hot

01. basic types
01. basic types01. basic types
01. basic types
Han JaeYeab
 
비개발자를 위한 Javascript 알아가기 #5
비개발자를 위한 Javascript 알아가기 #5비개발자를 위한 Javascript 알아가기 #5
비개발자를 위한 Javascript 알아가기 #5
민태 김
 
외계어 스터디 3/5 function and object
외계어 스터디 3/5   function and object외계어 스터디 3/5   function and object
외계어 스터디 3/5 function and object
민태 김
 
More effective c++ chapter1 2_dcshin
More effective c++ chapter1 2_dcshinMore effective c++ chapter1 2_dcshin
More effective c++ chapter1 2_dcshin
Dong Chan Shin
 
Hello Swift 2/5 - Basic2
Hello Swift 2/5 - Basic2Hello Swift 2/5 - Basic2
Hello Swift 2/5 - Basic2
Cody Yun
 
Ec++ 3,4 summary
Ec++ 3,4 summaryEc++ 3,4 summary
Ec++ 3,4 summarySehyeon Nam
 
이펙티브 C++ 공부
이펙티브 C++ 공부이펙티브 C++ 공부
이펙티브 C++ 공부quxn6
 
The C++ Programming Language 5장 포인터, 배열, 구조체
The C++ Programming Language 5장 포인터, 배열, 구조체The C++ Programming Language 5장 포인터, 배열, 구조체
The C++ Programming Language 5장 포인터, 배열, 구조체해강
 
More effective c++ 항목30부터
More effective c++ 항목30부터More effective c++ 항목30부터
More effective c++ 항목30부터
Dong Chan Shin
 
[C++ Korea 2nd Seminar] C++17 Key Features Summary
[C++ Korea 2nd Seminar] C++17 Key Features Summary[C++ Korea 2nd Seminar] C++17 Key Features Summary
[C++ Korea 2nd Seminar] C++17 Key Features Summary
Chris Ohk
 
Effective c++ chapter3, 4 요약본
Effective c++ chapter3, 4 요약본Effective c++ chapter3, 4 요약본
Effective c++ chapter3, 4 요약본
Dong Chan Shin
 
[Swift] Generics
[Swift] Generics[Swift] Generics
[Swift] Generics
Bill Kim
 
C++17 Key Features Summary - Ver 2
C++17 Key Features Summary - Ver 2C++17 Key Features Summary - Ver 2
C++17 Key Features Summary - Ver 2
Chris Ohk
 
C++11
C++11C++11
C++11
Yubin Lim
 
[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기
[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기
[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기
Chris Ohk
 
More effective c++ 2
More effective c++ 2More effective c++ 2
More effective c++ 2현찬 양
 
Kotlin expression
Kotlin expressionKotlin expression
Kotlin expression
Myeongin Woo
 
Effective c++ 4
Effective c++ 4Effective c++ 4
Effective c++ 4현찬 양
 

What's hot (20)

01. basic types
01. basic types01. basic types
01. basic types
 
비개발자를 위한 Javascript 알아가기 #5
비개발자를 위한 Javascript 알아가기 #5비개발자를 위한 Javascript 알아가기 #5
비개발자를 위한 Javascript 알아가기 #5
 
외계어 스터디 3/5 function and object
외계어 스터디 3/5   function and object외계어 스터디 3/5   function and object
외계어 스터디 3/5 function and object
 
More effective c++ chapter1 2_dcshin
More effective c++ chapter1 2_dcshinMore effective c++ chapter1 2_dcshin
More effective c++ chapter1 2_dcshin
 
Hello Swift 2/5 - Basic2
Hello Swift 2/5 - Basic2Hello Swift 2/5 - Basic2
Hello Swift 2/5 - Basic2
 
C review
C  reviewC  review
C review
 
Ec++ 3,4 summary
Ec++ 3,4 summaryEc++ 3,4 summary
Ec++ 3,4 summary
 
이펙티브 C++ 공부
이펙티브 C++ 공부이펙티브 C++ 공부
이펙티브 C++ 공부
 
The C++ Programming Language 5장 포인터, 배열, 구조체
The C++ Programming Language 5장 포인터, 배열, 구조체The C++ Programming Language 5장 포인터, 배열, 구조체
The C++ Programming Language 5장 포인터, 배열, 구조체
 
5 6 1
5 6 15 6 1
5 6 1
 
More effective c++ 항목30부터
More effective c++ 항목30부터More effective c++ 항목30부터
More effective c++ 항목30부터
 
[C++ Korea 2nd Seminar] C++17 Key Features Summary
[C++ Korea 2nd Seminar] C++17 Key Features Summary[C++ Korea 2nd Seminar] C++17 Key Features Summary
[C++ Korea 2nd Seminar] C++17 Key Features Summary
 
Effective c++ chapter3, 4 요약본
Effective c++ chapter3, 4 요약본Effective c++ chapter3, 4 요약본
Effective c++ chapter3, 4 요약본
 
[Swift] Generics
[Swift] Generics[Swift] Generics
[Swift] Generics
 
C++17 Key Features Summary - Ver 2
C++17 Key Features Summary - Ver 2C++17 Key Features Summary - Ver 2
C++17 Key Features Summary - Ver 2
 
C++11
C++11C++11
C++11
 
[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기
[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기
[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기
 
More effective c++ 2
More effective c++ 2More effective c++ 2
More effective c++ 2
 
Kotlin expression
Kotlin expressionKotlin expression
Kotlin expression
 
Effective c++ 4
Effective c++ 4Effective c++ 4
Effective c++ 4
 

Similar to You dont know_js

자바스크립트.
자바스크립트.자바스크립트.
자바스크립트.
Deoc Jin
 
자바스크립트 제대로 알고쓰기
자바스크립트 제대로 알고쓰기자바스크립트 제대로 알고쓰기
자바스크립트 제대로 알고쓰기
Min Park
 
스칼라와 스파크 영혼의 듀오
스칼라와 스파크 영혼의 듀오스칼라와 스파크 영혼의 듀오
스칼라와 스파크 영혼의 듀오
Taeoh Kim
 
[Main Session] 미래의 Java 미리보기 - 앰버와 발할라 프로젝트를 중심으로
[Main Session] 미래의 Java 미리보기 - 앰버와 발할라 프로젝트를 중심으로[Main Session] 미래의 Java 미리보기 - 앰버와 발할라 프로젝트를 중심으로
[Main Session] 미래의 Java 미리보기 - 앰버와 발할라 프로젝트를 중심으로
Oracle Korea
 
Java.next
Java.nextJava.next
Java.next
Sungchul Park
 
Java
JavaJava
Java
U.g. Yong
 
파이썬+정규표현식+이해하기 20160301
파이썬+정규표현식+이해하기 20160301파이썬+정규표현식+이해하기 20160301
파이썬+정규표현식+이해하기 20160301
Yong Joon Moon
 
자바스크립트 기초문법~함수기초
자바스크립트 기초문법~함수기초자바스크립트 기초문법~함수기초
자바스크립트 기초문법~함수기초
진수 정
 
0.javascript기본(~3일차내)
0.javascript기본(~3일차내)0.javascript기본(~3일차내)
0.javascript기본(~3일차내)Sung-hoon Ma
 
Javascript 완벽 가이드 정리
Javascript 완벽 가이드 정리Javascript 완벽 가이드 정리
Javascript 완벽 가이드 정리
ETRIBE_STG
 
C수업자료
C수업자료C수업자료
C수업자료
koominsu
 
C수업자료
C수업자료C수업자료
C수업자료koominsu
 
javascript01
javascript01javascript01
javascript01
ChangHyeon Bae
 
파이썬 기본 문법
파이썬 기본 문법파이썬 기본 문법
파이썬 기본 문법
SeongHyun Ahn
 
Java tutorial
Java tutorialJava tutorial
Java tutorial
ssuser34b989
 
Javascript
JavascriptJavascript
Javascript
Joshua Yoon
 
Swift 세미나
Swift 세미나Swift 세미나
Swift 세미나
용재 김
 
그래프(Graph)와 그래프 알고리즘(단어사다리 문제 해결)
그래프(Graph)와 그래프 알고리즘(단어사다리 문제 해결)그래프(Graph)와 그래프 알고리즘(단어사다리 문제 해결)
그래프(Graph)와 그래프 알고리즘(단어사다리 문제 해결)
Eunwoo Cho
 
Scala, Scalability
Scala, ScalabilityScala, Scalability
Scala, Scalability
Dongwook Lee
 

Similar to You dont know_js (20)

자바스크립트.
자바스크립트.자바스크립트.
자바스크립트.
 
자바스크립트 제대로 알고쓰기
자바스크립트 제대로 알고쓰기자바스크립트 제대로 알고쓰기
자바스크립트 제대로 알고쓰기
 
스칼라와 스파크 영혼의 듀오
스칼라와 스파크 영혼의 듀오스칼라와 스파크 영혼의 듀오
스칼라와 스파크 영혼의 듀오
 
[Main Session] 미래의 Java 미리보기 - 앰버와 발할라 프로젝트를 중심으로
[Main Session] 미래의 Java 미리보기 - 앰버와 발할라 프로젝트를 중심으로[Main Session] 미래의 Java 미리보기 - 앰버와 발할라 프로젝트를 중심으로
[Main Session] 미래의 Java 미리보기 - 앰버와 발할라 프로젝트를 중심으로
 
Java.next
Java.nextJava.next
Java.next
 
Java
JavaJava
Java
 
파이썬+정규표현식+이해하기 20160301
파이썬+정규표현식+이해하기 20160301파이썬+정규표현식+이해하기 20160301
파이썬+정규표현식+이해하기 20160301
 
자바스크립트 기초문법~함수기초
자바스크립트 기초문법~함수기초자바스크립트 기초문법~함수기초
자바스크립트 기초문법~함수기초
 
0.javascript기본(~3일차내)
0.javascript기본(~3일차내)0.javascript기본(~3일차내)
0.javascript기본(~3일차내)
 
Javascript 완벽 가이드 정리
Javascript 완벽 가이드 정리Javascript 완벽 가이드 정리
Javascript 완벽 가이드 정리
 
C수업자료
C수업자료C수업자료
C수업자료
 
C수업자료
C수업자료C수업자료
C수업자료
 
javascript01
javascript01javascript01
javascript01
 
파이썬 기본 문법
파이썬 기본 문법파이썬 기본 문법
파이썬 기본 문법
 
Java tutorial
Java tutorialJava tutorial
Java tutorial
 
Javascript
JavascriptJavascript
Javascript
 
Swift 세미나
Swift 세미나Swift 세미나
Swift 세미나
 
그래프(Graph)와 그래프 알고리즘(단어사다리 문제 해결)
그래프(Graph)와 그래프 알고리즘(단어사다리 문제 해결)그래프(Graph)와 그래프 알고리즘(단어사다리 문제 해결)
그래프(Graph)와 그래프 알고리즘(단어사다리 문제 해결)
 
Scalability
ScalabilityScalability
Scalability
 
Scala, Scalability
Scala, ScalabilityScala, Scalability
Scala, Scalability
 

More from Jeong-gyu Kim

Id generator
Id generatorId generator
Id generator
Jeong-gyu Kim
 
근육 기억으로 주도하는 테스트 주도 개발 입문하기
근육 기억으로 주도하는 테스트 주도 개발 입문하기근육 기억으로 주도하는 테스트 주도 개발 입문하기
근육 기억으로 주도하는 테스트 주도 개발 입문하기
Jeong-gyu Kim
 
Api first design 개발의 선순환
Api first design 개발의 선순환Api first design 개발의 선순환
Api first design 개발의 선순환
Jeong-gyu Kim
 
Design by contract(계약에의한설계)
Design by contract(계약에의한설계)Design by contract(계약에의한설계)
Design by contract(계약에의한설계)
Jeong-gyu Kim
 
JPA Study - 1주차(SLIPP)
JPA Study - 1주차(SLIPP)JPA Study - 1주차(SLIPP)
JPA Study - 1주차(SLIPP)
Jeong-gyu Kim
 
얼굴인식 - 기초
얼굴인식 - 기초얼굴인식 - 기초
얼굴인식 - 기초
Jeong-gyu Kim
 
02.cnn - CNN 파헤치기 3탄
02.cnn - CNN 파헤치기 3탄02.cnn - CNN 파헤치기 3탄
02.cnn - CNN 파헤치기 3탄
Jeong-gyu Kim
 
01.cnn - 본격CNN논문 파헤치기
01.cnn - 본격CNN논문 파헤치기01.cnn - 본격CNN논문 파헤치기
01.cnn - 본격CNN논문 파헤치기
Jeong-gyu Kim
 
00.cnn basic
00.cnn basic00.cnn basic
00.cnn basic
Jeong-gyu Kim
 
코드 재사용에 대해서 생각해보기
코드 재사용에 대해서 생각해보기 코드 재사용에 대해서 생각해보기
코드 재사용에 대해서 생각해보기
Jeong-gyu Kim
 
Deep dive functional thinking
Deep dive functional thinkingDeep dive functional thinking
Deep dive functional thinking
Jeong-gyu Kim
 
Spark로 알아보는 빅데이터 처리
Spark로 알아보는 빅데이터 처리Spark로 알아보는 빅데이터 처리
Spark로 알아보는 빅데이터 처리
Jeong-gyu Kim
 
'객체지향의 사실과 오해' 북 리뷰 세미나
'객체지향의 사실과 오해' 북 리뷰 세미나'객체지향의 사실과 오해' 북 리뷰 세미나
'객체지향의 사실과 오해' 북 리뷰 세미나
Jeong-gyu Kim
 
Functional thinking - 책 리뷰 1탄
Functional thinking - 책 리뷰 1탄Functional thinking - 책 리뷰 1탄
Functional thinking - 책 리뷰 1탄
Jeong-gyu Kim
 
Intern pt sw_r&amp;d_len_second_mission
Intern pt sw_r&amp;d_len_second_missionIntern pt sw_r&amp;d_len_second_mission
Intern pt sw_r&amp;d_len_second_mission
Jeong-gyu Kim
 
Log Parser Story In Python3
Log Parser Story In Python3Log Parser Story In Python3
Log Parser Story In Python3
Jeong-gyu Kim
 
Stampfood 2.0
Stampfood 2.0Stampfood 2.0
Stampfood 2.0
Jeong-gyu Kim
 
Node.js를 활용한 웹 크롤링(Crawling)
Node.js를 활용한 웹 크롤링(Crawling)Node.js를 활용한 웹 크롤링(Crawling)
Node.js를 활용한 웹 크롤링(Crawling)
Jeong-gyu Kim
 

More from Jeong-gyu Kim (18)

Id generator
Id generatorId generator
Id generator
 
근육 기억으로 주도하는 테스트 주도 개발 입문하기
근육 기억으로 주도하는 테스트 주도 개발 입문하기근육 기억으로 주도하는 테스트 주도 개발 입문하기
근육 기억으로 주도하는 테스트 주도 개발 입문하기
 
Api first design 개발의 선순환
Api first design 개발의 선순환Api first design 개발의 선순환
Api first design 개발의 선순환
 
Design by contract(계약에의한설계)
Design by contract(계약에의한설계)Design by contract(계약에의한설계)
Design by contract(계약에의한설계)
 
JPA Study - 1주차(SLIPP)
JPA Study - 1주차(SLIPP)JPA Study - 1주차(SLIPP)
JPA Study - 1주차(SLIPP)
 
얼굴인식 - 기초
얼굴인식 - 기초얼굴인식 - 기초
얼굴인식 - 기초
 
02.cnn - CNN 파헤치기 3탄
02.cnn - CNN 파헤치기 3탄02.cnn - CNN 파헤치기 3탄
02.cnn - CNN 파헤치기 3탄
 
01.cnn - 본격CNN논문 파헤치기
01.cnn - 본격CNN논문 파헤치기01.cnn - 본격CNN논문 파헤치기
01.cnn - 본격CNN논문 파헤치기
 
00.cnn basic
00.cnn basic00.cnn basic
00.cnn basic
 
코드 재사용에 대해서 생각해보기
코드 재사용에 대해서 생각해보기 코드 재사용에 대해서 생각해보기
코드 재사용에 대해서 생각해보기
 
Deep dive functional thinking
Deep dive functional thinkingDeep dive functional thinking
Deep dive functional thinking
 
Spark로 알아보는 빅데이터 처리
Spark로 알아보는 빅데이터 처리Spark로 알아보는 빅데이터 처리
Spark로 알아보는 빅데이터 처리
 
'객체지향의 사실과 오해' 북 리뷰 세미나
'객체지향의 사실과 오해' 북 리뷰 세미나'객체지향의 사실과 오해' 북 리뷰 세미나
'객체지향의 사실과 오해' 북 리뷰 세미나
 
Functional thinking - 책 리뷰 1탄
Functional thinking - 책 리뷰 1탄Functional thinking - 책 리뷰 1탄
Functional thinking - 책 리뷰 1탄
 
Intern pt sw_r&amp;d_len_second_mission
Intern pt sw_r&amp;d_len_second_missionIntern pt sw_r&amp;d_len_second_mission
Intern pt sw_r&amp;d_len_second_mission
 
Log Parser Story In Python3
Log Parser Story In Python3Log Parser Story In Python3
Log Parser Story In Python3
 
Stampfood 2.0
Stampfood 2.0Stampfood 2.0
Stampfood 2.0
 
Node.js를 활용한 웹 크롤링(Crawling)
Node.js를 활용한 웹 크롤링(Crawling)Node.js를 활용한 웹 크롤링(Crawling)
Node.js를 활용한 웹 크롤링(Crawling)
 

You dont know_js

  • 1. You don't know JS Cardoc Dev.Intern 김정규
  • 2. 후기. JS는 적당히 알기는 정말 쉽다. 그러나 완전히 알기는 어렵다. 타입 값 네이티브 강제변환 문법 스코프 렉시컬 스코프 함수 vs 블록 스코프 호이스팅 스코프 클로저 JS는 적당히 알기는 정말 쉽다. 그러나 완전히 알기는 어렵다. 타입 값 네이티브 강제변환 문법 스코프 렉시컬 스코프 함수 vs 블록 스코프 호이스팅 스코프 클로저
  • 3. 자바 스크립트에서 타입이란 말의 의미는 무엇일 까?
  • 4. 자바 스크립트에서 타입이란 말의 의미는 무엇일 까? 타입과 자료형의 차이는 무엇일까? Javascript의 다양한 타입 그래서... typeof 라는 안전 가드
  • 6. 예외 존재. 바로 Null 과 Function 나는 변수를 선언한적 없는데...
  • 7. Cardoc 의 monitor 프로젝트를 비춰보면...?
  • 8.
  • 9. 값 배열 문자열 숫자 특수 값 값 VS 레퍼런스 배열 문자열 숫자 특수 값 값 VS 레퍼런스
  • 10. 숫자 - toFixed( ) vs toPrecision( ) - Number.EPSILON - Number.MAX_SAFE_INTEGER - Number.isInteger( ) - Number.isSafeInteger( ) - A | 0 ?
  • 11. 숫자 - toFixed( ) vs toPrecision( )
  • 12. 숫자 - Number.EPSILON 0.1 + 0.3 === 0.4 ? Number.EPSILON = Math.pow(2,-52);
  • 13. 숫자 - Number.MAX_SAFE_INTEGER Number.MAX_VALUE := 1.7976931348623157e+308 Number.MAX_SAFE_INTEGER ?
  • 14. 숫자 - Number.isInteger( ) - Number.isSafeInteger( ) Number.MAX_VALUE := 1.7976931348623157e+308 Number.MAX_SAFE_INTEGER := 2^53-1
  • 16. 숫자 A | 0 Any Integer -> 32비트 부호있는 정수
  • 17. 특수 값 값 아닌 값 Undefined Void -0 +0 -Infinity +Infinity
  • 19. 값 VS 레퍼런스 "자바스크립트는 포인터라는 개념 자체가 없고 참조하는 방법도 조금 다르다. 우선 어떤 변수가 다른 변수를 참조할 수 없다. 그냥 안된다. 더구나 자바스크립트에는 값 또는 레퍼런스의 할당 및 전달을 제어하는 구문 암시(Syntactic Hint)가 전혀 없다. 대신, 값의 타입만으로 값-복사, 레퍼런스-복사 둘 중 한쪽이 결정된다." - 카일 심슨의 You don't know JS 네? 타입으로 결정한다?
  • 22. 강제변환 어떤 값을 다른 타입의 값으로 바꾸는 과정이 명시적이면 '타입 캐스팅' (값이 사용되는 규칙에 따라) 암시적이면 '강제변환(Coercion)이라고 한다. 또는 '타입 캐스팅'은 정적 타입언어에서 컴파일 시점에, '강제변환'은 동적 타입 언어에서 런타임 시점에 발생한다. 그러나 자바스크립트에서는 대부분 모든 유형의 타입변환을 강제변환으로 뭉뚱그려 일컫는 경향이 있어서, 여기서는 '암시적 강제변환'과 '명시적 강제변환' 두 가지로 구별한다.
  • 23. 강제변환 Ok. 명시적 형변환 필요해! '명시적:암시적 = 명백한 : 숨겨진 부수 효과' 그럼 왜 암시적인 형변환이 필요한 걸까? 자 더글라스 크락포드 는 자바스크립트 강제변환은 반드시 피해야 한다고 말한다. 그렇게 말하지만 다시 물어보자. 암시적 강제변환은 위험한 것일까? 암시적 강제변환의 목적은 중요한 내용으로부터 주의를 분산시켜 코드를 잡동사니로 가득 채워버리는 장황함(Verbosity), 보일러플레이트(Boilerplate), 불필요한 상세 구현을 줄이는 것
  • 24. 강제변환 var a = '1' + 0; var b = '1' - 0; 일반적으로 자바스크립트엔진에 맡겨 타입을 결정하는데, +의 경우 문자열이 숫자보다 우선순위가 높고 + 를 제외한 나머지 사칙연산자는 숫자가 문자열보다 우선순위가 높다.
  • 25. 강제변환 느슨한/엄격한 동등 비교 느슨한 동등 비교는 == 엄격한 동등 비교는 === 일반적으로 우리가 아는 이 둘의 차이점은 Value 비교는 물론, Type 까지 Check해서 결과를 알려준다. 하지만.... 이곳에는 무서운 진실이 숨겨져 있다.
  • 27. 강제변환 느슨한/엄격한 동등 비교 비교 과정에서 강제변환의 개입 여부가 들어있다. ES5 11.9.3 추상적 동등 비교 알고리즘 모든 가능한 타입별 조합마다 (필요시) 강제변환을 수행한다. var a = 42; var b = "42"; a === b; //false a == b; //true 이번에는 Boolean으로 비교한다면?
  • 28. 강제변환 느슨한/엄격한 동등 비교 비교 과정에서 강제변환의 개입 여부가 들어있다. 이번에는 Boolean으로 비교한다면? var a = "42"; var b = true; a == b ? var a = "42"; var b = true; a === b ?
  • 29. 강제변환 느슨한/엄격한 동등 비교 비교 과정에서 강제변환의 개입 여부가 들어있다. if( a === null || a === undefined ) { return ... } if( a == null ){ return ... }
  • 30. 강제변환 마지막으로 말도 안되는... 불편한 진실. 비교 과정에서 `==`는 강제변환의 개입이 들어있다.
  • 31. 강제변환 이제 암시적 강제변환의 결론을 내려보자. - 피연산자 중 하나가 true/false 일 가능성이 있다면 '절대로' == 연산자를 쓰지 말자. - 피연산자 중 하나가 [], " ", , 0이 될 가능성이 있으면 가급적 == 연산자를 쓰지 말자. 이런 상황이라면 == 대신 ===를 사용하여 여러분이 의도하지 않은 강제변환을 차단하는게 훨씬 좋다
  • 33. 문법 문의 완료 값 표현식의 부수 효과 콘텍스트 규칙 연산자 우선순위 세미콜론 자동 삽입 문의 완료 값 표현식의 부수 효과 콘텍스트 규칙 연산자 우선순위 세미콜론 자동 삽입
  • 34. 문법 문의 완료 값 "The result of evaluating a Statement is always a Completion value" _ES5.1 12 var b; if (true){ b = 4 + 38; } 모든 문은 (그 값이 undefined라 해도) 완료 값을 가진다는 사실!! var a, b; a = if (true){ b = 4 + 38; }
  • 35. 문법 표현식의 부수 효과 부수 효과란? https://ko.wikipedia.org/wiki/부작용_(컴퓨터_과학)
  • 36. 문법 표현식의 부수 효과 표현식의 부수 효과 function foo() { a = a + 1; } var a = 1; foo(); var a = 42; var b = a++; var a = 42; var b = ++a; // 42 var a = 42, b; b = (a++, a); a; b;
  • 37. 문법 표현식의 부수 효과 표현식의 부수 효과 function vowels(str){ var matches; if (str) { // 모든 모음을 추출한다. matches = str.match( /[aeiou]/g); if(matches){ return matches } } } vowels("Hello World"); function vowels(str){ var matches; if (str && (matches = str.match(/[aeiou]/g))) { return matches } } vowels("Hello World");
  • 38. 문법 연산자 우선 순위 var a = 42; var b = "foo"; a && b; // "foo" a || b' // 42 var a = 42; var b = "foo"; var c = [1,2,3]; a && b || c; // ? a || b && c; // ?
  • 39. 문법 연산자 우선 순위 a || b := a || b ? b : a a && b := a && b ? a : b 단락 평가 function doSOmething(opts){ if (opts && opts.cool) { // ... } }
  • 40. 문법 세미콜론 자동 삽입(ASI) 세미콜론을 써야한다는 주장 // 원래 코드 function getData() { return { title: 'Maintainable Javascript', author: 'Nicholas C. Zakas' } } // 파서가 생각하는 코드 function getData() { return; { title: 'Maintainable Javascript', author: 'Nicholas C. Zakas' }; } 이 예제에서 우리가 보기에 `getData()`는 데이터가 포함된 객체를 반환하는 함 수입니다. 하지만 ASI는 return 문 이후에 새로운 줄이 있으니 당연히 세미콜론 을 삽입합니다. 따라서 getDate( ) 함수는 undefined를 반환합니다.
  • 41. 문법 세미콜론 자동 삽입(ASI) 세미콜론을 써야한다는 주장 // 세미콜론은 빠졌지만 정상 동작합니다. function getData() { return { title: 'Maintainable Javascript', author: 'Nicholas C. Zakas' } }
  • 42. 문법 세미콜론 자동 삽입(ASI) 세미콜론을 쓰지 않아도 된다(쓰지 말아야 한다) 주장 function foo () { return 42; // ok }; // <– AVOID! class Foo { constructor () { if (baz) { return 42; // ok }; // <– AVOID! return 12; // ok }; // <– AVOID! }; // <– AVOID! 이 예제에서 우리가 보기에 `getData()`는 데이터가 포함된 객체를 반환하는 함 수입니다. 하지만 ASI는 return 문 이후에 새로운 줄이 있으니 당연히 세미콜론 을 삽입합니다. 따라서 getDate( ) 함수는 undefined를 반환합니다.
  • 43. ?