μ¬λ―Έμκ³ κ΅λ¬ν JavaScript μμ
JavaScriptλ νλ₯ν μΈμ΄μ λλ€. JavaScriptλ κ΅¬λ¬Έμ΄ λ¨μνλ©° ν° μνκ³λ₯Ό κ°μ§κ³ μμ΅λλ€. κ°μ₯ μ€μν μ μ νλ₯ν 곡λ체λ₯Ό κ°μ§κ³ μλ€λ κ²μ λλ€.
λμμ, μ°λ¦¬ λͺ¨λλ JavaScriptκ° κΉλ€λ‘μ΄ λΆλΆμ κ°μ§ κ½€ μ¬λ―Έμλ μΈμ΄λΌλ κ²μ μκ³ μμ΅λλ€. λͺλͺ νΉμ§μ μ°λ¦¬μ μΌμμ μΈ μΌμ μμκ°μ μ§μ₯μΌλ‘ λ°κΎΈκΈ°λ νκ³ , μ°λ¦¬λ₯Ό ν¬κ² μκ² λ§λ€κΈ°λ ν©λλ€.
WTFJSμ μμ΄λμ΄λ Brian Lerouxμ μν΄μμ΅λλ€. μ΄ λͺ©λ‘λ€μ κ·Έμ μ΄μΌκΈ°μμ κ½€ μκ°μ λ°μμ΅λλ€. βWTFJSβ at dotJS 2012:
μ΄ νΈλλΆμ npm
λ₯Ό μ΄μ©νμ¬ μ€μΉν μ μμ΅λλ€. κ·Έλ₯ μ€νν©μλ€:
$ npm install -g wtfjs
μ΄μ λΉμ μ 컀맨λ μ°½μμ 'wtfjs'λ₯Ό μ€νν μ μκ² λμμ΅λλ€. λΉμ μ΄ μ νν '$PAGER'μμ 'wtfjs'κ° μ΄λ¦΄ κ² μ λλ€. μλλ©΄ κ³μ μ¬κΈ°μ μ½μ΄λ λ©λλ€.
μΆμ²λ https://github.com/denysdovhan/wtfjs μ¬κΈ°μμ νμΈ ν μ μμ΅λλ€.
νμ¬, wtfjsλ μλμ κ°μ μΈμ΄λ‘ λ²μλμμ΅λλ€:
- δΈζη
- ΰ€Ήΰ€Ώΰ€ΰ€¦ΰ₯
- Français
- PortuguΓͺs do Brasil
- Polski
- Italiano
- Russian (on Habr.com)
- νκ΅μ΄
- πͺπ» μμνκΈ°μ μμ
- βπ» νκΈ°λ²
- π μμ
[]
μ![]μ κ°λ€
true
λ![]
μ κ°μ§ μμ§λ§,[]
μλ κ°μ§ μλ€- trueλ false
- baNaNa
NaN
μNaN
μ΄ μλλ€- μ΄κ²μ μ€ν¨λ€
[]
μ truthy μ΄μ§λ§true
λ μλλ€null
μ falsy μ΄μ§λ§false
μ μλλ€document.all
μ κ°μ²΄μ΄μ§λ§undefined
μ΄λ€- μ΅μ κ°μ 0 λ³΄λ€ ν¬λ€
- ν¨μλ ν¨μκ° μλλ€
- λ°°μ΄ μΆκ°
- λ°°μ΄μ νν μΌν
- λ°°μ΄ νλ±μ λͺ¬μ€ν°
undefined
κ³ΌNumber
parseInt
μ λμ λμ΄λ€true
μfalse
λ₯Ό μ΄μ©ν μν- HTML μ£Όμμ JavaScriptμμλ μ ν¨νλ€
NaN
μ μ«μκ° μλλ€[]
κ³Όnull
μ κ°μ²΄μ΄λ€- λ§λ²μ²λΌ μ¦κ°νλ μ«μ
- μ νλ
0.1 + 0.2
- ν¨μΉ λ²νΈ
- μΈ μ«μμ λΉκ΅
- μ¬λ―Έμλ μν
- RegExps μΆκ°
- λ¬Έμμ΄μ
String
μ μΈμ€ν΄μ€κ° μλλ€ - backticksμΌλ‘ ν¨μ νΈμΆ
- Call call call
constructor
μμ±- κ°μ²΄ μμ±μ ν€λ‘μμ κ°μ²΄
__proto__
μ μ¬μ©ν νλ‘ν νμ μ κ·Ό`${{Object}}`
- λν΄νΈ κ°μΌλ‘ ꡬ쑰 ν΄μ
- Dotsμ spreading
- λΌλ²¨
- μ€μ²©λ λΌλ²¨λ€
- κ΅νν
try..catch
- μ΄κ²μ λ€μ€ μμμΈκ°?
- μ€μ€λ‘ μμ±λλ Generator
- ν΄λμ€μ ν΄λμ€
- κ°μ ν μ μλ κ°μ²΄
- κΉλ€λ‘μ΄ νμ΄ν ν¨μ
- νμ΄ν ν¨μλ μμ±μκ° λ μ μλ€
arguments
μ νμ΄ν ν¨μ- κΉλ€λ‘μ΄ return
- κ°μ²΄μ ν λΉ μ°κ²°
- λ°°μ΄μ μ¬μ©ν κ°μ²΄ μμ± μ κ·Ό s
- Null λ° κ΄κ³ μ°μ°μ
Number.toFixed()
λ€λ₯Έ μ«μ νμMath.max()
μ΄νMath.min()
null
κ³Ό0
λΉκ΅- λμΌν λ³μ μ¬μ μΈ
- λν΄νΈ λμ Array.prototype.sort()
- resolve()μ Promise instanceλ₯Ό λ°ννμ§ μλλ€
- π κΈ°ν resources
- π License
β βJust for Fun: μ°μ°ν νλͺ κ°μ μ΄μΌκΈ°β, Linus Torvalds
μ΄ λͺ©λ‘μ μ£Όμ λͺ©νλ κ°λ₯ν JavaScriptμ λͺ κ°μ§μ μμ²λ μμ λ€μ λͺ¨μΌκ³ , μλ λ°©μμ μ€λͺ νλ κ² μ λλ€. μ΄μ μ μ°λ¦¬κ° λͺ°λλ κ²λ€μ λ°°μ°λ κ²μ΄ μ¬λ―ΈμκΈ° λλ¬Έμ λλ€.
λΉμ μ΄ μ΄λ³΄μλΌλ©΄, μ΄ λ ΈνΈλ₯Ό μ¬μ©νμ¬ JavaScriptμ λν΄ μμΈν μμλ³Ό μ μμ κ²μ λλ€. μ΄ λ ΈνΈμ μ€λͺ μ μ½λ κ²μ λ λ§μ μκ°μ ν μ ν μ μκΈ°λ₯Ό λ°λλλ€.
λΉμ μ΄ μ λ¬Έ κ°λ°μλΌλ©΄, μ°λ¦¬κ° μ¬λνλ JavaScriptμ λͺ¨λ κΈ°μ΄ν μ κ³Ό μμμΉ λͺ»ν κ²λ€μ λν μμμ νλ₯ν μ°Έμ‘°λ‘ κ°μ£Όν μ μμ΅λλ€.
μ΄μ¨λ , μ΄κ²μ μ½μμλ€. λΉμ μ μλ§ μλ‘μ΄ κ²λ€μ μ°Ύμ μ μμ κ²μ λλ€.
// ->
μμ κ²°κ³Όλ₯Ό νμνλ λ° μ¬μ©λ©λλ€. μλ₯Ό λ€λ©΄:
1 + 1; // -> 2
// >
console.log
λλ λ€λ₯Έ μΆλ ₯μ κ²°κ³Όλ₯Ό μλ―Έν©λλ€. μλ₯Ό λ€λ©΄:
console.log("hello, world!"); // > hello, world!
//
μ€λͺ
μ μ¬μ©λλ μ£Όμμ
λλ€. μλ₯Ό λ€λ©΄:
// Assigning a function to foo constant
const foo = function() {};
λ°°μ΄μ λ°°μ΄μ΄ μλλλ€:
[] == ![]; // -> true
μΆμ νλ± μ°μ°μλ μμͺ½μ μ«μλ‘ λ³ννμ¬ λΉκ΅νκ³ , μλ‘ λ€λ₯Έ μ΄μ λ‘ μ μͺ½μ μ«μλ 0
μ΄ λ©λλ€. λ°°μ΄μ truthy νλ―λ‘, μ€λ₯Έμͺ½μ κ°μ 0
μ κ°μνλ truthy valueμ λ°λ κ° μ¦, false
μ
λλ€. κ·Έλ¬λ μΌμͺ½μ λΉ λ°°μ΄μ λ¨Όμ booleanμ΄ λμ§ μκ³ μ«μλ‘ κ°μ λ³νλκ³ λΉ λ°°μ΄μ truthy μμλ λΆκ΅¬νκ³ 0
μΌλ‘ κ°μλ©λλ€.
μ΄ ννμμ΄ μ΄λ»κ² λ¨μν λλμ§λ μλμ κ°μ΅λλ€:
+[] == +![];
0 == +false;
0 == 0;
true;
μ°Έμ‘° []
μ truthy μ΄μ§λ§ true
μ μλλ€.
λ°°μ΄μ true
μ κ°μ§ μμ§λ§ λ°°μ΄μ΄ μλκ²λ true
μ κ°μ§ μμ΅λλ€;
λ°°μ΄μ false
μ κ°μ§λ§ λ°°μ΄μ΄ μλκ²λ false
μ κ°μ΅λλ€:
true == []; // -> false
true == ![]; // -> false
false == []; // -> true
false == ![]; // -> true
true == []; // -> false
true == ![]; // -> false
// According to the specification
true == []; // -> false
toNumber(true); // -> 1
toNumber([]); // -> 0
1 == 0; // -> false
true == ![]; // -> false
![]; // -> false
true == false; // -> false
false == []; // -> true
false == ![]; // -> true
// According to the specification
false == []; // -> true
toNumber(false); // -> 0
toNumber([]); // -> 0
0 == 0; // -> true
false == ![]; // -> true
![]; // -> false
false == false; // -> true
!!"false" == !!"true"; // -> true
!!"false" === !!"true"; // -> true
λ€μ λ¨κ³λ₯Ό κ³ λ €ν©μλ€:
// true is 'truthy' and represented by value 1 (number), 'true' in string form is NaN.
true == "true"; // -> false
false == "false"; // -> false
// 'false' is not the empty string, so it's a truthy value
!!"false"; // -> true
!!"true"; // -> true
"b" + "a" + +"a" + "a"; // -> 'baNaNa'
μ΄κ²μ JavaScriptμμ ꡬμ λλ΄μ΄μ§λ§ μ¬ν΄μ λμμ΅λλ€. μλ³Έμ λ€μκ³Ό κ°μ΅λλ€:
"foo" + +"bar"; // -> 'fooNaN'
μμ 'foo' + (+'bar')
μΌλ‘ νκ°λκ³ μ«μκ° μλ 'bar'
ννλ‘ λ³νλ©λλ€.
NaN === NaN; // -> false
μλμ μ¬νλ€λ‘ λμμ λ Όλ¦¬λ₯Ό μ격νκ² μ μν©λλ€:
- λ§μ½
Type(x)
μType(y)
κ° λ€λ₯΄λ©΄ falseλ₯Ό λ°νν©λλ€.- λ§μ½
Type(x)
μ΄ μ«μμ΄κ³
x
κ° NaNμ΄λ©΄ falseλ₯Ό λ°νν©λλ€.y
κ° NaNμ΄λ©΄ falseλ₯Ό λ°νν©λλ€.- β¦ β¦ β¦
IEEEμμ μ μν NaN
:
4 κ°μ μνΈ λ°°νμ μΈ κ΄κ³ : λ³΄λ€ μμ, κ°μ, λ³΄λ€ νΌ, μμ μμ. λ§μ§λ§μ κ²½μ° νλ μ΄μμ νΌμ°μ°μκ° NaNμΌ λ λ°μν©λλ€. λͺ¨λ NaNμ μμ μ ν¬ν¨ν λͺ¨λ κ²κ³Ό μμ μμ΄ λΉκ΅ν΄μΌ ν©λλ€.
β βIEEE754 NaN κ°μ falseλ₯Ό λ°ννλ κ²μ κ·Όκ±°λ 무μμ λκΉ?β StackOverflowμμ
λΉμ μ λ―Ώμ§ μμμ§λ λͺ¨λ₯΄μ§λ§ β¦
(![] + [])[+[]] +
(![] + [])[+!+[]] +
([![]] + [][[]])[+!+[] + [+[]]] +
(![] + [])[!+[] + !+[]];
// -> 'fail'
κΈ°νΈλ₯Ό νλνλ λλλ©΄ μλμ κ°μ ν¨ν΄μ΄ μμ£Ό λ°μνλ κ²μ μ μ μμ΅λλ€:
![] + []; // -> 'false'
![]; // -> false
κ·Έλμ []
λ₯Ό false
μΌλ‘ λ°κΎΈλ μλλ₯Ό ν΄λ΄
λλ€. νμ§λ§ λ§μ λ΄λΆ ν¨μ νΈμΆ(binary + Operator
-> ToPrimitive
-> [[DefaultValue]]
)λλ¬Έμ μ€λ₯Έμͺ½ νΌ μ°μ° λ¬Έμμ΄λ‘ λ³ννκ² λ©λλ€:
![] + [].toString(); // 'false'
λ¬Έμμ΄μ λ°°μ΄λ‘ μκ°νλ©΄ [0]
μ ν΅ν΄ 첫 λ²μ§Έ λ¬Έμμ μ κ·Όν μ μμ΅λλ€:
"false"[0]; // -> 'f'
λλ¨Έμ§λ λΆλͺ
νμ§λ§ i
λ κ½€ κΉλ€λ‘μ΅λλ€. fail
μ i
λ 'falseundefined'λΌλ λ¬Έμμ΄μ μμ±νκ³ ['10']
μΈλ±μ€λ₯Ό μ¬μ©νμ¬ μμλ₯Ό μ‘μ΅λλ€.
λ°°μ΄μ truthy ν κ°μ΄μ§λ§ true
μ κ°μ§λ μλ€.
!![] // -> true
[] == true // -> false
λ€μμ ECMA-262 λͺ μΈλ κ²μ μΈμ μ λν λ§ν¬μ λλ€:
null
μ falsy κ°μ΄λΌλ μ¬μ€μλ λΆκ΅¬νκ³ false
λ μλλλ€.
!!null; // -> false
null == false; // -> false
λμμ 0
λλ ''
μ κ°μ falsy κ°μ false
μ λμΌν©λλ€.
0 == false; // -> true
"" == false; // -> true
μ€λͺ μ μ΄μ μμ μ λμΌν©λλ€. λ€μμ ν΄λΉ λ§ν¬μ λλ€:
β οΈ μ΄ ννΈλ λΈλΌμ°μ API μ μΌλΆμ΄λ©° Node.js νκ²½μμλ μλνμ§ μμ΅λλ€.β οΈ
document.all
μ λ°°μ΄κ³Ό κ°μ ν΄λμ€μ΄κ³ νμ΄μ§μ DOM λ
Έλμ λν μμΈμ€λ₯Ό μ 곡νλ€λ μ¬μ€μλ λΆκ΅¬νκ³ typeof
ν¨μμ undefined
μΌλ‘ λ°μν©λλ€.
document.all instanceof Object; // -> true
typeof document.all; // -> 'undefined'
λμμ document.all
μ undefined
μ λμΌνμ§ μμ΅λλ€.
document.all === undefined; // -> false
document.all === null; // -> false
νμ§λ§ λμμ:
document.all == null; // -> true
νΉν μ΄μ λ²μ μ IEμμ
document.all
μ DOM μμμ μ κ·Όνλ λ°©λ²μ μ¬μ©νμ΅λλ€. μ΄κ²μ νμ€μ΄ λ μ μ μμ§λ§ μ΄μ JavaScript μ½λμμ μ¬μ©λμμ΅λλ€. μλ‘μ΄ APIs(document.getElementById
μ κ°μ)μμ νμ€μ΄ μ§νλμμ λ μ΄ API νΈμΆμ μΈλͺ¨ μκ² λμκ³ νμ€ μμνλ μ΄λ₯Ό μ΄λ»κ² μ²λ¦¬ν μ§ κ²°μ ν΄μΌ νμ΅λλ€. κ΄λ²μνκ² μ¬μ©λκΈ° λλ¬Έμ κ·Έλ€μ APIλ₯Ό μ μ§νκΈ°λ‘ κ²°μ νμ§λ§ JavaScript λͺ μΈλ κ²μ κ³ μλ‘ μλ°νμ΅λλ€. μ΄κ²μ΄undefined
μ μν©μμ μ격ν νλ± λΉκ΅μ μ¬μ©νμ λfalse
λ₯Ό μλ΅νκ³ μΆμ νλ± λΉκ΅μ μ¬μ©ν λtrue
λ‘ μλ΅νλ μ΄μ λ λͺ μμ μΌλ‘ νμ©νλ λͺ μΈλ κ²μ μλμ μΈ μλ° λλ¬Έμ λλ€.β βμ€λλ νΉμ§ - document.allβ WhatWGμ HTML λͺ μΈλ κ² β βChapter 4 - ToBoolean - Falsy valuesβ YDKJSμ Types & Grammar
Number.MIN_VALUE
μ 0 λ³΄λ€ ν° κ°μ₯ μμ μ«μμ
λλ€:
Number.MIN_VALUE > 0; // -> true
Number.MIN_VALUE
μ5e-324
μ λλ€. μ¦, λΆλ μμμ μ λ°λ λ΄μμ ννν μ μλ κ°μ₯ μμ μμμ λλ€. μ΄ λ§μ 0 μ λλ¬ν μ μλ κ°μ₯ κ°κΉμ΄ κ°μ΄λΌλ μλ―Έ μ λλ€. μ΄κ²μ μμκ° μ 곡ν μ μλ μ΅μμ κ°μ΄λΌκ³ μ μν μ μμ΅λλ€.λΉλ‘ μ격νκ² μ€μ λ‘ μ«μλ μλμ§λ§ μ 체μ μΌλ‘ κ°μ₯ μμ κ°μ
Number.NEGATIVE_INFINITY
μ΄λΌκ³ ν μ μμ΅λλ€.β βμλ° μ€ν¬λ¦½νΈμμ μ
0
μNumber.MIN_VALUE
λ³΄λ€ μμ΅λκΉ?β StackOverflowμμ
β οΈ V8 v5.5 λλ κ·Έ μ΄νμ λ²μ μμλ λ²κ·Έκ° μμ μ μμ΅λλ€.(Node.js <=7)β οΈ
μ΄κ²μ undefined is not a function λͺ¨λκ° μκ³ μμ§λ§ μ΄κ±΄ μ΄λ¨κΉμ?
// Declare a class which extends null
class Foo extends null {}
// -> [Function: Foo]
new Foo() instanceof null;
// > TypeError: function is not a function
// > at β¦ β¦ β¦
μ΄κ²μ λͺ μΈλ κ²μ μΌλΆκ° μλλλ€. νμ¬ μμ λ λ²κ·Έ μΌ λΏμ΄λ―λ‘ ν₯ν μ무 λ¬Έμ μμ κ²μ λλ€.
λ κ°μ λ°°μ΄μ μΆκ°νλ €λ©΄ μ΄λ»κ² ν΄μΌ ν κΉμ?
[1, 2, 3] + [4, 5, 6]; // -> '1,2,34,5,6'
μ°κ²°μ΄ λ°μν©λλ€.μ°¨κ·Όμ°¨κ·Ό λ€μμ λ΄ μλ€:
[1, 2, 3] +
[4, 5, 6][
// call toString()
(1, 2, 3)
].toString() +
[4, 5, 6].toString();
// concatenation
"1,2,3" + "4,5,6";
// ->
("1,2,34,5,6");
4 κ°μ λΉ λ°°μ΄μ λ§λλλ€. κ·ΈλΌμλ λΆκ΅¬νκ³ νν μΌνλ‘ μΈν΄ μΈκ°μ§ , μμκ° μλ λ°°μ΄μ μ»κ² λ©λλ€:
let a = [, , ,];
a.length; // -> 3
a.toString(); // -> ',,'
νν μΌν ("λ§μ§λ§ μΌν"λΌκ³ λ ν¨)λ JavaScript μ μλ‘μ΄ μμ, λ§€κ° λ³μ λλ μμ±μ μΆκ°ν λ μ μ©νκ² μ¬μ©ν μ μμ΅λλ€. λ§μ½ μ μμ±μ μΆκ°νλ €λ μν©μμ μ΄λ―Έ νν μΌνλ₯Ό μ¬μ©νκ³ μλ κ²½μ° μ΄μ λ§μ§λ§ μ€μ μμ νμ§ μκ³ μ μ€μ μΆκ°ν μ μμ΅λλ€. μ΄λ κ² νλ©΄ λ²μ κ΄λ¦¬κ° λ κΉλ ν΄μ§κ³ μ½λ νΈμ§μ΄ λ λ²κ±°λ‘μΈ μ μμ΅λλ€.
β νν μΌν MDNμμ
λ°°μ΄ νλ±μ μλμμ λ³Ό μ μλ― JavaScriptμμλ λͺ¬μ€ν°μ λλ€:
[] == '' // -> true
[] == 0 // -> true
[''] == '' // -> true
[0] == 0 // -> true
[0] == '' // -> false
[''] == 0 // -> true
[null] == '' // true
[null] == 0 // true
[undefined] == '' // true
[undefined] == 0 // true
[[]] == 0 // true
[[]] == '' // true
[[[[[[]]]]]] == '' // true
[[[[[[]]]]]] == 0 // true
[[[[[[ null ]]]]]] == 0 // true
[[[[[[ null ]]]]]] == '' // true
[[[[[[ undefined ]]]]]] == 0 // true
[[[[[[ undefined ]]]]]] == '' // true
μλμ μμ λ₯Ό μ£Όμ κΉκ² μ΄ν΄ 보μμΌ ν©λλ€! μ΄ λμμ 7.2.13 μΆμ λλ± λΉκ΅μ μ€λͺ λμ΄ μμ΅λλ€.
Number
μμ±μμ μΈμλ₯Ό μ λ¬νμ§ μμΌλ©΄ 0
κ°μ μ»κ² λ©λλ€. μ€μ μΈμκ° μλ κ²½μ° undefined
κ°μ΄ νμ μΈμμ ν λΉλκΈ° λλ¬Έμ μΈμκ° μλ Number
λ λ§€κ° λ³μ κ°μΌλ‘ undefined
λ₯Ό μ¬μ©ν©λλ€. κ·Έλ¬λ undefined
λ₯Ό ν΅κ³Όνλ©΄ NaN
μ μ»μ μ μμ΅λλ€.
Number(); // -> 0
Number(undefined); // -> NaN
λͺ μΈλ κ²μ λ°λ₯΄λ©΄:
- ν¨μμ νΈμΆλ‘ μΈμκ° μ λ¬λμ§ μμ κ²½μ°
n
μ+0
μ΄ λ©λλ€. - λλ let
n
be ?ToNumber(value)
. undefined
μ κ²½μ°ToNumber(undefined)
λNaN
μΌλ‘ λ°νν΄μΌ ν©λλ€.
λ€μμ ν΄λΉ λΆλΆμ λλ€:
parseInt
μ νΉμ΄ν μ μΌλ‘ μ λͺ
ν©λλ€:
parseInt("f*ck"); // -> NaN
parseInt("f*ck", 16); // -> 15
π‘ μ€λͺ
: μ΄λ parseInt
μ μ μλ λ¬Έμμ λλ¬ν λκΉμ§ λ¬Έμλ³λ‘ κ³μ ꡬ문 λΆμμ νκΈ° λλ¬Έμ λ°μν©λλ€. 'f*ck'
μμ f
λ 16 μ§μλ‘ 15
μ
λλ€.
Infinity
μ μλ‘ νμ±νλ κ²μβ¦
//
parseInt("Infinity", 10); // -> NaN
// ...
parseInt("Infinity", 18); // -> NaN...
parseInt("Infinity", 19); // -> 18
// ...
parseInt("Infinity", 23); // -> 18...
parseInt("Infinity", 24); // -> 151176378
// ...
parseInt("Infinity", 29); // -> 385849803
parseInt("Infinity", 30); // -> 13693557269
// ...
parseInt("Infinity", 34); // -> 28872273981
parseInt("Infinity", 35); // -> 1201203301724
parseInt("Infinity", 36); // -> 1461559270678...
parseInt("Infinity", 37); // -> NaN
null
μ νμ±νλ κ²μλ μ£Όμν©μλ€:
parseInt(null, 24); // -> 23
π‘ μ€λͺ :
null
μ λ¬Έμμ΄"null"
λ‘ λ³ννλ €κ³ ν©λλ€. 0 λΆν° 23 κΉμ§μ κΈ°μμ λν΄μ λ³νν μ μλ μ«μκ° μμΌλ―λ‘ NaNμ λ°νν©λλ€. 24 μ,"n"
, 14 λ²μ§Έ λ¬Έμκ° μ«μ 체κ³μ μΆκ°λ©λλ€. 31μ,"u"
, 21 λ²μ§Έ λ¬Έμκ° μΆκ°λκ³ μ 체 λ¬Έμμ΄μ λμ½λ© ν μ μκ² λμμ΅λλ€. 37μμ λ μ΄μ μμ±ν μ μλ μ ν¨ μ«μ μ§ν©μ΄ μμΌλ©°NaN
μ΄ λ°νλ©λλ€.β βparseInt(null, 24) === 23β¦ wait, what?β StackOverflowμμ
8 μ§μμ λν΄μ μμ§λ§μλ€:
parseInt("06"); // 6
parseInt("08"); // 8 if support ECMAScript 5
parseInt("08"); // 0 if not support ECMAScript 5
π‘ μ€λͺ
: μ
λ ₯ λ¬Έμμ΄μ΄ "0"μΌλ‘ μμνλ κ²½μ°, κΈ°μλ 8 (octal) λλ 10 (decimal)μ
λλ€. μ ννλ μ΄λ€ κΈ°μκ° μ νλλκ°λ ꡬνμ λ°λΌ λ€λ¦
λλ€. ECMAScript 5λ 10 (decimal)μ§μλ₯Ό μ¬μ©νλλ‘ μ§μ νμ§λ§ λͺ¨λ λΈλΌμ°μ κ° μ΄κ²μ μ§μνμ§λ μμ΅λλ€. κ·Έλ¬λ―λ‘ parseInt
μ μ¬μ©ν λλ νμ κΈ°μλ₯Ό μ§μ ν©μλ€.
parseInt
νμ μ
λ ₯μ λ¬Έμμ΄λ‘ λ³ν:
parseInt({ toString: () => 2, valueOf: () => 1 }); // -> 2
Number({ toString: () => 2, valueOf: () => 1 }); // -> 1
λΆλ μμμ κ°μ νμ±νλ λμ μ£ΌμνμΈμ.
parseInt(0.000001); // -> 0
parseInt(0.0000001); // -> 1
parseInt(1 / 1999999); // -> 5
π‘ μ€λͺ
: ParseInt
μ λ¬Έμμ΄ μΈμλ₯Ό μ·¨νκ³ μ§μ λ κΈ°μμ μ μλ₯Ό λ°νν©λλ€. λν ParseInt
μ λ¬Έμμ΄ λ§€κ° λ³μμμ 첫 λ²μ§Έκ° μλ μ«μλ₯Ό ν¬ν¨νμ¬ λͺ¨λ κ²μ μ κ±°ν©λλ€. 0.000001
μ λ¬Έμμ΄ "0.000001"λ‘ λ°λκ³
parseIntμ
0μΌλ‘ λ°νλ©λλ€.
0.0000001μ΄ λ¬Έμμ΄λ‘ λ³νλλ©΄
"1e-7"λ‘ λλ―λ‘
parseIntμ
1μ λ°νν©λλ€.
1/1999999μ
5.00000250000125e-7λ‘ ν΄μλκ³
parseIntμ
5`μ 리ν΄ν©λλ€.
λͺ κ°μ§ μνμ ν΄λ΄ μλ€:
true -
true +
// -> 2
(true + true) * (true + true) -
true; // -> 3
ν β¦ π€
Number
μμ±μλ₯Ό μ¬μ©νμ¬ κ°μ μ«μλ‘ κ°μ λ³νν μ μμ΅λλ€. true
κ° 1
λ‘ κ°μ λλ κ²μ λΆλͺ
ν©λλ€:
Number(true); // -> 1
λ¨ν λνκΈ° μ°μ°μλ κ°μ μ«μλ‘ λ³ννλ €κ³ ν©λλ€. μ΄κ²μ μ μμ μμμ λ¬Έμμ΄ ννμΌ λΏμλλΌ λΉλ¬Έμμ΄μΈ true
, false
μ null
κ°λ λ³νν μ μμ΅λλ€. νΉμ κ°μ νμ±ν μ μλ κ²½μ° NaN
μΌλ‘ νκ°λ©λλ€. κ·Έκ²μ λ μ½κ² true
λ₯Ό 1
λ‘ κ°μ ν μ μμμ μλ―Έν©λλ€:
+true; // -> 1
λ§μ
λλ κ³±μ
μ μνν λ ToNumber
λ©μλκ° νΈμΆλ©λλ€. λͺ
μΈλ κ²μ λ°λ₯΄λ©΄ μλμ λ©μλλ₯Ό λ°νν©λλ€:
λ§μ½
argument
μ΄ trueμ΄λ©΄ 1μ΄ λ°νλ©λλ€. λ§μ½argument
μ΄ falseμ΄λ©΄ +0μ΄ λ°νλ©λλ€.
μ΄ λλ¬Έμ boolean κ°μ μΌλ° μ«μλ‘ μΆκ°νκ³ μ¬λ°λ₯Έ κ²°κ³Όλ₯Ό μ»μ μ μμ΅λλ€.
ν΄λΉ λΆλΆ:
μ΄κ²μ΄ <!--
(HTML μ£ΌμμΌλ‘ μλ €μ§) JavaScriptμμλ μ£ΌμμΌλ‘ μ¬μ©λ μ μλ€λ κ²μ΄ κΉμ μΈμμ λ¨κΉλλ€.
// valid comment
<!-- valid comment too
μΈμ κΉμλμ? μ΄λ HTML κ³Ό μ μ¬ν μ£Όμ <script>
νκ·Έλ₯Ό μ΄ν΄νμ§ λͺ»νλ λΈλΌμ°μ κ° μ μμ μΌλ‘ μ νλλλ‘ νκΈ° μν κ² μ
λλ€. Netscape 1.xκ³Ό κ°μ λΈλΌμ°μ λ λ μ΄μ μΈκΈ°κ° μμ΅λλ€. λ°λΌμ λ μ΄μ μ€ν¬λ¦½νΈ νκ·Έμ HTML μ£Όμμ λ£μ νμκ° μμ΅λλ€.
Node.jsλ V8 μμ§μ κΈ°λ°μΌλ‘ νκΈ°λλ¬Έμ Node.js λ°νμμμλ HTML κ³Ό μ μ¬ν μ£Όμμ μ§μν©λλ€. λν κ·Έκ²μ λͺ μλ κ²μ μΌλΆμ λλ€:
NaN
μ νμ
μ 'number'
μ΄λ€:
typeof NaN; // -> 'number'
typeof
μ instanceof
μ΄μμ μλ λ°©μμ λν μ€λͺ
:
typeof []; // -> 'object'
typeof null; // -> 'object'
// however
null instanceof Object; // false
typeof
μ°μ°μμ λμμ λͺ
μλ μΉμ
μμ μ μλ©λλ€:
λͺ
μλ κ²μ μνλ©΄ typeof
μ°μ°μλ Table 35: typeof
μ°μ°μ κ²°κ³Όμ λ°λΌ λ¬Έμμ΄μ λ°νν©λλ€. [[Call]]
μ ꡬννμ§ μλ null
, μΌλ°, νμ€ μ΄κ΅ λ° λΉνμ€ μ΄κ΅ κ°μ²΄μ κ²½μ° λ¬Έμμ΄ "object"
μ λ°νν©λλ€.
κ·Έλ¬λ toString
λ©μλλ₯Ό μ¬μ©νμ¬ κ°μ²΄μ μ νμ νμΈν μ μμ΅λλ€.
Object.prototype.toString.call([]);
// -> '[object Array]'
Object.prototype.toString.call(new Date());
// -> '[object Date]'
Object.prototype.toString.call(null);
// -> '[object Null]'
999999999999999; // -> 999999999999999
9999999999999999; // -> 10000000000000000
10000000000000000; // -> 10000000000000000
10000000000000000 + 1; // -> 10000000000000000
10000000000000000 + 1.1; // -> 10000000000000002
μ΄λ μ΄μ§ λΆλ μμμ μ°μ μ λν IEEE 754-2008 νμ€μΌλ‘ μΈν΄ λ°μν©λλ€. μ΄ μ²λμμλ κ°μ₯ κ°κΉμ΄ μ§μλ‘ λ°μ¬λ¦Όλ©λλ€. λ μ½μ΄λ³΄κΈ°:
- 6.1.6 μ«μ μ ν
- IEEE 754 on Wikipedia
μ μλ €μ§ λλ΄. 0.1
κ³Ό 0.2
μ μΆκ°λ is λ§€μ° μ νν©λλ€:
0.1 +
0.2(
// -> 0.30000000000000004
0.1 + 0.2
) ===
0.3; // -> false
βλΆλ μμμ μνμ΄ κΉ¨μ‘μ΅λκΉ?βμ λν λλ΅ StackOverflowμμ:
νλ‘κ·Έλ¨μμ μμ
0.2
μ0.3
μ μ€μ κ°μ λν κ·Όμ¬μΉκ° λ©λλ€.0.2
μ κ°μ₯ κ°κΉμ΄double
μ΄ μ 리μ0.2
λ³΄λ€ ν¬μ§λ§0.3
μ κ°μ₯ κ°κΉμ΄double
μ΄ μ 리μ0.3
λ³΄λ€ μμ΅λλ€.0.1
κ³Ό0.2
μ ν©μ μ 리μ0.3
λ³΄λ€ μ»€μ§κΈ° λλ¬Έμ μ½λμ μμμ μΌμΉνμ§ μμ΅λλ€.
μ΄ λ¬Έμ λ 0.30000000000000004.comμ΄λΌκ³ λΆλ¦¬λ μΉμ¬μ΄νΈμλ μμ μ λλ‘ μ μλ €μ Έ μμ΅λλ€. JavaScript λΏλ§ μλλΌ λΆλ μμμ μνμ μ¬μ©νλ λͺ¨λ μΈμ΄μμ λ°μν©λλ€.
Number
λλ String
κ³Ό κ°μ κ°μ²΄μ μμ μ λ°©λ²μ μΆκ°ν μ μμ΅λλ€.
Number.prototype.isOne = function() {
return Number(this) === 1;
};
(1.0).isOne(); // -> true
(1).isOne(); // -> true
(2.0)
.isOne()(
// -> false
7
)
.isOne(); // -> false
λΆλͺ
ν, Number
κ°μ²΄λ₯Ό JavaScriptμμ λ€λ₯Έ κ°μ²΄μ²λΌ νμ₯ν μ μμ΅λλ€. κ·Έλ¬λ, μ μλ λ©μλμ λμμ΄ λͺ
μλ κ²μ μΌλΆκ° μλ κ²½μ° κΆμ₯λμ§ μμ΅λλ€. Number
μ μμ± λͺ©λ‘μ λ€μκ³Ό κ°μ΅λλ€:
1 < 2 < 3; // -> true
3 > 2 > 1; // -> false
μ μ΄λ κ² μλν κΉμ? μ, λ¬Έμ λ ννμ 첫 λΆλΆμ μμ΅λλ€. μ΄λ»κ² μλνλμ§ λ΄ μλ€:
1 < 2 < 3; // 1 < 2 -> true
true < 3; // true -> 1
1 < 3; // -> true
3 > 2 > 1; // 3 > 2 -> true
true > 1; // true -> 1
1 > 1; // -> false
μ°λ¦¬λ μ΄κ²μ ν¬κ±°λ κ°μ μ°μ°μ(>=
)λ‘ μ΄ λ¬Έμ λ₯Ό ν΄κ²°ν μ μμ΅λλ€:
3 > 2 >= 1; // true
λͺ μλ κ²μ μ½μΌλ©΄μ κ΄κ³ μ°μ°μμ λν΄ μμΈν μμλ΄ μλ€:
μ’ μ’ JavaScriptμμ μ°μ μ°μ° κ²°κ³Όλ μμμΉ λͺ»ν κ²°κ³ΌμΌ μ μμ΅λλ€. μλμ μλ€μ κ³ λ €ν©μλ€:
3 - 1 // -> 2
3 + 1 // -> 4
'3' - 1 // -> 2
'3' + 1 // -> '31'
'' + '' // -> ''
[] + [] // -> ''
{} + [] // -> 0
[] + {} // -> '[object Object]'
{} + {} // -> '[object Object][object Object]'
'222' - -'111' // -> 333
[4] * [4] // -> 16
[] * [] // -> 0
[4, 4] * [4, 4] // NaN
μ²μ 4 κ°μ§ μμμμ λ¬΄μ¨ μΌμ΄ μΌμ΄λκ³ μλμ? JavaScriptμμ λ§μ μ μ΄ν΄νκΈ° μν μμ ν μ λλ€:
Number + Number -> addition
Boolean + Number -> addition
Boolean + Boolean -> addition
Number + String -> concatenation
String + Boolean -> concatenation
String + String -> concatenation
λ€λ₯Έ μλ€μ μΆκ°νλ©΄ μ΄λ¨κΉμ? ToPrimitive
κ³Ό ToString
λ©μλλ λ§μ
μ νκΈ° μ []
κ³Ό {}
μ μμμ μΌλ‘ μꡬν©λλ€. μλμ λͺ
μλ₯Ό ν΅ν΄ νκ° νλ‘μΈμ€μ λν΄ μμΈν μμλ΄
μλ€:
νΉν, {} + []
μ¬κΈ°μ μμΈκ° μμ΅λλ€. [] + {}
λ κ΄νΈκ° μμΌλ©΄ μ½λ λΈλ‘μΌλ‘ ν΄μν λ€μ λ¨ν +λ‘ ν΄μλμ΄ []
μ«μλ‘ λ³ννκΈ° λλ¬Έμ
λλ€. λ€μμ λ°λ¦
λλ€:
{
// a code block here
}
+[]; // -> 0
[] + {}
μ λμΌν μΆλ ₯μ μ»μΌλ €λ©΄ κ΄νΈλ‘ λ¬ΆμΌλ©΄ κ°λ₯ν©λλ€.
({} + []); // -> [object Object]
μλμ κ°μ μ«μλ₯Ό μΆκ°ν μ μλ€λ κ²μ μκ³ μμλμ?
// Patch a toString method
RegExp.prototype.toString =
function() {
return this.source;
} /
7 /
-/5/; // -> 2
"str"; // -> 'str'
typeof "str"; // -> 'string'
"str" instanceof String; // -> false
String
μμ±μλ λ¬Έμμ΄μ λ°νν©λλ€:
typeof String("str"); // -> 'string'
String("str"); // -> 'str'
String("str") == "str"; // -> true
new
λ‘ λ€μμ μλν΄ λ΄
μλ€:
new String("str") == "str"; // -> true
typeof new String("str"); // -> 'object'
κ°μ²΄? κ·Έκ² λκ°μ?
new String("str"); // -> [String: 'str']
λ¬Έμμ΄ μμ±μμ λν μΆκ° μ λ³΄κ° λͺ μλ κ²:
λͺ¨λ λ§€κ° λ³μλ₯Ό μ½μμ κΈ°λ‘νλ ν¨μλ₯Ό μ μΈν΄ λ³΄κ² μ΅λλ€:
function f(...args) {
return args;
}
μμ¬ν μ¬μ§μμ΄ ν¨μλ₯Ό λ€μκ³Ό κ°μ΄ νΈμΆν μ μμ΅λλ€:
f(1, 2, 3); // -> [ 1, 2, 3 ]
κ·Έλ¬λ backticksλ₯Ό μ¬μ©νμ¬ λͺ¨λ ν¨μλ₯Ό νΈμΆν μ μλ€λ κ²μ μκ³ μλμ?
f`true is ${true}, false is ${false}, array is ${[1, 2, 3]}`;
// -> [ [ 'true is ', ', false is ', ', array is ', '' ],
// -> true,
// -> false,
// -> [ 1, 2, 3 ] ]
μ, λΉμ μ΄ Tagged template literals μ μΉμνλ€λ©΄ μ΄κ²μ΄ λλμ§λ μμ κ²λλ€. μμ μμμ f
ν¨μλ ν
νλ¦Ώ 리ν°λ΄μ λν νκ·Έμ
λλ€. ν
νλ¦Ώ 리ν°λ΄μμ νκ·Έλ₯Ό μ¬μ©νλ©΄ ν¨μλ‘ ν
νλ¦Ώ 리ν°λ΄μ νμ±ν μ μμ΅λλ€. νκ·Έ ν¨μμ 첫 λ²μ§Έ μΈμλ λ¬Έμμ΄ κ°μ λ°°μ΄μ ν¬ν¨ν©λλ€. λλ¨Έμ§ μΈμλ ννμκ³Ό κ΄λ ¨μ΄ μμ΅λλ€. μ:
function template(strings, ...keys) {
// do something with strings and keysβ¦
}
μ΄ magic behindλ π styled-componentsλΌ λΆλ¦¬λ React communityμμ μΈκΈ°μλ μ λͺ ν λμκ΄μ μμ΅λλ€.
λͺ μΈμλ₯Ό λ§ν¬ν©λλ€:
@cramforceμ μν΄ λ°κ²¬λ¨.
console.log.call.call.call.call.call.apply(a => a, [1, 2]);
λΉμ μ λ§μμ μνκ² ν μ μμΌλ μ£ΌμνμΈμ! μ΄ μ½λλ₯Ό λ¨Έλ¦Ώμμ μ¬νν΄λ΄
μλ€. apply
λ©μλλ₯Ό μ¬μ©νμ¬ call
μ μ μ©νκ³ μμ΅λλ€. λ μ½μ΄λ³΄κΈ°:
- 19.2.3.3 Function.prototype.call(
thisArg
, ...args
) - **19.2.3.1 ** Function.prototype.apply(
thisArg
,argArray
)
const c = "constructor";
c[c][c]('console.log("WTF?")')(); // > WTF?
μ΄ μμ λ₯Ό μ°¨κ·Όμ°¨κ·Ό μ΄ν΄λ΄ μλ€:
// Declare a new constant which is a string 'constructor'
const c = "constructor";
// c is a string
c; // -> 'constructor'
// Getting a constructor of string
c[c]; // -> [Function: String]
// Getting a constructor of constructor
c[c][c]; // -> [Function: Function]
// Call the Function constructor and pass
// the body of new function as an argument
c[c][c]('console.log("WTF?")'); // -> [Function: anonymous]
// And then call this anonymous function
// The result is console-logging a string 'WTF?'
c[c][c]('console.log("WTF?")')(); // > WTF?
Object.prototype.constructor
λ μΈμ€ν΄μ€ κ°μ²΄λ₯Ό μμ±ν Object
μμ±μ ν¨μμ λν μ°Έμ‘°λ₯Ό λ°νν©λλ€. λ¬Έμμ΄μ κ²½μ° String
, μ«μμ κ²½μ° Number
λ₯Ό μλ―Έν©λλ€.
{ [{}]: {} } // -> { '[object Object]': {} }
μ κ·Έλ κ² μλν κΉμ? μ¬κΈ°μμ Computed property name μ μ¬μ©ν©λλ€. μ΄λ¬ν λκ΄νΈ μ¬μ΄μ κ°μ²΄λ₯Ό μ λ¬νλ©΄ κ°μ²΄λ₯Ό λ¬Έμμ΄λ‘ κ°μ λ³ννκΈ° λλ¬Έμ μμ± ν€ '[object Object]'
μ {}
κ°μ μ»μ΅λλ€.
λ€μκ³Ό κ°μ΄ "λκ΄νΈ μ§μ₯"μ λ§λ€ μ μμ΅λλ€:
({ [{}]: { [{}]: {} } }[{}][{}]); // -> {}
// structure:
// {
// '[object Object]': {
// '[object Object]': {}
// }
// }
μ¬κΈ°μμ κ°μ²΄ 리ν°λ΄μ λν΄ μμΈν μμ보μΈμ:
μμλ€μνΌ primitives μλ prototypes μ΄ μμ΅λλ€. κ·Έλ¬λ, __proto__
primitives μ λν κ°μ μ»μΌλ €κ³ νλ€λ©΄ λ€μκ³Ό κ°μ΄ ν μ μμ΅λλ€:
(1).__proto__.__proto__.__proto__; // -> null
μ΄κ²μ νλ‘ν νμ
μ΄ μλ 무μΈκ°κ° ToObject
λ©μλλ₯Ό μ¬μ©νμ¬ λνΌ κ°μ²΄λ‘ λνλκΈ° λλ¬Έμ λ°μν©λλ€. μ°¨κ·Όμ°¨κ·Ό μ΄ν΄λ΄
μλ€:
(1)
.__proto__(
// -> [Number: 0]
1
)
.__proto__.__proto__(
// -> {}
1
).__proto__.__proto__.__proto__; // -> null
__proto__
μ λν μμΈν μ 보λ μλμ κ°μ΅λλ€:
μλ μμ κ²°κ³Όλ 무μμΌκΉμ?
`${{ Object }}`;
λ΅μ:
// -> '[object Object]'
Shorthand property notation μ Object
μ¬μ©νμ¬ μμ±μ΄ μλ κ°μ²΄λ₯Ό μ μνμ΅λλ€:
{
Object: Object;
}
κ·Έ λ€μ κ°μ²΄λ₯Ό ν
νλ¦Ώ 리ν°λ΄μ μ λ¬ νμΌλ―λ‘ toString
λ©μλκ° ν΄λΉ κ°μ²΄λ₯Ό νΈμΆν©λλ€. μ΄κ²μ΄ λ¬Έμμ΄ '[object Object]'
μ μ»λ μ΄μ μ
λλ€.
μ΄ μμλ₯Ό κ³ λ €νμΈμ:
let x,
{ x: y = 1 } = { x };
y;
μμ μμλ λ€μκ³Ό κ°μ μ§λ¬Έμ μν νλ₯ν μΌμ
λλ€. y
μ κ°μ 무μμΈκ°μ? κ·Έ λ΅μ:
// -> 1
let x,
{ x: y = 1 } = { x };
y;
// β β β β
// 1 3 2 4
μμ μμμ:
- κ°μ μ§μ νμ§ μκ³
x
λ₯Ό μ μΈνλ―λ‘ μ΄λundefined
μ λλ€. - κ·Έ λ€μ
x
κ°μ κ°μ²΄ μμ±x
λ‘ μμΆν©λλ€. - κ·Έ λ€μ ꡬ쑰νλ₯Ό μ¬μ©νμ¬
x
κ°μ μΆμΆνκ³y
μ ν λΉν©λλ€. κ°μ΄ μ μλμ΄ μμ§μμΌλ©΄1
μ κΈ°λ³Έκ°μΌλ‘ μ¬μ©ν©λλ€. y
μ κ°μ λ°νν©λλ€.
- Object initializer at MDN
λ°°μ΄μ νμ°μΌλ‘ ν₯λ―Έλ‘μ΄ μλ₯Ό ꡬμ±ν μ μμ΅λλ€. μ΄λ₯Ό κ³ λ €νμΈμ:
[...[..."..."]].length; // -> 3
μ 3
μΌκΉμ? spread operatorμ μ¬μ©ν λ @@iterator
λ©μλκ° νΈμΆλκ³ λ°νλ Iteratorλ λ°λ³΅ν κ°μ μ»λλ° μ¬μ©λ©λλ€. λ¬Έμμ΄μ κΈ°λ³Έ Iteratorλ λ¬Έμμ΄μ λ¬Έμλ‘ νμ°ν©λλ€. νμ° ν μ΄λ¬ν λ¬Έμλ₯Ό λ°°μ΄λ‘ μμΆν©λλ€. κ·Έλ° λ€μ μ΄ λ°°μ΄μ λ€μ νμ°νκ³ λ°°μ΄λ‘ λ€μ μμΆν©λλ€.
λ¬Έμμ΄ '...'
μ μΈ κ°μ.
λ‘ κ΅¬μ±λλ©° λ¬Έμμ΄μ κΈΈμ΄λ 3
μ
λλ€.
μ΄μ μ°¨κ·Όμ°¨κ·Ό μ΄ν΄λ΄ μλ€:
[...'...'] // -> [ '.', '.', '.' ]
[...[...'...']] // -> [ '.', '.', '.' ]
[...[...'...']].length // -> 3
λΆλͺ νκ² μ°λ¦¬λ μνλ μμ λ°°μ΄ μμλ₯Ό νΌμΉκ³ λνν μ μμ΅λλ€:
[...'...'] // -> [ '.', '.', '.' ]
[...[...'...']] // -> [ '.', '.', '.' ]
[...[...[...'...']]] // -> [ '.', '.', '.' ]
[...[...[...[...'...']]]] // -> [ '.', '.', '.' ]
// and so on β¦
JavaScriptμμ λΌλ²¨μ λν΄ μλ νλ‘κ·Έλλ¨Έλ λ§μ§ μμ΅λλ€. λΌλ²¨λ€μ κ½€ μ¬λ―Έμμ΅λλ€:
foo: {
console.log("first");
break foo;
console.log("second");
}
// > first
// -> undefined
λΌλ²¨ λμ΄μλ λ¬Έμ₯λ€μ break
λλ continue
λ¬Έκ³Ό ν¨κ» μ¬μ©λ©λλ€. λΌλ²¨μ μ¬μ©νμ¬ λ£¨νλ₯Ό μλ³ν μ μκ³ break
λλ continue
λ¬Έμ μ¬μ©ν΄ νλ‘κ·Έλ¨μ΄ 루νλ₯Ό μ€λ¨ν΄μΌ νλμ§ λλ μ€νμ κ³μν΄μΌ νλμ§μ λν μ¬λΆλ₯Ό μ μ μμ΅λλ€.
μμ μλ₯Ό 보면 foo
λΌλ λΌλ²¨μ λ³Ό μ μμ΅λλ€. κ·Έ λ€λ‘ console.log('first');
μ μ€νν ν μ€νμ μ€λ¨ν©λλ€.
JavaScriptμ λΌλ²¨μ λν΄ λ μ½μ거리:
a: b: c: d: e: f: g: 1, 2, 3, 4, 5; // -> 5
μ΄μ μ μμ μ μ¬ν©λλ€. λ€μ λ§ν¬λ₯Ό λ°λ₯΄μΈμ:
μ΄ ννμ 무μμ λ°νν κΉμ? 2
? μλλ©΄ 3
?
(() => {
try {
return 2;
} finally {
return 3;
}
})();
μ λ΅μ 3
μ
λλ€. λλλμ?
μλμ μλ₯Ό μ΄ν΄λ³΄μΈμ:
new class F extends (String, Array) {}(); // -> F []
λ€μ€ μμμΈ κ² κ°μ΅λκΉ? μλλλ€.
ν₯λ―Έλ‘μ΄ λΆλΆμ extends
μ ((String, Array)
)μ κ°μ
λλ€. κ·Έλ£Ήν μ°μ°μλ νμ λ§μ§λ§ μΈμλ₯Ό λ°ννκΈ° λλ¬Έμ (String, Array)
μ μ¬μ€ Array
μ
λλ€. κ·Έ λ§μ μ΄μ λ§ Array
λ₯Ό νμ₯νλ ν΄λμ€λ₯Ό λ§λ€μλ€λ μ΄μΌκΈ°μ
λλ€.
μ€μ€λ‘ μμ±λλ Generatorμ μλ₯Ό μ΄ν΄λ΄ μλ€:
(function* f() {
yield f;
})().next();
// -> { value: [GeneratorFunction: f], done: false }
보μ΄λ κ²μ²λΌ 리ν΄λ κ°μ μ΄κ²μ value
μ f
κ° κ°μ κ°μ²΄μ
λλ€. μ΄λ¬ν κ²½μ° μλμ κ°μ μΌμ ν΄λ³Ό μ μμ΅λλ€:
(function* f() {
yield f;
})()
.next()
.value()
.next()(
// -> { value: [GeneratorFunction: f], done: false }
// and again
function* f() {
yield f;
}
)()
.next()
.value()
.next()
.value()
.next()(
// -> { value: [GeneratorFunction: f], done: false }
// and again
function* f() {
yield f;
}
)()
.next()
.value()
.next()
.value()
.next()
.value()
.next();
// -> { value: [GeneratorFunction: f], done: false }
// and so on
// β¦
μ΄λ¬ν μΌλ€μ΄ μλνλ μ΄μ λ₯Ό μ΄ν΄νλ €λ©΄ λ€μ λͺ μΈμλ₯Ό μ½μΌμμμ€:
μλμ μ½κΈ° μ 맀ν ꡬ문μ μκ°ν΄λ΄ μλ€:
typeof new class {
class() {}
}(); // -> 'object'
λ§μΉ ν΄λμ€ λ΄λΆμ ν΄λμ€λ₯Ό μ μΈνλ κ² κ°μ΅λλ€. μ€λ₯μ¬μΌ νμ§λ§ λ¬Έμμ΄ 'object'
μ μ»μμ΅λλ€.
ECMAScript 5 μλλΆν° keywords λ property names μΌλ‘ νμ©λ©λλ€. λ°λΌμ μλμ κ°μ κ°λ¨ν κ°μ²΄ μμ λ‘ μκ°ν©μλ€:
const foo = {
class: function() {}
};
κ·Έλ¦¬κ³ ES6μμ μΆμ½ λ©μλ μ μλ₯Ό νμ€ννμμ΅λλ€. λν ν΄λμ€λ μ΅λͺ
μ΄ λ μ μμ΅λλ€. κ·Έλμ μ°λ¦¬κ° : function
λΆλΆμ μ§μ°λ©΄ μλμ κ°μ κ²°κ³Ό κ°μ μ»μ κ² μ
λλ€:
class {
class() {}
}
λν΄νΈ ν΄λμ€μ κ²°κ³Ό κ°μ νμ λ¨μν κ°μ²΄μ
λλ€. κ·Έλ¦¬κ³ μ΄κ²μ νμ
μ 'object'
μ΄μ΄μΌ ν©λλ€.
λ μ½μ거리:
μ μλ €μ§ κΈ°νΈλ₯Ό μ¬μ©νλ©΄ μ ν κ°μ λ₯Ό μ κ±°ν μ μμ΅λλ€. μλλ₯Ό 보μΈμ:
function nonCoercible(val) {
if (val == null) {
throw TypeError("nonCoercible should not be called with null or undefined");
}
const res = Object(val);
res[Symbol.toPrimitive] = () => {
throw TypeError("Trying to coerce non-coercible object");
};
return res;
}
μ΄μ μ°λ¦¬λ μλμ κ°μ΄ μ¬μ©ν μ μμ΅λλ€:
// objects
const foo = nonCoercible({ foo: "foo" });
foo * 10; // -> TypeError: Trying to coerce non-coercible object
foo + "evil"; // -> TypeError: Trying to coerce non-coercible object
// strings
const bar = nonCoercible("bar");
bar + "1"; // -> TypeError: Trying to coerce non-coercible object
bar.toString() + 1; // -> bar1
bar === "bar"; // -> false
bar.toString() === "bar"; // -> true
bar == "bar"; // -> TypeError: Trying to coerce non-coercible object
// numbers
const baz = nonCoercible(1);
baz == 1; // -> TypeError: Trying to coerce non-coercible object
baz === 1; // -> false
baz.valueOf() === 1; // -> true
μλμ μλ₯Ό κ³ λ €νμΈμ w:
let f = () => 10;
f(); // -> 10
μ’μμ, νμ§λ§ μ΄κ±΄ μ΄λ¨κΉμ?:
let f = () => {};
f(); // -> undefined
undefined
λμ {}
μ κΈ°λν μλ μμ΅λλ€. μ΄κ²({}) λν νμ΄ν ν¨μμ ꡬ문 μ€ νλμ΄κΈ° λλ¬Έμ f
λ undefined μΌλ‘ 리ν΄λ κ²μ
λλ€. νμ§λ§ λ¦¬ν΄ κ°μ κ΄νΈλ‘ λ¬Άμ΄μ νμ΄ν ν¨μμ μ§μ {}
κ°μ²΄λ₯Ό 리ν΄ν μλ μμ΅λλ€.
let f = () => ({});
f(); // -> {}
μλμ μλ₯Ό μκ°ν΄λ΄ μλ€:
let f = function() {
this.a = 1;
};
new f(); // -> f { 'a': 1 }
μ΄μ , νμ΄ν ν¨μλ₯Ό μ΄μ©νμ¬ λμΌνκ² μλν΄λ΄ μλ€:
let f = () => {
this.a = 1;
};
new f(); // -> TypeError: f is not a constructor
νμ΄ν ν¨μλ μμ±μλ‘ μ¬μ©ν μ μμΌλ©° new μ ν¨κ» μ¬μ©νλ©΄ μ€λ₯κ° λ°μν©λλ€. μλνλ©΄ λ μ컬 λ²μμ this
κ° μκ³ prototype
μ΄ μκΈ° λλ¬Έμ κ·Έλμ λ§μ΄ μλ κ² μ
λλ€.
μλμ μλ₯Ό μκ°ν΄λ΄ μλ€ w:
let f = function() {
return arguments;
};
f("a"); // -> { '0': 'a' }
μ΄μ , νμ΄ν ν¨μλ₯Ό μ΄μ©νμ¬ λμΌνκ² μλν΄λ΄ μλ€ n:
let f = () => arguments;
f("a"); // -> Uncaught ReferenceError: arguments is not defined
νμ΄ν ν¨μλ μ§§κ³ λ μ컬 λ²μμ this
μ μ΄μ μ λ κΈ°μ‘΄ ν¨μμ κ²½λνλ λ²μ μ
λλ€. λμμ νμ΄ν ν¨μλ arguments
κ°μ²΄μ λν λ°μΈλ©μ μ 곡νμ§ μμ΅λλ€. μ ν¨ν λμμΌλ‘ rest parameters
μ μ¬μ©νμ¬ κ°μ κ²°κ³Όλ₯Ό μ»μ μ μμ΅λλ€:
let f = (...args) => args;
f("a");
- Arrow functions at MDN.
return
ꡬ문 λν κΉλ€λ‘μ΅λλ€. μ΄κ²μ μκ°ν΄λ΄
μλ€:
(function() {
return
{
b: 10;
}
})(); // -> undefined
return
κ³Ό λ°νλ ννμμ κ°μ μ€μ μμ΄μΌ ν©λλ€:
(function() {
return {
b: 10
};
})(); // -> { b: 10 }
μ΄λ λλΆλΆ μ€ λ°κΏ λ€μ μΈλ―Έμ½λ‘ μ μλμΌλ‘ μ½μ
νλ μλ μΈλ―Έμ½λ‘ μ½μ
μ΄λΌλ κ°λ
λλ¬Έμ
λλ€. 첫λ²μ§Έ μμμμ return
λ¬Έκ³Ό κ°μ²΄ 리ν°λ΄ μ¬μ΄μ μΈλ―Έμ½λ‘ μ΄ μ½μ
λμ΄ μμΌλ―λ‘ ν¨μλ undefined
λ₯Ό λ°ννκ³ κ°μ²΄ 리ν°λ΄μ νκ°λμ§ μμ΅λλ€.
var foo = { n: 1 };
var bar = foo;
foo.x = foo = { n: 2 };
foo.x; // -> undefined
foo; // -> {n: 2}
bar; // -> {n: 1, x: {n: 2}}
μ€λ₯Έμͺ½μμ μΌμͺ½μΌλ‘, {n: 2}
μ΄ fooμ ν λΉλκ³ , μ΄ ν λΉμ κ²°κ³Ό{n: 2}
λ foo.x μ ν λΉλμ΄ μκ³ , barλ fooλ₯Ό ν λΉνκ³ μκΈ° λλ¬Έμ barλ {n: 1, x: {n: 2}}
μ
λλ€. κ·Έλ°λ° bar.xκ° μλ λ°λ©΄μ foo.xλ μ μ μλμ§ μμ κ²μΌκΉμ?
Fooμ barλ κ°μ κ°μ²΄ {n: 1}
λ₯Ό μ°Έμ‘°νκ³ μκ³ lvaluesλ ν λΉλκΈ° μ μ κ²°μ λ©λλ€. foo = {n: 2}
μ μλ‘μ΄ κ°μ²΄λ₯Ό μμ±νκ³ μμΌλ―λ‘ fooλ μλ‘μ΄ κ°μ²΄λ₯Ό μ°Έμ‘°νλλ‘ μ
λ°μ΄νΈλ©λλ€. νΈλ¦μ foo.x = ...
μ foo μ μμ΅λλ€. lvalue κ°μ μ¬μ μ νμΈλμκ³ μ¬μ ν μ΄μ foo = {n:1}
κ°μ²΄λ₯Ό μ°Έμ‘°νκ³ x κ°μ μΆκ°νμ¬ μ
λ°μ΄νΈν©λλ€. μ²΄μΈ ν λΉ νμλ barλ μ¬μ ν μ΄μ μ foo κ°μ²΄λ₯Ό μ°Έμ‘°νμ§λ§ fooλ xκ° μ‘΄μ¬νμ§ μλ μλ‘μ΄ {n: 2}
κ°μ²΄λ₯Ό μ°Έμ‘°ν©λλ€.
λ€μκ³Ό λμΌν©λλ€:
var foo = { n: 1 };
var bar = foo;
foo = { n: 2 }; // -> {n: 2}
bar.x = foo; // -> {n: 1, x: {n: 2}}
// bar.x point to the address of the new foo object
// it's not equivalent to: bar.x = {n: 2}
var obj = { property: 1 };
var array = ["property"];
obj[array]; // -> 1
λ€μ°¨μ λ°°μ΄μ μλμ½λλ 무μμ λκΉ?
var map = {};
var x = 1;
var y = 2;
var z = 3;
map[[x, y, z]] = true;
map[[x + 10, y, z]] = true;
map["1,2,3"]; // -> true
map["11,2,3"]; // -> true
λκ΄νΈ μ°μ°μ []
λ toString
μ μ¬μ©νμ¬ μ λ¬λ μμ λ³νν©λλ€. λ¨μΌ μμ λ°°μ΄μ λ¬Έμμ΄μΌλ‘ λ³ννλ κ²μ ν¬ν¨λ μμλ₯Ό λ¬Έμμ΄λ‘ λ³ννλ κ²κ³Ό μ μ¬ν©λλ€:
["property"].toString(); // -> 'property'
null > 0; // false
null == 0; // false
null >= 0; // true
κΈ΄ μκΈ°λ₯Ό μ§§κ² νμλ©΄, λ§μ½ null
μ΄ 0
λ³΄λ€ μμΌλ©΄ false
μ΄κ³ null >= 0
μ true
μ
λλ€. μ¬κΈ°μμ μ΄μ λν μμΈν μ€λͺ
μ μ½μΌμμμ€ μ¬κΈ°.
Number.toFixed()
λ λ€λ₯Έ λΈλΌμ°μ μμ μ½κ° μ΄μνκ² μλν μ μμ΅λλ€. μλ μλ₯Ό νμΈνμΈμ:
(0.7875).toFixed(3);
// Firefox: -> 0.787
// Chrome: -> 0.787
// IE11: -> 0.788
(0.7876).toFixed(3);
// Firefox: -> 0.788
// Chrome: -> 0.788
// IE11: -> 0.788
λ³Έλ₯μ μΌλ‘ IE11μ μ¬λ°λ₯΄κ³ Firefox/Chromeμ΄ μλͺ»λμλ€κ³ μκ°ν μ μμ§λ§ μ¬μ€μ Firefox/Chromeμ΄ λ μ§μ μ μΌλ‘ μ«μμ νμ€(IEEE-754 Floating Point)μ μ€μνκ³ μλ λ°λ©΄ IE11λ λ λͺ νν κ²°κ³Όλ₯Ό μ 곡νκΈ° μν λ Έλ ₯μΌλ‘ κ·Έκ²λ€μ λ―ΈμΈνκ² κ±°μνκ³ μμ΅λλ€.
λͺ κ°μ§ κ°λ¨ν ν μ€νΈλ₯Ό ν΅ν΄ μ΄ λ¬Έμ κ° λ°μνλ μ΄μ λ₯Ό νμΈν μ μμ΅λλ€:
// Confirm the odd result of rounding a 5 down
(0.7875).toFixed(3); // -> 0.787
// It looks like it's just a 5 when you expand to the
// limits of 64-bit (double-precision) float accuracy
(0.7875).toFixed(14); // -> 0.78750000000000
// But what if you go beyond the limit?
(0.7875).toFixed(20); // -> 0.78749999999999997780
λΆλ μμμ λ²νΈλ λ΄λΆμ μΌλ‘ 10μ§μ 리μ€νΈλ‘ μ μ₯λλ κ²μ΄ μλλΌ λκ² toStringκ³Ό μ μ¬ν νΈμΆμ μν΄ λ°μ¬λ¦Όλμ§λ§ μ€μ λ‘ λ΄λΆμ μΌλ‘λ λ§€μ° λ³΅μ‘ν λ°©λ²λ‘ μ ν΅ν΄ μ μ₯λ©λλ€.
μ΄ κ²½μ° λμ μλ "5"λ μ€μ λ‘ μ§μ§ 5 λ³΄λ€ λ§€μ° μμ λΆλΆμ λλ€.ν©λ¦¬μ μΈ κΈΈμ΄λ‘ λ°μ¬λ¦Όνλ©΄ 5...μΌλ‘ λ λλ§λμ§λ§ μ€μ λ‘λ λ΄λΆμ μΌλ‘ 5λ μλλλ€.
κ·Έλ¬λ IE11μ νλμ¨μ΄ νκ³μμ λ¬Έμ λ₯Ό μ€μ΄κΈ° μν΄ κ°μ κ°μ λ‘ λ°μ¬λ¦Όνλ κ²μ²λΌ 보μ΄κΈ° λλ¬Έμ toFixed(20)μ μ¬λ‘μμλ λμ 0λ§ μΆκ°ν κ°μ μ λ ₯ λ³΄κ³ ν κ²μ λλ€.
toFixed
μ λν ECMA-262 μ μμ NOTE 2
λ₯Ό μ°Έκ³ νμΈμ.
Math.min(1, 4, 7, 2); // -> 1
Math.max(1, 4, 7, 2); // -> 7
Math.min(); // -> Infinity
Math.max(); // -> -Infinity
Math.min() > Math.max(); // -> true
- Why is Math.max() less than Math.min()? by Charlie Harvey
λ€μ ννλ€μ λͺ¨μμ μλ―Ένκ² κ°μ΅λλ€:
null == 0; // -> false
null > 0; // -> false
null >= 0; // -> true
λ§μ½ null >= 0
μ΄ μ€μ λ‘ true
μ΄λ©΄ μ΄λ»κ² null
μ΄ 0
κ³Ό κ°μ§λ μκ³ ν¬μ§λ μμκΉμ? (μ΄λ λ³΄λ€ μ μ κ²½μ°μλ λμΌνκ² μλν©λλ€.)
μ΄ μΈκ°μ§ μμ΄ νκ°λλ λ°©μμ λͺ¨λ λ€λ₯΄λ©° μκΈ°μΉ μμ λμλ€μ μμ±ν©λλ€.
첫째, μΆμ νλ± λΉκ΅ null == 0
μ
λλ€. μΌλ°μ μΌλ‘ μ΄ μ°μ°μκ° μμͺ½ κ°μ μ λλ‘ λΉκ΅ν μμμΌλ©΄ λ λ€ μ«μλ‘ λ³νν ν μ«μλ₯Ό λΉκ΅ν©λλ€. κ·Έλ¬λ©΄ λ€μ λμμ μμν μ μμ΅λλ€:
// This is not what happens
(null == 0 + null) == +0;
0 == 0;
true;
κ·Έλ¬λ specμ μμΈν μ½μ΄λ³΄λ©΄ μ«μ λ³νμ null
μ΄λ undefined
μ ν λ©΄μμλ μΌμ΄λμ§ μμ΅λλ€. κ·Έλ¬λ―λ‘ λ±νΈ νμͺ½μ null
μ΄ μμΌλ©΄ λ€λ₯Έ νμͺ½μ null
λλ undefined
κ° μμ΄μΌ true
λ₯Ό 리ν΄ν©λλ€. μ΄ κ²½μ° κ·Έλ μ§ μκΈ° λλ¬Έμfalse
μ 리ν΄ν©λλ€.
λ€μμ κ΄κ³ λΉκ΅ null > 0
μ
λλ€. μ¬κΈ°μ μκ³ λ¦¬μ¦μ μΆμ νλ± μ°μ°μμ λ¬λ¦¬ null
μ μ«μλ‘ λ³νν©λλ€. λ°λΌμ λ€μκ³Ό κ°μ λμμ΄ λ°μν©λλ€:
null > 0 + null = +0;
0 > 0;
false;
λ§μ§λ§μΌλ‘ κ΄κ³ λΉκ΅ null >= 0
μ
λλ€. μ΄ ννμ΄ null > 0 || null == 0
μ κ²°κ³ΌλΌκ³ μ£Όμ₯ν μ μλλ°, λ§μ½ κ·Έλ λ€λ©΄, μμ κ²°κ³Όλ μ΄ μμ false
λΌλ κ²μ μλ―Έν κ²μ
λλ€. κ·Έλ¬λ μ¬μ€ >=
μ°μ°μλ λ§€μ° λ€λ₯Έ λ°©μμΌλ‘ μλνλλ°, μ΄λ κΈ°λ³Έμ μΌλ‘ <
μ°μ°μμ λ°λλλ λ°©μμ
λλ€. μλ³΄λ€ ν° μ°μ°μλ₯Ό μ¬μ©ν μλ μ°μ°μλ³΄λ€ μκΈ° λλ¬Έμ μ΄ μμ μ€μ λ‘ λ€μκ³Ό κ°μ΄ νκ°λ©λλ€.
null >= 0;
!(null < 0);
!(+null < +0);
!(0 < 0);
!false;
true;
JavaScriptμμλ λ³μλ₯Ό λ€μ μ μΈν μ μμ΅λλ€:
a;
a;
// This is also valid
a, a;
strict λͺ¨λμμλ μλν©λλ€:
var a, a, a;
var a;
var a;
λͺ¨λ μ μκ° νλμ μ μλ‘ λ³ν©λ©λλ€.
μ«μ λ°°μ΄μ μ λ ¬ν΄μΌ νλ€κ³ μμν΄λ³΄μΈμ.
[ 10, 1, 3 ].sort() // -> [ 1, 10, 3 ]
κΈ°λ³Έ μ λ ¬ μμλ μμλ€μ λ¬Έμμ΄λ‘ λ³νν ν UTF-16 μ½λ λ¨μ κ°μ μνμ€λ₯Ό λΉκ΅ν λ μμ±λ©λλ€.
λ¬Έμμ΄ μ΄μΈμ μ λ ¬μ μλνλ©΄ comparefn
μ ν΅κ³Όμν€μΈμ.
[ 10, 1, 3 ].sort((a, b) => a - b) // -> [ 1, 3, 10 ]
const theObject = {
a: 7
};
const thePromise = new Promise((resolve, reject) => {
resolve(theObject);
}); // -> Promise instance object
thePromise.then(value => {
console.log(value === theObject); // -> true
console.log(value); // -> { a: 7 }
});
value
λ thePromise
μ ννκ² λ§νλ©΄ theObject
μμ ν΄κ²°λλ κ² μ
λλ€.
resolve
ν¨μμ λ λ€λ₯Έ Promise
λ₯Ό λ£λ κ²μ μ΄λ¨κΉμ?
const theObject = new Promise((resolve, reject) => {
resolve(7);
}); // -> Promise instance object
const thePromise = new Promise((resolve, reject) => {
resolve(theObject);
}); // -> Promise instance object
thePromise.then(value => {
console.log(value === theObject); // -> false
console.log(value); // -> 7
});
μ΄ ν¨μλ promise κ°μ κ°μ²΄μ μ€μ²©λ λ μ΄μ΄(μμ: 무μΈκ°λ‘ ν΄κ²°λλ promiseμΌλ‘ ν΄κ²°λλ promise)λ₯Ό λ¨μΌ λ μ΄μ΄λ‘ νννν©λλ€.
λͺ μΈμλ ECMAScript 25.6.1.3.2 Promise Resolve Functionsμ λλ€. νμ§λ§ κ·Έκ²μ μΈκ° μΉνμ μ΄μ§ μμ΅λλ€.
- wtfjs.com β a collection of those very special irregularities, inconsistencies and just plain painfully unintuitive moments for the language of the web.
- Wat β A lightning talk by Gary Bernhardt from CodeMash 2012
- What the... JavaScript? β Kyle Simpsons talk for Forward 2 attempts to βpull out the crazyβ from JavaScript. He wants to help you produce cleaner, more elegant, more readable code, then inspire people to contribute to the open source community.
Β© Denys Dovhan