[Javascript] νƒ€μž… λ³€ν™˜

 

πŸ“Œνƒ€μž…λ³€ν™˜

νƒ€μž… λ³€ν™˜μ—λŠ” 두가지 μ’…λ₯˜κ°€ μžˆλ‹€. 

 

1. λͺ…μ‹œμ  νƒ€μž… λ³€ν™˜(νƒ€μž… μΊμŠ€νŒ…)

= κ°œλ°œμžκ°€ μ˜λ„μ μœΌλ‘œ νƒ€μž…μ„ λ³€ν™˜ν•˜λŠ” 것

const num = 1;
const str = num.toString();
console.log(typeof str, str);  // string 1
console.log(typeof num, num);  // number 1

 

 

2. 암묡적 νƒ€μž… λ³€ν™˜(νƒ€μž… κ°•μ œ λ³€ν™˜)

= 개발자의 μ˜λ„μ™€λŠ” 상관없이 μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진에 μ˜ν•΄ μ•”λ¬΅μ μœΌλ‘œ νƒ€μž…μ΄ μžλ™ λ³€ν™˜λ˜λŠ” 것

const num = 1;
const str = num + " ";
console.log(typeof str, str); // string 1
console.log(typeof num, num); // number 1

μ—¬κΈ°μ„œ μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진은 num + " "λ₯Ό ν‰κ°€ν•˜κΈ° μœ„ν•΄ num값을 λ°”νƒ•μœΌλ‘œ μƒˆλ‘œμš΄ λ¬Έμžμ—΄ κ°’ '1'을 μƒμ„±ν•˜κ³  평가
이 λ•Œ μž„μ˜λ‘œ λ§Œλ“  '1'은 μ•”λ¬΅μ μœΌλ‘œ νƒ€μž…μ„ λ³€ν™”μ‹œμΌœ μ‚¬μš©ν•œ ν›„, ν•œλ²ˆλ§Œ μ“°κ³  버린닀.

 

ν•˜μ§€λ§Œ 두가지 방법 λͺ¨λ‘ κΈ°μ‘΄ κ°’μ˜ νƒ€μž…μ„ 직접 λ³€κ²½ν•˜λŠ” 것은 μ•„λ‹˜

νƒ€μž… λ³€ν™˜μ€ 기쑴의 μ›μ‹œκ°’μ„ μ΄μš©ν•΄ λ‹€λ₯Έ νƒ€μž…μ˜ μƒˆλ‘œμš΄ μ›μ‹œ 값을 μƒμ„±ν•˜λŠ” 것이기 λ•Œλ¬Έμ΄λ‹€.

 

  • 암묡적 νƒ€μž… λ³€ν™˜μ€ 개발자의 μ˜μ§€κ°€ 보이지 μ•ŠκΈ° λ•Œλ¬Έμ— 였λ₯˜λ₯Ό 생산할 κ°€λŠ₯성이 μžˆλ‹€
  • ν•˜μ§€λ§Œ, 가독성 μΈ‘λ©΄μ—μ„œλŠ” λͺ…μ‹œμ λ³΄λ‹€ 쒋을 수 μžˆλ‹€ (예: (10).toString()λ³΄λ‹€λŠ” 10 + ' '이 더 κ°„κ²°)
  • κ°€μž₯ 쒋은 건 μ½”λ“œλ₯Ό μ˜ˆμΈ‘ν•  수 있고, λ‹€λ₯Έ μ‚¬λžŒμ΄ 보기에도 μ΄ν•΄ν•˜κΈ°κ°€ μ‰¬μ›Œμ•Όν•œλ‹€.

 

 


🀐 암묡적 νƒ€μž… λ³€ν™˜

암묡적 νƒ€μž… λ³€ν™˜μ€ λ¬Έμžμ—΄, 숫자, boolean으둜 νƒ€μž…μ„ μžλ™ λ³€ν™˜ μ‹œν‚¨λ‹€.

 

1. λ¬Έμžμ—΄λ‘œ λ³€ν™˜

1 + "2"  // "12"

JS Is Weird에 μžˆλŠ” λ¬Έμ œμ€‘μ— 이런게 μžˆλ‹€..

이 문제의 닡은 "33"인데, 암묡적 νƒ€μž… λ³€ν™˜μ— λ”°λΌμ„œ 1 + 2λŠ” μš°μ„  3이고, 3 + "3"이 λ˜λ―€λ‘œ "33"이 λ˜λŠ” 것이닀..

근데 μ—¬κΈ°μ„œ λ¬Έμžμ—΄μ΄ 쀑간에 λ“€μ–΄κ°€λ©΄ μ΄λŸ°μ‹μœΌλ‘œ "123"이 λ˜μ–΄λ²„λ¦°λ‹€.

"1" + 2 + 3; // -> "123"
1 + "2" + 3; // -> "123"

 

 

그리고, 이런 μ—°μ‚°μž ν‘œν˜„μ‹μ—μ„œλ§Œ 암묡적 νƒ€μž… λ³€ν™˜μ΄ μΌμ–΄λ‚˜λŠ” 건 μ•„λ‹ˆλ‹€.

ES6μ—μ„œ μ‚¬μš©λ˜λŠ” ν…œν”Œλ¦Ώ λ¦¬ν„°λŸ΄μ—μ„œμ˜ ν‘œν˜„μ‹ μ‚½μž…λ„ λ¬Έμžμ—΄λ‘œ νƒ€μž…λ³€ν™˜μ„ μΌμœΌν‚¨λ‹€.

`1 + 1 = ${1 + 1}`  // "1 + 1 = 2"

 

좔가적인 μ˜ˆμ‹œλ“€

// 숫자
0 + " "  // "0"
-1 + " "  // "-1"
NaN + " " // "NaN"
Infinity + " " // "Infinity"
// boolean νƒ€μž…
true + " "   // "true"
// etc
null + " "    // "null"
undefined + " "   // "undefined"
(Symbol()) + " "  // TypeError: Cannot convert a Symbol value to a string

// 객체
({}) + " "           // "[object Object]"
Math + " "           // "[object Math]"
[] + " "             // ""
[10, 20] + " "       // "10, 20"
(function(){}) + " " // "function(){}"
Array + " "          // "function Array() { [native code] }"

 

μ—¬κΈ°μ„œ Symbol()은 뭐지?

더보기

ES6μ—μ„œ λ„μž…λœ 7번째 μ›μ‹œ νƒ€μž…μœΌλ‘œ

κ³ μœ ν•œ ν‚€λ₯Ό κ°€μ§€λ©° μ„€λͺ…을 μΆ”κ°€ν•  수 μžˆλ‹€.

const sym = Symbol("μ„€λͺ…")
console.log(sym.description)  // "μ„€λͺ…"

 

객체의 κ³ μœ ν•œ ν”„λ‘œνΌν‹° ν‚€λ₯Ό μƒμ„±ν•˜λŠ” 것에 μ‚¬μš©ν•  수 μžˆλ‹€.

const MY_KEY = Symbol();
const obj = {
  [MY_KEY]: "λΉ„λ°€ κ°’"
};

console.log(obj[MY_KEY]);  // "λΉ„λ°€ κ°’"
Object.keys(obj);  // [] - Symbol ν‚€λŠ” 일반적인 μˆœνšŒμ—μ„œ μ œμ™Έλ¨

 

 new Symbol()λ‘œλŠ” μ‚¬μš©ν•  수 μ—†κ³ , Symbol의 νŠΉλ³„ν•œ μš©λ„λ₯Ό λ³΄ν˜Έν•˜κΈ° μœ„ν•΄ 암묡적 νƒ€μž… λ³€ν™˜μ€ μ œν•œλœλ‹€.

 

2. μˆ«μžμ—΄λ‘œ λ³€ν™˜

1 - "1"       // 0
1 * "10"      // 10
1 / "one"     // NaN

μ‚°μˆ  μ—°μ‚°μžλ₯Ό μ‚¬μš©ν•˜λŠ” μ‹μ—μ„œ λ¬Έμžμ—΄μ„ 숫자둜 λ°”κΏ€ 수 μžˆλ‹€λ©΄ 숫자 νƒ€μž…μœΌλ‘œ λ³€ν™”μ‹œμΌœμ„œ 계산이 μ§„ν–‰λœλ‹€.

μ΄λ•Œ λ§Œμ•½ λ¬Έμžμ—΄μ„ 숫자둜 λ³€ν™”μ‹œν‚¬ 수 μ—†λ‹€λ©΄ 결과값은 NaN이 λœλ‹€.

 

μ‚°μˆ  μ—°μ‚°μžλΏλ§Œ μ•„λ‹ˆλΌ λΉ„κ΅μ—°μ‚°μžλ„ 크기λ₯Ό λΉ„κ΅ν•˜κΈ° μœ„ν•΄μ„œ 숫자 νƒ€μž…μœΌλ‘œ λ³€ν™”μ‹œν‚¨λ‹€.

"1" > 0   // true

 

μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” + 단항 μ—°μ‚°μžλ₯Ό μ‚¬μš©ν•˜λ©΄ μˆ«μžκ°€ μ•„λ‹Œ 값을 숫자 νƒ€μž…μœΌλ‘œ 암묡적 νƒ€μž…λ³€ν™”λ₯Ό μ‹œν‚¨λ‹€.

1 + " "  // "1" -> 이건 λ¬Έμžμ—΄
+ "1"    // 1 -> 이건 숫자

μ΄λ ‡κ²Œ λ˜λŠ” μ΄μœ λŠ”

첫번째 +λŠ” 이항 μ—°μ‚°μžλ‘œ ν”Όμ—°μ‚°μž 쀑 ν•˜λ‚˜κ°€ λ¬Έμžμ—΄μ΄λ©΄ λ¬Έμžμ—΄λ‘œ μ—°κ²°ν•˜λŠ” 연산을 ν•˜κ³ ,

λ‘λ²ˆμ§Έ +λŠ” 단항 μ—°μ‚°μžλ‘œ ν”Όμ—°μ‚°μžλ₯Ό 숫자둜 λ³€ν™˜μ„ μ‹œλ„ν•˜λŠ” μ—°μ‚°μžμ΄κΈ° λ•Œλ¬Έμ΄λ‹€.

 

이 μ™Έμ˜ μˆ«μžμ—΄λ‘œ λ³€ν™˜ν•˜λŠ” μ˜ˆμ‹œ

+" "       // 0
+"κΈ€μž"    // NaN
+true      // 1
+null      // 0
+undefined // NaN
+{}        // NaN
+[]        // 0

빈 λ¬Έμžμ—΄, 빈 λ°°μ—΄, null, falseλŠ” 0으둜, trueλŠ” 1둜 λ³€ν™˜λ˜κ³  λ‚˜λ¨Έμ§€λŠ” NaN이 λœλ‹€.

더보기

μ—¬κΈ°μ„œ +{}와 +[]κ°€ μ„œλ‘œ λ‹€λ₯Έ 이유

+{}  // NaN

// λ‚΄λΆ€ λ³€ν™˜ κ³Όμ •
// 1. {}λ₯Ό μ›μ‹œκ°’μœΌλ‘œ λ³€ν™˜ (ToPrimitive)
//    - valueOf() 호좜 -> 객체 μžμ‹  λ°˜ν™˜
//    - toString() 호좜 -> "[object Object]" λ°˜ν™˜
// 2. "[object Object]"λ₯Ό 숫자둜 λ³€ν™˜ -> NaN

 

+[]  // 0

// λ‚΄λΆ€ λ³€ν™˜ κ³Όμ •
// 1. []λ₯Ό μ›μ‹œκ°’μœΌλ‘œ λ³€ν™˜ (ToPrimitive)
//    - valueOf() 호좜 -> λ°°μ—΄ μžμ‹  λ°˜ν™˜
//    - toString() 호좜 -> "" λ°˜ν™˜
// 2. ""λ₯Ό 숫자둜 λ³€ν™˜ -> 0

 

3. λΆˆλ¦¬μ–Έ νƒ€μž…λ‘œ λ³€ν™˜

JS 엔진은 λΆˆλ¦¬μ–Έ νƒ€μž…μ΄ μ•„λ‹Œ 값을 Truthyκ°’( = 참으둜 ν‰κ°€λ˜λŠ” κ°’)κ³Ό Falsy κ°’(= κ±°μ§“μœΌλ‘œ ν‰κ°€λ˜λŠ” κ°’)으둜 κ΅¬λΆ„ν•œλ‹€.

 

Falsy둜 ν‰κ°€λ˜λŠ” κ°’λ“€

  • false
  • undefined
  • null
  • 0, -0
  • NaN
  • λΉˆλ¬Έμžμ—΄(" ")

Falsy둜 ν‰κ°€λ˜λŠ” κ°’λ“€ μ΄μ™Έμ—λŠ” Truthy값이닀.

if ("0") console.log("λΉˆλ¬Έμžμ—΄μ΄ μ•„λ‹ˆλ©΄ True");
if ({}) console.log("객체도 true 1");
if ([]) console.log("객체도 true 2");

μœ„μ˜ μ˜ˆμ‹œ λͺ¨λ‘ 좜λ ₯λ˜λ―€λ‘œ, Truthy값을 가짐을 μ•Œ 수 μžˆλ‹€.


😯 λͺ…μ‹œμ  νƒ€μž… λ³€ν™˜

개발자의 μ˜λ„μ— λ”°λΌμ„œ λͺ…μ‹œμ μœΌλ‘œ νƒ€μž…μ„ λ³€ν™”ν•˜λŠ” 방법은 μ—¬λŸ¬κ°€μ§€κ°€ μžˆλ‹€. μƒμ„±μž ν•¨μˆ˜(String, Number, Boolean)λ₯Ό new없이 ν˜ΈμΆœν•˜λŠ” 방법, 빌트인 λ©”μ„œλ“œ(toString λ“±)을 μ΄μš©ν•˜λŠ” 방법, 암묡적 νƒ€μž… λ³€ν™˜μ„ ν™œμš©ν•˜λŠ” 방법 등이 μžˆλ‹€.

 

1. λ¬Έμžμ—΄λ‘œ λ³€ν™˜ν•˜λŠ” 방법

  • String μƒμ„±μž ν•¨μˆ˜λ₯Ό new μ—°μ‚°μž 없이 ν˜ΈμΆœν•˜λŠ” 방법
  • Object.prototype.toString λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜λŠ” 방법
  • λ¬Έμžμ—΄ μ—°κ²° μ—°μ‚°μžλ₯Ό μ‚¬μš©ν•˜λŠ” 방법
// String μƒμ„±μž ν•¨μˆ˜ μ‚¬μš©
String(1)         // "1"
String(Infinity)  // "Infinity"

// toString λ©”μ„œλ“œ μ‚¬μš©
(1).toString()    // "1"
(true).toString() // "true"

// λ¬Έμžμ—΄ μ—°κ²° μ—°μ‚°μž μ‚¬μš©
1 + " "      // "1"
false + " "  // "false"

 

2. 숫자둜 λ³€ν™˜ν•˜λŠ” 방법

  • Number μƒμ„±μž ν•¨μˆ˜λ₯Ό new μ—°μ‚°μž 없이 호좜
  • parseInt, parseFloat ν•¨μˆ˜λ₯Ό μ‚¬μš©
  • + 단항 μ‚°μˆ  μ—°μ‚°μž μ‚¬μš©
  • * μ‚°μˆ  μ—°μ‚°μž μ‚¬μš©
// Number μƒμ„±μž μ‚¬μš©
Number("1")    // 1
Number(true)   // 1

// parseInt, parseFloat μ‚¬μš©
parseInt("23")      // 23
parseFloat("11.7")  // 11.7

// + 단항 μ‚°μˆ  μ—°μ‚°μž μ‚¬μš©
+"1"     // 1
+true    // 1

// * μ‚°μˆ  μ—°μ‚°μž μ‚¬μš©
"0" * 1    // 0
"-1" * 1   // -1
true * 1   // 1

 

3. boolean으둜 λ³€ν™˜ν•˜λŠ” 방법

  • Boolean μƒμ„±μž ν•¨μˆ˜λ₯Ό new μ—°μ‚°μž 없이 ν˜ΈμΆœν•˜λŠ” 방법
  • ! λΆ€μ • 논리 μ—°μ‚°μžλ₯Ό 두 번 μ‚¬μš©ν•˜λŠ” 방법
// Boolean μ—°μ‚°μž μ‚¬μš©
Boolean("x")   // true
Boolean(" ")   // false(λΉˆλ¬Έμžμ—΄)
Boolean(NaN)   // false
Boolean({})   // true
Boolean([])    // true

// ! λΆ€μ • 논리 μ—°μ‚°μž 두 번 μ‚¬μš©
!!"x"      // true
!!""       // false
!!NaN      // false
!!null     // false
!!{}       // true
!![]       // true

 

 


 

μ—¬κΈ°κΉŒμ§€ ν•˜κ³ λ‚˜μ„œ JS Is Weird의 문제λ₯Ό λ‹€μ‹œ ν’€μ–΄λ³΄μž

이건 닡이 뭐가 λ‚˜μ˜¬κΉŒ

 

 

 

정닡은 1이닀..

μ™œλƒν•˜λ©΄ !![]κ°€ true이고, μ•žμ— +κ°€ λΆ™λŠ”κ±΄ + 단항 μ—°μ‚°μžμ΄λ―€λ‘œ, +trueκ°€ λ˜μ–΄μ„œ 1이 λœλ‹€.....와아

더보기

좜처

λͺ¨λ˜ μžλ°”μŠ€ν¬λ¦½νŠΈ Deep Dive(이웅λͺ¨, μœ„ν‚€λΆμŠ€)