Files
wtfjs/README-hi.md
2022-04-26 17:11:53 +03:00

94 KiB

f*ck рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреНрдпрд╛ рд╣реИ

WTFPL 2.0 NPM version

рдордЬрд╛рдХрд┐рдпрд╛ рдФрд░ рдореБрд╢реНрдХрд┐рд▓ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА

рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдПрдХ рдорд╣рд╛рди рднрд╛рд╖рд╛ рд╣реИред рдЗрд╕рдХрд╛ рдПрдХ рд╕рд░рд▓ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рд╣реИ, рдПрдХ рдмрдбрд╝рд╛ рдкрд╛рд░рд┐рд╕реНрдерд┐рддрд┐рдХреА рддрдВрддреНрд░, рдФрд░, рдЬреЛ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ, рдПрдХ рдорд╣рд╛рди рд╕рдореБрджрд╛рдпред

рдЙрд╕реА рд╕рдордп, рд╣рдо рд╕рднреА рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореБрд╢реНрдХрд┐рд▓ рднрд╛рдЧреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдлреА рдордЬрд╝реЗрджрд╛рд░ рднрд╛рд╖рд╛ рд╣реИред рдЙрдирдореЗрдВ рд╕реЗ рдХреБрдЫ рд╣рдорд╛рд░реА рд░реЛрдЬрд╝рдорд░реНрд░рд╛ рдХреА рдиреМрдХрд░реА рдХреЛ рдЬрд▓реНрджреА рд╕реЗ рдирд░рдХ рдореЗрдВ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдЙрдирдореЗрдВ рд╕реЗ рдХреБрдЫ рд╣рдореЗрдВ рдЬрд╝реЛрд░ рд╕реЗ рд╣рдБрд╕рд╛ рд╕рдХрддреЗ рд╣реИрдВред

WTFJS рдХреЗ рд▓рд┐рдП рдореВрд▓ рд╡рд┐рдЪрд╛рд░ рд╣реИ Brian Leroux. рдпрд╣ рд╕реВрдЪреА рдЙрдирдХреА рдмрд╛рддреЛрдВ рд╕реЗ рдкреНрд░реЗрд░рд┐рдд рд╣реИ тАЬWTFJSтАЭ at dotJS 2012:

dotJS 2012 - Brian Leroux - WTFJS

Node рдкреИрдХреЗрдЬреНрдб рдкрд╛рдВрдбреБрд▓рд┐рдкрд┐

рдЖрдк рдЗрд╕ рд╣реИрдВрдбрдмреБрдХ рдХреЛ npm рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣рд╛рдВ рдЬрд╛рдУ:

$ npm install -g wtfjs

рдЕрдм рдЖрдкрдХреЛ рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдкрд░ wtfjs рдЪрд▓рд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рдЖрдкрдХреЗ рдЪрдпрдирд┐рдд $ PAGER рдореЗрдВ рдореИрдиреБрдЕрд▓ рдХреЛ рдЦреЛрд▓реЗрдЧрд╛ред рдЕрдиреНрдпрдерд╛, рдЖрдк рдпрд╣рд╛рдВ рдкрдврд╝рдирд╛ рдЬрд╛рд░реА рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВред

рд╕реНрд░реЛрдд рдпрд╣рд╛рдВ рдЙрдкрд▓рдмреНрдз рд╣реИ: https://github.com/denysdovhan/wtfjs

Translations

Currently, there are these translations of wtfjs:

рдПрдХ рдФрд░ рдЕрдиреБрд╡рд╛рдж рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░реЗрдВ

Table of Contents

ЁЯТкЁЯП╗ рдкреНрд░реЗрд░рдгрд╛

рд╕рд┐рд░реНрдл рдордиреЛрд░рдВрдЬрди рдХреЗ рд▓рд┐рдП

тАФ тАЬрд╕рд┐рд░реНрдл рдордиреЛрд░рдВрдЬрди рдХреЗ рд▓рд┐рдП: рдПрдХреНрд╕реАрдбреЗрдВрдЯрд▓ рд░рд┐рд╡реЛрд▓реНрдпреВрд╢рдирд░реА рдХреА рдХрд╣рд╛рдиреАтАЭ, Linus Torvalds

рдЗрд╕ рд╕реВрдЪреА рдХрд╛ рдкреНрд░рд╛рдердорд┐рдХ рд▓рдХреНрд╖реНрдп рдХреБрдЫ рдкрд╛рдЧрд▓ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рдЗрдХрдЯреНрдард╛ рдХрд░рдирд╛ рдФрд░ рдпрд╣ рдмрддрд╛рдирд╛ рд╣реИ рдХрд┐ рдпрджрд┐ рд╕рдВрднрд╡ рд╣реЛ рддреЛ рд╡реЗ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред рд╕рд┐рд░реНрдл рдЗрд╕рд▓рд┐рдП рдХрд┐ рдХреБрдЫ рдРрд╕рд╛ рд╕реАрдЦрдирд╛ рдордЬреЗрджрд╛рд░ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдо рдкрд╣рд▓реЗ рдирд╣реАрдВ рдЬрд╛рдирддреЗ рдереЗред

рдпрджрд┐ рдЖрдк рдПрдХ рд╢реБрд░реБрдЖрддреА рд╣реИрдВ, рддреЛ рдЖрдк рдЗрди рдиреЛрдЯреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдЧрд╣рд░рд╛ рдЧреЛрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпреЗ рдиреЛрдЯреНрд╕ рдЖрдкрдХреЛ рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдкрдврд╝рдиреЗ рдореЗрдВ рдЕрдзрд┐рдХ рд╕рдордп рдмрд┐рддрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЗрд░рд┐рдд рдХрд░реЗрдВрдЧреЗред

рдпрджрд┐ рдЖрдк рдПрдХ рдкреЗрд╢реЗрд╡рд░ рдбреЗрд╡рд▓рдкрд░ рд╣реИрдВ, рддреЛ рдЖрдк рдЗрди рдЙрджрд╛рд╣рд░рдгреЛрдВ рдкрд░ рд╕рднреА рдЙрджреНрдзрд░рдгреЛрдВ рдФрд░ рд╣рдорд╛рд░реЗ рдкреНрд░рд┐рдп рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рдХрд┐рдирд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдорд╣рд╛рди рд╕рдВрджрд░реНрдн рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд┐рдЪрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ, рдмрд╕ рдЗрд╕реЗ рдкрдврд╝реЗрдВред рдЖрдк рд╢рд╛рдпрдж рдХреБрдЫ рдирдпрд╛ рдЦреЛрдЬрдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВред

тЬНЁЯП╗ рдиреЛрдЯреЗрд╢рди

// -> рдПрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ. рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:

1 + 1; // -> 2

// > рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╣реИ console.log рдпрд╛ рдХреЛрдИ рдЕрдиреНрдп рдЖрдЙрдЯрдкреБрдЯред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:

console.log("hello, world!"); // > hello, world!

// рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдХреЗ рд▓рд┐рдП рдЗрд╕реНрддреЗрдорд╛рд▓ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рдЯрд┐рдкреНрдкрдгреА рдорд╛рддреНрд░ рд╣реИред рдЙрджрд╛рд╣рд░рдг:

// Assigning a function to foo constant
const foo = function() {};

ЁЯСА рдЙрджрд╛рд╣рд░рдг

[] рдХреЗ рдмрд░рд╛рдмрд░![]

array рд╕рдорд╛рди рдирд╣реАрдВ рд╣реИ:

[] == ![]; // -> true

ЁЯТб рд╡реНрдпрд╛рдЦреНрдпрд╛:

рдЕрдореВрд░реНрдд рд╕рдорд╛рдирддрд╛ рдСрдкрд░реЗрдЯрд░ рдЙрдирдХреА рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджреЛрдиреЛрдВ рдкрдХреНрд╖реЛрдВ рдХреЛ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рджреЛрдиреЛрдВ рдкрдХреНрд╖ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдХрд╛рд░рдгреЛрдВ рд╕реЗ рд╕рдВрдЦреНрдпрд╛ 0 рдмрди рдЬрд╛рддреЗ рд╣реИрдВред рдПрд░реЗ рд╕рддреНрдп рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рджрд╛рдИрдВ рдУрд░, рдПрдХ рд╕рддреНрдп рдореВрд▓реНрдп рдХреЗ рд╡рд┐рдкрд░реАрдд рдЧрд▓рдд рд╣реИ, рдЬреЛ рддрдм 0 рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рд╣реИред рдмрд╛рдИрдВ рдУрд░, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдПрдХ рдЦрд╛рд▓реА рд╕рд░рдгреА рдкрд╣рд▓реЗ рдПрдХ рдмреВрд▓рд┐рдпрди рдмрдирдиреЗ рдХреЗ рдмрд┐рдирд╛ рдПрдХ рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХреА рдЬрд╛рддреА рд╣реИ, рдФрд░ рдЦрд╛рд▓реА рд╕рд░рдгрд┐рдпреЛрдВ рдХреЛ рд╕рддреНрдп рд╣реЛрдиреЗ рдХреЗ рдмрд╛рд╡рдЬреВрдж 0 рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдпрд╣ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╕рд░рд▓ рд╣реИ:

+[] == +![];
0 == +false;
0 == 0;
true;

See also [] is truthy, but not true.

true is not equal ![], but not equal [] too

Array рдмрд░рд╛рдмрд░ рдирд╣реАрдВ рд╣реИ true, рд▓реЗрдХрд┐рди Array рдмрд░рд╛рдмрд░ рдирд╣реАрдВ рд╣реИ true рднреА рдирд╣реАрдВ; Array рдмрд░рд╛рдмрд░ рд╣реИ 'false', Array рдмрд░рд╛рдмрд░ рд╣реИ 'false' рднреА:

true == []; // -> false
true == ![]; // -> false

false == []; // -> true
false == ![]; // -> true

ЁЯТб рд╡реНрдпрд╛рдЦреНрдпрд╛:

true == []; // -> false
true == ![]; // -> false

// рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдХреЗ рдЕрдиреБрд╕рд╛рд░

true == []; // -> false

toNumber(true); // -> 1
toNumber([]); // -> 0

1 == 0; // -> false

true == ![]; // -> false

![]; // -> false

true == false; // -> false
false == []; // -> true
false == ![]; // -> true

// рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдХреЗ рдЕрдиреБрд╕рд╛рд░

false == []; // -> true

toNumber(false); // -> 0
toNumber([]); // -> 0

0 == 0; // -> true

false == ![]; // -> false

![]; // -> false

false == false; // -> true

true is false

!!"false" == !!"true"; // -> true
!!"false" === !!"true"; // -> true

ЁЯТб рд╡реНрдпрд╛рдЦреНрдпрд╛:

Consider this step-by-step:

// 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

baNaNa

"b" + "a" + +"a" + "a"; // -> 'baNaNa'

рдпрд╣ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдПрдХ рдкреБрд░рд╛рдиреЗ рд╕реНрдХреВрд▓ рдХрд╛ рдордЬрд╛рдХ рд╣реИ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рд╕реЗ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рдпрд╣рд╛рдБ рдореВрд▓ рдПрдХ рд╣реИ:

"foo" + +"bar"; // -> 'fooNaN'

ЁЯТб рд╡реНрдпрд╛рдЦреНрдпрд╛:

рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди 'рдлреВ' + (+ 'рдмрд╛рд░') рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП 'рдмрд╛рд░'` рдХреЛ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддрд╛ рд╣реИред

NaN is not a NaN

NaN === NaN; // -> false

ЁЯТб рд╡реНрдпрд╛рдЦреНрдпрд╛:

рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдЗрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рдкреАрдЫреЗ рддрд░реНрдХ рдХреЛ рд╕рдЦреНрддреА рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ:

  1. If Type(x) is different from Type(y), return false.
  2. If Type(x) is Number, then
    1. If x is NaN, return false.
    2. If y is NaN, return false.
    3. тАж тАж тАж

тАФ 7.2.14 рд╕рдЦреНрдд рд╕рдорд╛рдирддрд╛ рдХреА рддреБрд▓рдирд╛

Following the definition of NaN from the IEEE:

рдЪрд╛рд░ рдкрд░рд╕реНрдкрд░ рдЕрдирдиреНрдп рд╕рдВрдмрдВрдз рд╕рдВрднрд╡ рд╣реИрдВ: рд╕реЗ рдХрдо, рдмрд░рд╛рдмрд░, рдЕрдзрд┐рдХ рд╕реЗ рдЕрдзрд┐рдХ, рдФрд░ рдЕрд╡реНрдпрд╡рд╕реНрдерд┐рддред рдЖрдЦрд┐рд░реА рдорд╛рдорд▓рд╛ рддрдм рдЙрдарддрд╛ рд╣реИ рдЬрдм рдХрдо рд╕реЗ рдХрдо рдПрдХ рдСрдкрд░реЗрдВрдб NaN рд╣реЛрддрд╛ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ NaN рдЕрдкрдиреЗ рдЖрдк рд╕рд╣рд┐рдд рд╣рд░ рдЪреАрдЬ рдХреЗ рд╕рд╛рде рдЕрдирд┐рдпрдВрддреНрд░рд┐рдд рдХреА рддреБрд▓рдирд╛ рдХрд░реЗрдЧрд╛ред

тАФ тАЬIEEE754 NaN рдорд╛рдиреЛрдВ рдХреЗ рд▓рд┐рдП рдЭреВрдареА рд╡рд╛рдкрд╕реА рдХрд░рдиреЗ рд╡рд╛рд▓реА рд╕рднреА рддреБрд▓рдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рддрд░реНрдХ рдХреНрдпрд╛ рд╣реИ?тАЭ at StackOverflow

рдпрд╣ рд╡рд┐рдлрд▓ рд╣реИ

рдЖрдкрдХреЛ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдирд╣реАрдВ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди тАж

(![] + [])[+[]] +
  (![] + [])[+!+[]] +
  ([![]] + [][[]])[+!+[] + [+[]]] +
  (![] + [])[!+[] + !+[]];
// -> 'fail'

ЁЯТб рд╡реНрдпрд╛рдЦреНрдпрд╛:

рдкреНрд░рддреАрдХреЛрдВ рдХреЗ рдЙрд╕ рджреНрд░рд╡реНрдпрдорд╛рди рдХреЛ рдЯреБрдХрдбрд╝реЛрдВ рдореЗрдВ рддреЛрдбрд╝рдХрд░, рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдирд┐рдореНрди рдкреИрдЯрд░реНрди рдЕрдХреНрд╕рд░ рд╣реЛрддрд╛ рд╣реИ:

![] + []; // -> 'false'
![]; // -> false

рдЗрд╕рд▓рд┐рдП рд╣рдо [] рдХреЛ рдЧрд▓рдд рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдХрдИ рдЖрдВрддрд░рд┐рдХ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХреЗ рдХрд╛рд░рдг (рдмрд╛рдЗрдирд░реА + рдСрдкрд░реЗрдЯрд░ -> ToPrimitive -> [[DefaultValue]]) рд╣рдо рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рд╕рд╣реА рдСрдкрд░реЗрдВрдб рдХреЛ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддреЗ рд╣реИрдВ:

![] + [].toString(); // 'false'

рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рд╕рд░рдгреА рдХреЗ рд░реВрдк рдореЗрдВ рд╕реЛрдЪрдХрд░ рд╣рдо рдЗрд╕рдХреЗ рдкрд╣рд▓реЗ рдЪрд░рд┐рддреНрд░ рддрдХ рдкрд╣реБрдВрдЪ рд╕рдХрддреЗ рд╣реИрдВ [0]:

"false"[0]; // -> 'f'

рдмрд╛рдХреА рд╕реНрдкрд╖реНрдЯ рд╣реИ, рд▓реЗрдХрд┐рди i рдореБрд╢реНрдХрд┐рд▓ рд╣реИред рд╡рд┐рдлрд▓ 'рдореЗрдВ i рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рдЙрддреНрдкрдиреНрди рдХрд░рдХреЗ' 'falseundefined' рдХреЛ рдкрдХрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рд╕реВрдЪрдХрд╛рдВрдХ рдкрд░ рддрддреНрд╡ рдХреЛ рдкрдХрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ [' 10 ']'

[] is truthy, but not true

рдПрдХ рд╕рд░рдгреА рдПрдХ рд╕рддреНрдп рдореВрд▓реНрдп рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рд╕рддреНрдп рдХреЗ рдмрд░рд╛рдмрд░ рдирд╣реАрдВ рд╣реИред

!![]       // -> true
[] == true // -> false

ЁЯТб рд╡реНрдпрд╛рдЦреНрдпрд╛:

рдпрд╣рд╛рдБ ECMA-262 рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдореЗрдВ рд╕рдВрдмрдВрдзрд┐рдд рд╡рд░реНрдЧреЛрдВ рдХреЗ рд▓рд┐рдВрдХ рджрд┐рдП рдЧрдП рд╣реИрдВ:

null is falsy, but not false

рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ null рдПрдХ рдорд┐рдереНрдпрд╛ рдореВрд▓реНрдп рд╣реИ, рдпрд╣ false рдХреЗ рдмрд░рд╛рдмрд░ рдирд╣реАрдВ рд╣реИред

!!null; // -> false
null == false; // -> false

рдЗрд╕реА рд╕рдордп, рдЕрдиреНрдп рдЭреВрдареЗ рдореВрд▓реНрдп, рдЬреИрд╕реЗ 0 рдпрд╛ `` `` рдЭреВрда рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИрдВред

0 == false; // -> true
"" == false; // -> true

ЁЯТб рд╡реНрдпрд╛рдЦреНрдпрд╛:

рд╡рд┐рд╡рд░рдг рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рдорд╛рди рд╣реИред рдпрд╣рд╛рдБ рдЗрд╕реА рд▓рд┐рдВрдХ рд╣реИ:

document.all is an object, but it is undefined

тЪая╕П рдпрд╣ рдмреНрд░рд╛рдЙрдЬрд╝рд░ API рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ рдФрд░ рдпрд╣ Node.js рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛тЪая╕П

рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ document.all рдПрдХ рд╕рд░рдгреА рдЬреИрд╕реА рд╡рд╕реНрддреБ рд╣реИ рдФрд░ рдпрд╣ рдкреГрд╖реНрда рдореЗрдВ DOM рдиреЛрдбреНрд╕ рддрдХ рдкрд╣реБрдБрдЪ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рдпрд╣ рдЯрд╛рдЗрдкреЛрдл рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рджреЗрддрд╛ рд╣реИред

document.all instanceof Object; // -> true
typeof document.all; // -> 'undefined'

рдЗрд╕реА рд╕рдордп, document.all`` рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рдХреЗ рдмрд░рд╛рдмрд░ рдирд╣реАрдВ рд╣реИред

document.all === undefined; // -> false
document.all === null; // -> false

But at the same time:

document.all == null; // -> true

ЁЯТб рд╡реНрдпрд╛рдЦреНрдпрд╛:

document.all рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ IE рдХреЗ рдкреБрд░рд╛рдиреЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рд╕рд╛рде DOM рддрддреНрд╡реЛрдВ рдХреЛ рдПрдХреНрд╕реЗрд╕ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣реБрдЖ рдХрд░рддрд╛ рдерд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдХрднреА рднреА рдПрдХ рдорд╛рдирдХ рдирд╣реАрдВ рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рд╡реГрджреНрдзрд╛рд╡рд╕реНрдерд╛ рдХреЗ рдЬреЗрдПрд╕ рдХреЛрдб рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рдерд╛ред рдЬрдм рдорд╛рдирдХ рдирдП рдПрдкреАрдЖрдИ (рдЬреИрд╕реЗ document.getElementById) рдХреЗ рд╕рд╛рде рдЖрдЧреЗ рдмрдврд╝рд╛, рддреЛ рдпрд╣ рдПрдкреАрдЖрдИ рдХреЙрд▓ рдЕрдкреНрд░рдЪрд▓рд┐рдд рд╣реЛ рдЧрдИ рдФрд░ рдорд╛рдирдХ рд╕рдорд┐рддрд┐ рдХреЛ рддрдп рдХрд░рдирд╛ рдерд╛ рдХрд┐ рдЗрд╕рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реИред рдЗрд╕рдХреЗ рд╡реНрдпрд╛рдкрдХ рдЙрдкрдпреЛрдЧ рдХреЗ рдХрд╛рд░рдг рдЙрдиреНрд╣реЛрдВрдиреЗ рдПрдкреАрдЖрдИ рд░рдЦрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдХреЗ рд╡рд┐рд▓рдлреБрд▓ рдЙрд▓реНрд▓рдВрдШрди рдХрд╛ рдкрд░рд┐рдЪрдп рджрд┐рдпрд╛ред рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдкрд░ рдХрд╛рд░рдг рдЭреВрда рдХрд╛ рдЬрд╡рд╛рдм рджреЗрддрд╛ рд╣реИ Strict Equality Comparison with undefined while true when using the Abstract Equality Comparison рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдХрд┐ рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдХреЗ рд╡рд┐рд▓рдлреБрд▓ рдЙрд▓реНрд▓рдВрдШрди рдХреЗ рдХрд╛рд░рдг рд╣реИред

тАФ тАЬObsolete features - document.allтАЭ at WhatWG - HTML spec тАФ тАЬChapter 4 - ToBoolean - Falsy valuesтАЭ at YDKJS - Types & Grammar

рдиреНрдпреВрдирддрдо рдорд╛рди рд╢реВрдиреНрдп рд╕реЗ рдЕрдзрд┐рдХ рд╣реИ

Number.MIN_VALUE рд╕рдмрд╕реЗ рдЫреЛрдЯреА рд╕рдВрдЦреНрдпрд╛ рд╣реИ, рдЬреЛ рд╢реВрдиреНрдп рд╕реЗ рдЕрдзрд┐рдХ рд╣реИ:

Number.MIN_VALUE > 0; // -> true

ЁЯТб рд╡реНрдпрд╛рдЦреНрдпрд╛:

рдирдВрдмрд░ .IN_VALUE`` 5e-324 рд╣реИ, рдпрд╛рдиреА рд╕рдмрд╕реЗ рдЫреЛрдЯреА рдзрдирд╛рддреНрдордХ рд╕рдВрдЦреНрдпрд╛ рдЬрд┐рд╕реЗ рдлреНрд▓реЛрдЯ рдкреНрд░рд┐рд╕рд┐рдЬрди рдХреЗ рднреАрддрд░ рджрд░реНрд╢рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдпрд╛рдиреА рдХрд┐ рдЖрдк рд╢реВрдиреНрдп рдХреЗ рдЬрд┐рддрдирд╛ рдХрд░реАрдм рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫреЗ рд░рд┐рдЬрд╝реЙрд▓реНрдпреВрд╢рди рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬреЛ рддреИрд░рддрд╛ рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рджреЗ рд╕рдХрддрд╛ рд╣реИ

рдЕрдм рдХреБрд▓ рдорд┐рд▓рд╛рдХрд░ рд╕рдмрд╕реЗ рдЫреЛрдЯрд╛ рдореВрд▓реНрдп рд╣реИ рдирдВрдмрд░.рдиреИрдЧреЗрдЯрд┐рд╡_рдЗрдирдлрд┐рдирд┐рдЯреА рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдПрдХ рд╕рдЦреНрдд рдЕрд░реНрде рдореЗрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдирд╣реАрдВ рд╣реИред

тАФ тАЬWhy is 0 less than Number.MIN_VALUE in JavaScript?тАЭ at StackOverflow

рдлрдВрдХреНрд╢рди рдХреЛрдИ рдлрдВрдХреНрд╢рди рдирд╣реАрдВ рд╣реИ

тЪая╕П V8 v5.5 рдпрд╛ рдирд┐рдореНрди рдореЗрдВ рдореМрдЬреВрдж рдмрдЧ (Node.js <= 7)тЪая╕П

рдЖрдк рд╕рднреА рдХреЛ рдкрддрд╛ рд╣реИ рдХрд┐ рдХрд╖реНрдЯрдкреНрд░рдж undefined рдПрдХ function рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛?

// Declare a class which extends null
class Foo extends null {}
// -> [Function: Foo]

new Foo() instanceof null;
// > TypeError: function is not a function
// >     at тАж тАж тАж

ЁЯТб рд╡реНрдпрд╛рдЦреНрдпрд╛:

рдпрд╣ рд╕реНрдкреЗрд╕рд┐рдлрд┐рдХреЗрд╢рди рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдирд╣реАрдВ рд╣реИред рдпрд╣ рдХреЗрд╡рд▓ рдПрдХ рдмрдЧ рд╣реИ рдЬрд┐рд╕реЗ рдЕрдм рдареАрдХ рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдЗрд╕рдХреЗ рд╕рд╛рде рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред

Adding arrays

рдпрджрд┐ рдЖрдк рджреЛ рд╕рд░рдгрд┐рдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдХреНрдпрд╛ рд╣реЛрдЧрд╛?

[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(); // -> ',,'

ЁЯТб рд╡реНрдпрд╛рдЦреНрдпрд╛:

Trailing commas (рдХрднреА-рдХрднреА "рдЕрдВрддрд┐рдо рдХреЙрдорд╛" рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ) рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛрдб рдореЗрдВ рдирдП рддрддреНрд╡реЛрдВ, рдорд╛рдкрджрдВрдбреЛрдВ рдпрд╛ рдЧреБрдгреЛрдВ рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╕рдордп рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдПрдХ рдирдИ рд╕рдВрдкрддреНрддрд┐ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдмрд╕ рдкрд┐рдЫрд▓реА рдкрдВрдХреНрддрд┐ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд┐рдП рдмрд┐рдирд╛ рдПрдХ рдирдИ рд░реЗрдЦрд╛ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ рдпрджрд┐ рд╡рд╣ рд░реЗрдЦрд╛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рдЕрд▓реНрдкрд╡рд┐рд░рд╛рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИред рдЗрд╕рд╕реЗ рд╕рдВрд╕реНрдХрд░рдг-рдирд┐рдпрдВрддреНрд░рдг рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдПрдбрд┐рдЯрд┐рдВрдЧ рдХреЛрдб рдХрдо рдкрд░реЗрд╢рд╛рдиреА рд╡рд╛рд▓рд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

тАФ Trailing commas at MDN

рдРрд░реЗ рд╕рдорд╛рдирддрд╛ рдПрдХ рд░рд╛рдХреНрд╖рд╕ рд╣реИ

JS рдореЗрдВ Array рд╕рдорд╛рдирддрд╛ рдПрдХ рд░рд╛рдХреНрд╖рд╕ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдиреАрдЪреЗ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ:

[] == ''   // -> 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 Abstract Equality Comparison of the specification.

undefined and Number

рдпрджрд┐ рд╣рдо рдирдВрдмрд░ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ рдХреЛрдИ рддрд░реНрдХ рдирд╣реАрдВ рджреЗрддреЗ рд╣реИрдВ, рддреЛ рд╣рдо 0 рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВрдЧреЗред рдорд╛рди 'рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд' рдХреЛ рдФрдкрдЪрд╛рд░рд┐рдХ рддрд░реНрдХреЛрдВ рдХреЗ рд▓рд┐рдП рд╕реМрдВрдкрд╛ рдЧрдпрд╛ рд╣реИ рдЬрдм рдХреЛрдИ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рддрд░реНрдХ рдирд╣реАрдВ рд╣реИрдВ, рддреЛ рдЖрдк рдЙрдореНрдореАрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдмрд┐рдирд╛ рддрд░реНрдХ рдХреЗ рд╕рдВрдЦреНрдпрд╛ рдЕрдкрдиреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рдорд╛рди рдХреЗ рд░реВрдк рдореЗрдВрдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд 'рд▓реЗрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЬрдм рд╣рдордЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо NaN` рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВрдЧреЗред

Number(); // -> 0
Number(undefined); // -> NaN

ЁЯТб рд╡реНрдпрд╛рдЦреНрдпрд╛:

рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдХреЗ рдЕрдиреБрд╕рд╛рд░:

  1. рдпрджрд┐ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЖрд╣реНрд╡рд╛рди рдкрд░ рдХреЛрдИ рддрд░реНрдХ рдирд╣реАрдВ рджрд┐рдпрд╛ рдЧрдпрд╛, рддреЛ n рдХреЛ + 0 рд╣реЛрдиреЗ рджреЗрдВред
  2. рдФрд░, рдЪрд▓реЛ n рд╣реЛ? ToNumber (рдорд╛рди)ред
  3. рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ,ToNumber (рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд)рдХреЛ NaN рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

Here's the corresponding section:

parseInt рдПрдХ рдмреБрд░рд╛ рдЖрджрдореА рд╣реИ

parseInt рдЕрдкрдиреЗ quirks рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╕рд┐рджреНрдз рд╣реИ:

parseInt("f*ck"); // -> NaN
parseInt("f*ck", 16); // -> 15

ЁЯТб рд╡реНрдпрд╛рдЦреНрдпрд╛: рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реЛрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ parseInt рдЪрд░рд┐рддреНрд░-рджрд░-рдЪрд░рд┐рддреНрд░ рдХреЛ рддрдм рддрдХ рдЬрд╛рд░реА рд░рдЦреЗрдЧрд╛, рдЬрдм рддрдХ рдХрд┐ рд╡рд╣ рдПрдХ рдЪрд░рд┐рддреНрд░ рдХреЛ рд╣рд┐рдЯ рди рдХрд░ рджреЗ, рдЬреЛ рдЙрд╕реЗ рдкрддрд╛ рдирд╣реАрдВ рд╣реИред F in 'f * ck' рд╣реЗрдХреНрд╕рд╛рдбреЗрд╕рд┐рдорд▓ рдЕрдВрдХ 15 рд╣реИред

рдкреВрд░реНрдгрд╛рдВрдХ рдХреЗ рд▓рд┐рдП рдЗрдиреНрдлрд┐рдирд┐рдЯреА рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдирд╛ рдХреБрдЫтАж

//
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

Be careful with parsing null too:

parseInt(null, 24); // -> 23

ЁЯТб рд╡реНрдпрд╛рдЦреНрдпрд╛:

рдпрд╣ null рдХреЛ рд╕реНрдЯреНрд░рд┐рдВрдЧ nullтАЭ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд░рд╣рд╛ рд╣реИред 23 рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдореВрд▓рд╛рдВрдХ 0 рдХреЗ рд▓рд┐рдП, рдРрд╕реЗ рдХреЛрдИ рдЕрдВрдХ рдирд╣реАрдВ рд╣реИрдВ рдЬреЛ рдЗрд╕реЗ рд░реВрдкрд╛рдВрддрд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдпрд╣ NaN рд▓реМрдЯрд╛рддрд╛ рд╣реИред 24 рдореЗрдВ, 14 рд╡реЗрдВ рдЕрдХреНрд╖рд░ `` рдПрди '', рдХреЛ рдЕрдВрдХ рдкреНрд░рдгрд╛рд▓реА рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИред 31 рдкрд░, 21 рд╡реЗрдВ рдЕрдХреНрд╖рд░ `` рдпреВ '' рдХреЛ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдкреВрд░реЗ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рдбрд┐рдХреЛрдб рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред 37 рдкрд░ рдЕрдм рдХреЛрдИ рд╡реИрдз рдЕрдВрдХ рд╕реЗрдЯ рдирд╣реАрдВ рд╣реИ рдЬреЛ рдЙрддреНрдкрдиреНрди рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ NaN` рдХреЛ рд▓реМрдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

тАФ тАЬparseInt(null, 24) === 23тАж wait, what?тАЭ at StackOverflow

рдЕрд╖реНрдЯрдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдордд рднреВрд▓рдирд╛:

parseInt("06"); // 6
parseInt("08"); // 8 if support ECMAScript 5
parseInt("08"); // 0 if not support ECMAScript 5

**ЁЯТб рд╡реНрдпрд╛рдЦреНрдпрд╛:**рдпрджрд┐ рдЗрдирдкреБрдЯ рд╕реНрдЯреНрд░рд┐рдВрдЧ "0" рд╕реЗ рд╢реБрд░реВ рд╣реЛрддреА рд╣реИ, рддреЛ рдореВрд▓рд╛рдВрдХ рдЖрда (рдЕрд╖реНрдЯрдХ) рдпрд╛ 10 (рджрд╢рдорд▓рд╡) рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЬреЛ рдореВрд▓рд╛рдВрдХ рдЪреБрдирд╛ рдЧрдпрд╛ рд╣реИ рд╡рд╣ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди-рдирд┐рд░реНрднрд░ рд╣реИред ECMAScript 5 рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддрд╛ рд╣реИ рдХрд┐ 10 (рджрд╢рдорд▓рд╡) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рднреА рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдЕрднреА рддрдХ рдЗрд╕рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕ рдХрд╛рд░рдг рд╕реЗ parseInt рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рд╣рдореЗрд╢рд╛ рдПрдХ рдореВрд▓рд╛рдВрдХ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВред

parseInt always convert input to string:

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 рдФрд░ рдкрд╛рд░реНрд╕реЗрдЗрдВрдЯ`` 0 рджреЗрддрд╛ рд╣реИред рдЬрдм 0.0000001 рдХреЛ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рдЗрд╕реЗ'1e-7' 'рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рд▓рд┐рдПparseInt 1` рджреЗрддрд╛ рд╣реИред `1 / 1999999` рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛` 5.00000250000125e-7` рдФрд░ `рдкрд╛рд░реНрд╕реЗрдЗрдВрдЯ 5` рдХреЗ рд░реВрдк рдореЗрдВ рдХреА рдЬрд╛рддреА рд╣реИред

рд╕рддреНрдп рдФрд░ рдЕрд╕рддреНрдп рдХреЗ рд╕рд╛рде рдЧрдгрд┐рдд

рдЪрд▓реЛ рдХреБрдЫ рдЧрдгрд┐рдд рдХрд░рддреЗ рд╣реИрдВ:

true +
  true(
    // -> 2
    true + true
  ) *
    (true + true) -
  true; // -> 3

рд╣рдордордо ... ЁЯдФ

ЁЯТб рд╡реНрдпрд╛рдЦреНрдпрд╛:

рд╣рдо рдорд╛рдиреЛрдВ рдХреЛ 'рд╕рдВрдЦреНрдпрд╛' рдирд┐рд░реНрдорд╛рддрд╛ рдХреЗ рд╕рд╛рде рд╕рдВрдЦреНрдпрд╛рдУрдВ рдореЗрдВ рднрд┐рдиреНрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдХрд╛рдлреА рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рд╕рдЪ`` 1 рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛:

Number(true); // -> 1

рдпреВрдиреАрд░реА рдкреНрд▓рд╕ рдСрдкрд░реЗрдЯрд░ рдЕрдкрдиреЗ рдореВрд▓реНрдп рдХреЛ рдПрдХ рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдмрджрд▓рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдкреВрд░реНрдгрд╛рдВрдХреЛрдВ рдФрд░ рдлрд╝реНрд▓реЛрдЯреНрд╕ рдХреЗ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдЕрднреНрдпрд╛рд╡реЗрджрди рдХреЛ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рд╕рд╛рде рд╣реА рд╕рд╛рде рдЧреИрд░-рд╕реНрдЯреНрд░рд┐рдВрдЧ рдорд╛рди рд╕рддреНрдп, рдЕрд╕рддреНрдп, рдФрд░ рдЕрд╢рдХреНрддред рдпрджрд┐ рдпрд╣ рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рдореВрд▓реНрдп рдХреЛ рдкрд╛рд░реНрд╕ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рдпрд╣ NaN рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░реЗрдЧрд╛ред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╣рдо рд╕рдЪ рдХреЛ 1 рдЖрд╕рд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

+true; // -> 1

рдЬрдм рдЖрдк рдЬреЛрдбрд╝ рдпрд╛ рдЧреБрдгрд╛ рдХрд░ рд░рд╣реЗ рд╣реЛрддреЗ рд╣реИрдВ, рддреЛ ToNumber рд╡рд┐рдзрд┐ рд▓рд╛рдЧреВ рд╣реЛрддреА рд╣реИред рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдпрд╣ рд╡рд┐рдзрд┐ рд╡рд╛рдкрд╕ рдЖрддреА рд╣реИ:

If argument is true, return 1. If argument is false, return +0.

рдЗрд╕рд▓рд┐рдП рд╣рдо рдмреВрд▓рд┐рдпрди рдореВрд▓реНрдпреЛрдВ рдХреЛ рдирд┐рдпрдорд┐рдд рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╕рд╣реА рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рд╕рдВрдЧрдд рдЕрдиреБрднрд╛рдЧ:

HTML рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдорд╛рдиреНрдп рд╣реИрдВ

рдЖрдк рдкреНрд░рднрд╛рд╡рд┐рдд рд╣реЛрдВрдЧреЗ, рд▓реЗрдХрд┐рди <! - (рдЬрд┐рд╕реЗ HTML рдЯрд┐рдкреНрдкрдгреА рдХреЗ рд░реВрдк рдореЗрдВ рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ) рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдПрдХ рдорд╛рдиреНрдп рдЯрд┐рдкреНрдкрдгреА рд╣реИред

// valid comment
<!-- valid comment too

ЁЯТб рд╡реНрдпрд╛рдЦреНрдпрд╛:

Impressed? HTML рдЬреИрд╕реА рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рдЙрди рдмреНрд░рд╛рдЙрдЬрд╝рд░реЛрдВ рдХреЛ рдЕрдиреБрдорддрд┐ рджреЗрдирд╛ рдерд╛ рдЬреЛ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрддреЗ рдереЗ<script> рд╕реБрдВрджрд░ рдврдВрдЧ рд╕реЗ рдиреАрдЪрд╛ рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЯреИрдЧред рдпреЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░, рдЙрджрд╛ред рдиреЗрдЯрд╕реНрдХреЗрдк 1.x рдЕрдм рд▓реЛрдХрдкреНрд░рд┐рдп рдирд╣реАрдВ рд╣реИрдВред рддреЛ рдЕрдм рдЖрдкрдХреЗ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЯреИрдЧ рдореЗрдВ HTML рдХрдореЗрдВрдЯреНрд╕ рдбрд╛рд▓рдиреЗ рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИред

рдЪреВрдВрдХрд┐ Node.js V8 рдЗрдВрдЬрди рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ, рдЗрд╕рд▓рд┐рдП HTML- рдЬреИрд╕реА рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдВ Node.js рд░рдирдЯрд╛рдЗрдо рджреНрд╡рд╛рд░рд╛ рднреА рд╕рдорд░реНрдерд┐рдд рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╡реЗ рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдХрд╛ рдПрдХ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИрдВ:

NaN is not a number

Type of NaN is a 'number':

typeof NaN; // -> 'number'

ЁЯТб рд╡реНрдпрд╛рдЦреНрдпрд╛:

рд╡реНрдпрд╛рдЦреНрдпрд╛s of how typeof and instanceof operators work:

[] and null are objects

typeof []; // -> 'object'
typeof null; // -> 'object'

// however
null instanceof Object; // false

ЁЯТб рд╡реНрдпрд╛рдЦреНрдпрд╛:

рд╡рд┐рдирд┐рд░реНрджреЗрд╢рди рдХреЗ рдЗрд╕ рднрд╛рдЧ рдореЗрдВ `рдЯрд╛рдЗрдкреЛрдлрд╝ 'рдСрдкрд░реЗрдЯрд░ рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

рд╡рд┐рдирд┐рд░реНрджреЗрд╢рди рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдЯрд╛рдЗрдкрдСрдлрд╝ рдСрдкрд░реЗрдЯрд░ [рддрд╛рд▓рд┐рдХрд╛ 35:рдЯрд╛рдЗрдкреЛрдлрд╝рдСрдкрд░реЗрдЯрд░ рдкрд░рд┐рдгрд╛рдо] (https://www.ecma-international.org/ecma-262/#table-35) рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд▓реМрдЯрд╛рддрд╛ рд╣реИред Null, рд╕рд╛рдзрд╛рд░рдг, рдорд╛рдирдХ рд╡рд┐рджреЗрд╢реА рдФрд░ рдЧреИрд░-рдорд╛рдирдХ рд╡рд┐рджреЗрд╢реА рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд▓рд┐рдП, рдЬреЛ[[рдХреЙрд▓]]рдХреЛ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рдпрд╣ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдСрдмреНрдЬреЗрдХреНрдЯ`` рд▓реМрдЯрд╛рддрд╛ рд╣реИред

рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЖрдк toString рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреА рдЬрд╛рдБрдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

Object.prototype.toString.call([]);
// -> '[object Array]'

Object.prototype.toString.call(new Date());
// -> '[object Date]'

Object.prototype.toString.call(null);
// -> '[object Null]'

Magically increasing numbers

999999999999999; // -> 999999999999999
9999999999999999; // -> 10000000000000000

10000000000000000; // -> 10000000000000000
10000000000000000 + 1; // -> 10000000000000000
10000000000000000 + 1.1; // -> 10000000000000002

ЁЯТб рд╡реНрдпрд╛рдЦреНрдпрд╛:

рдпрд╣ рдмрд╛рдЗрдирд░реА рдлреНрд▓реЛрдЯрд┐рдВрдЧ-рдкреЙрдЗрдВрдЯ рдЕрдВрдХрдЧрдгрд┐рдд рдХреЗ рд▓рд┐рдП IEEE 754-2008 рдорд╛рдирдХ рдХреЗ рдХрд╛рд░рдг рд╣реЛрддрд╛ рд╣реИред рдЗрд╕ рдкреИрдорд╛рдиреЗ рдкрд░, рдпрд╣ рдирд┐рдХрдЯрддрдо рд╕рдо рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдЧреЛрд▓ рд╣реЛрддрд╛ рд╣реИред рдЕрдзрд┐рдХ рдкрдврд╝реЗрдВ:

Precision of 0.1 + 0.2

A well-known joke. An addition of 0.1 and 0.2 is deadly precise:

0.1 +
  0.2(
    // -> 0.30000000000000004
    0.1 + 0.2
  ) ===
  0.3; // -> false

ЁЯТб рд╡реНрдпрд╛рдЦреНрдпрд╛:

The answer for the тАЭIs floating point math broken?тАЭ question on StackOverflow:

рдЖрдкрдХреЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ рд╕реНрдерд┐рд░рд╛рдВрдХ 0.2 рдФрд░ 0.3 рднреА рдЙрдирдХреЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдореВрд▓реНрдпреЛрдВ рдХреЗ рд╕рдиреНрдирд┐рдХрдЯрди рд╣реЛрдВрдЧреЗред рдРрд╕рд╛ рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдирд┐рдХрдЯрддрдо рдбрдмрд▓ рд╕реЗ 0.2 рддрд░реНрдХрд╕рдВрдЧрдд рд╕рдВрдЦреНрдпрд╛ 0.2 рд╕реЗ рдмрдбрд╝рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдирд┐рдХрдЯрддрдо рдбрдмрд▓ рд╕реЗ 0.3 рддрд░реНрдХрд╕рдВрдЧрдд рд╕рдВрдЦреНрдпрд╛ 0.3 рд╕реЗ рдЫреЛрдЯрд╛ рд╣реИред 0.1 рдФрд░ 0.2 рд╣рд╡рд╛рдУрдВ рдХрд╛ рдпреЛрдЧ рддрд░реНрдХрд╕рдВрдЧрдд рд╕рдВрдЦреНрдпрд╛ 0.3 рд╕реЗ рдмрдбрд╝рд╛ рд╣реИ рдФрд░ рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЗ рдХреЛрдб рдореЗрдВ рдирд┐рд░рдВрддрд░рддрд╛ рд╕реЗ рдЕрд╕рд╣рдордд рд╣реИред

рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдЗрддрдиреА рдЬреНрдЮрд╛рдд рд╣реИ рдХрд┐ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдПрдХ рд╡реЗрдмрд╕рд╛рдЗрдЯ рднреА рд╣реИ рдЬрд┐рд╕рдХрд╛ рдирд╛рдо [0.30000000000000004.com] (http://0.30000000000000004.com/) рд╣реИред рдпрд╣ рд╣рд░ рднрд╛рд╖рд╛ рдореЗрдВ рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рдлрд╝реНрд▓реЛрдЯрд┐рдВрдЧ рдкреЙрдЗрдВрдЯ рдЧрдгрд┐рдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рди рдХрд┐ рдХреЗрд╡рд▓ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯред

рдкреИрдЪрд┐рдВрдЧ рдирдВрдмрд░

рдЖрдк рд░реИрдкрд░ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЛ рдирдВрдмрд░ рдпрд╛ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдЬреИрд╕реЗ рддрд░реАрдХреЛрдВ рд╕реЗ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред

Number.prototype.isOne = function() {
  return Number(this) === 1;
};

(1.0).isOne(); // -> true
(1).isOne(); // -> true
(2.0)
  .isOne()(
    // -> false
    7
  )
  .isOne(); // -> false

ЁЯТб рд╡реНрдпрд╛рдЦреНрдпрд╛:

рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдЖрдк рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдХрд┐рд╕реА рднреА рдЕрдиреНрдп рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рддрд░рд╣ рдирдВрдмрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпрд╣ рдЕрдиреБрд╢рдВрд╕рд┐рдд рдирд╣реАрдВ рд╣реИ рдпрджрд┐ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдкрджреНрдзрддрд┐ рдХрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдирд╣реАрдВ рд╣реИред рдпрд╣рд╛рдБ рдирдВрдмрд░ рдХреА рд╕рдВрдкрддреНрддрд┐рдпреЛрдВ рдХреА рд╕реВрдЪреА рджреА рдЧрдИ рд╣реИ:

Comparison of three numbers

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

рд╣рдо рдЗрд╕реЗ рдареАрдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ Greater than or equal operator (>=):

3 > 2 >= 1; // true

рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдореЗрдВ рд░рд┐рд▓реЗрд╢рдирд▓ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдкрдврд╝реЗрдВ:

рдордЬреЗрджрд╛рд░ рдЧрдгрд┐рдд

рдЕрдХреНрд╕рд░ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдЕрдВрдХрдЧрдгрд┐рддреАрдп рд╕рдВрдЪрд╛рд▓рди рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХрд╛рдлреА рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдЗрди рдЙрджрд╛рд╣рд░рдгреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:

 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

ЁЯТб рд╡реНрдпрд╛рдЦреНрдпрд╛:

рдкрд╣рд▓реЗ рдЪрд╛рд░ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ? рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣рд╛рдВ рдПрдХ рдЫреЛрдЯреА рддрд╛рд▓рд┐рдХрд╛ рджреА рдЧрдИ рд╣реИ:

Number  + Number  -> addition
Boolean + Number  -> addition
Boolean + Boolean -> addition
Number  + String  -> concatenation
String  + Boolean -> concatenation
String  + String  -> concatenation

рдЕрдиреНрдп рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛? рдПрдХ ToPrimitive рдФрд░ ToString рддрд░реАрдХреЛрдВ рдХреЛ рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ [] рдФрд░ `{} рдХреЗ рд▓рд┐рдП рдирд┐рд╣рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдореЗрдВ рдореВрд▓реНрдпрд╛рдВрдХрди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдФрд░ рдкрдврд╝реЗрдВ:

RegExps рдХрд╛ рдЬреЛрдбрд╝

рдХреНрдпрд╛ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЖрдк рдЗрд╕ рддрд░рд╣ рд╕реЗ рдирдВрдмрд░ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ?

// Patch a toString method
RegExp.prototype.toString =
  function() {
    return this.source;
  } /
  7 /
  -/5/; // -> 2

ЁЯТб рд╡реНрдпрд╛рдЦреНрдпрд╛:

рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдирд╣реАрдВ рд╣реИрдВ

"str"; // -> 'str'
typeof "str"; // -> 'string'
"str" instanceof String; // -> false

ЁЯТб рд╡реНрдпрд╛рдЦреНрдпрд╛:

рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд▓реМрдЯрд╛рддрд╛ рд╣реИ:

typeof String("str"); // -> 'string'
String("str"); // -> 'str'
String("str") == "str"; // -> true

Let's try with a 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 ]

рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЖрдк рдХрд┐рд╕реА рднреА рдлрдВрдХреНрд╢рди рдХреЛ рдмреИрдХрдЯрд┐рдХреНрд╕ рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВред

f`true is ${true}, false is ${false}, array is ${[1, 2, 3]}`;
// -> [ [ 'true is ', ', false is ', ', array is ', '' ],
// ->   true,
// ->   false,
// ->   [ 1, 2, 3 ] ]

ЁЯТб рд╡реНрдпрд╛рдЦреНрдпрд╛:

рдпрджрд┐ рдЖрдк Tagged рдЯреЗрдореНрдкрд▓реЗрдЯ рд╢рд╛рдмреНрджрд┐рдХ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реИрдВ, рддреЛ рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ рднреА рдЬрд╛рджреВ рдирд╣реАрдВ рд╣реИред рдКрдкрд░ рджрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, f рдлрд╝рдВрдХреНрд╢рди рдЯреЗрдореНрдкреНрд▓реЗрдЯ рд╢рд╛рдмреНрджрд┐рдХ рдХреЗ рд▓рд┐рдП рдПрдХ рдЯреИрдЧ рд╣реИред рдЯреЗрдореНрдкреНрд▓реЗрдЯ рд╢рд╛рдмреНрджрд┐рдХ рд╕реЗ рдкрд╣рд▓реЗ рдЯреИрдЧ рдЖрдкрдХреЛ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдЯреЗрдореНрдкреНрд▓реЗрдЯ рд╢рд╛рдмреНрджрд┐рдХрддрд╛ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЯреИрдЧ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдкрд╣рд▓реЗ рддрд░реНрдХ рдореЗрдВ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдорд╛рдиреЛрдВ рдХреА рдПрдХ рд╕рд░рдгреА рд╣реЛрддреА рд╣реИред рд╢реЗрд╖ рддрд░реНрдХ рднрд╛рд╡реЛрдВ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг:

function template(strings, ...keys) {
  // do something with strings and keysтАж
}

рдпрд╣ [рдЬрд╛рджреВ рдХреЗ рдкреАрдЫреЗ] (http://mxstbr.blog/2016/11/styled-compenders-magic-explained/) рдкреНрд░рд╕рд┐рджреНрдз рдкреБрд╕реНрддрдХрд╛рд▓рдп рдЬрд┐рд╕реЗ [led рд╕реНрдЯрд╛рдЗрд▓-рдХрдВрдкреЛрдиреЗрдВрдЯреНрд╕] рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ (https://www.styled-compenders.com) /), рдЬреЛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╕рдореБрджрд╛рдп рдореЗрдВ рд▓реЛрдХрдкреНрд░рд┐рдп рд╣реИред

рд╡рд┐рдирд┐рд░реНрджреЗрд╢рди рдХреЗ рд▓рд┐рдП рд▓рд┐рдВрдХ:

рдкреБрдХрд╛рд░ рдкреБрдХрд╛рд░ рдкреБрдХрд╛рд░

Found by @cramforce

console.log.call.call.call.call.call.apply(a => a, [1, 2]);

ЁЯТб рд╡реНрдпрд╛рдЦреНрдпрд╛:

рдзреНрдпрд╛рди рджреЗрдВ, рдпрд╣ рдЖрдкрдХреЗ рджрд┐рдорд╛рдЧ рдХреЛ рддреЛрдбрд╝ рд╕рдХрддрд╛ рд╣реИ! рдЕрдкрдиреЗ рд╕рд┐рд░ рдореЗрдВ рдЗрд╕ рдХреЛрдб рдХреЛ рдкреБрди: рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ: рд╣рдо рд▓рд╛рдЧреВ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреЙрд▓ рд╡рд┐рдзрд┐ рд▓рд╛рдЧреВ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдЕрдзрд┐рдХ рдкрдврд╝реЗрдВ:

A constructor property

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.prototyp.constructor рдЙрджрд╛рд╣рд░рдг рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдиреЗ рд╡рд╛рд▓реЗ Object рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рд╕рдВрджрд░реНрдн рджреЗрддрд╛ рд╣реИред рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдорд╛рдорд▓реЗ рдореЗрдВ рдпрд╣ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╣реИ, рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдпрд╣ рдирдВрдмрд░ рдФрд░ рдЗрд╕реА рддрд░рд╣ рд╣реИред

рд╡рд╕реНрддреБ рдХреА рд╕рдВрдкрддреНрддрд┐ рдХреА рдХреБрдВрдЬреА рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд╕реНрддреБ

{ [{}]: {} } // -> { '[object Object]': {} }

ЁЯТб рд╡реНрдпрд╛рдЦреНрдпрд╛:

рдпрд╣ рдХрд╛рдо рдХреНрдпреЛрдВ рдХрд░рддрд╛ рд╣реИ? рдпрд╣рд╛рдВ рд╣рдо рдПрдХ Computed рд╕рдВрдкрддреНрддрд┐ name рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдЬрдм рдЖрдк рдЙрди рдХреЛрд╖реНрдардХреЛрдВ рдХреЗ рдмреАрдЪ рдПрдХ рд╡рд╕реНрддреБ рдХреЛ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдЖрдкрддреНрддрд┐ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рд╕рдВрдкрддреНрддрд┐ рдХреБрдВрдЬреА '[рдСрдмреНрдЬреЗрдХреНрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ] рдФрд░ рдореВрд▓реНрдп {} `рдорд┐рд▓рддрд╛ рд╣реИред

рд╣рдо рдЗрд╕ рддрд░рд╣ "рдХреЛрд╖реНрдардХ рдирд░рдХ" рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ:

({ [{}]: { [{}]: {} } }[{}][{}]); // -> {}

// structure:
// {
//   '[object Object]': {
//     '[object Object]': {}
//   }
// }

рд╡рд╕реНрддреБ рд╢рд╛рдмреНрджрд┐рдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдпрд╣рд╛рдБ рдФрд░ рдЕрдзрд┐рдХ рдкрдврд╝реЗрдВ:

рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдкрд┐рдВрдЧ рдХреЛ __proto__ рдХреЗ рд╕рд╛рде рдПрдХреНрд╕реЗрд╕ рдХрд░рдирд╛

рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ, рдЖрджрд┐рдореЛрдВ рдХреЗ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдирд╣реАрдВ рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЕрдЧрд░ рд╣рдо рдЖрджрд┐рдо рдХреЗ рд▓рд┐рдП __proto__ рдХрд╛ рдорд╛рди рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдпрд╣ рдорд┐рд▓реЗрдЧрд╛:

(1).__proto__.__proto__.__proto__; // -> null

ЁЯТб рд╡реНрдпрд╛рдЦреНрдпрд╛:

рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реЛрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЬрдм рдХрд┐рд╕реА рдЪреАрдЬрд╝ рдХрд╛ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдЗрд╕реЗ ToObject рдореЗрдердб рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдХреЗ рд░реИрдкрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рд▓рдкреЗрдЯ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рддреЛ, рдЪрд░рдг-рджрд░-рдЪрд░рдг:

(1)
  .__proto__(
    // -> [Number: 0]
    1
  )
  .__proto__.__proto__(
    // -> {}
    1
  ).__proto__.__proto__.__proto__; // -> null

рдпрд╣рд╛рдБ __proto__ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рд╣реИ:

`$ {{рд╡рд╕реНрддреБ}}`

рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдХреНрдпрд╛ рд╣реИ?

`${{ Object }}`;

The answer is:

// -> '[object Object]'

ЁЯТб рд╡реНрдпрд╛рдЦреНрдпрд╛:

рд╣рдордиреЗ рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдПрдХ рд╕рдВрдкрддреНрддрд┐ рдХреЗ рд╕рд╛рде рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рд╣реИ Object рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ Shorthand рд╕рдВрдкрддреНрддрд┐ рдЕрдВрдХрди:

`Js { рд╡рд╕реНрддреБ рд╡рд╕реНрддреБ; } `

рдлрд┐рд░ рд╣рдордиреЗ рдЗрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдЯреЗрдореНрдкрд▓реЗрдЯ рд╢рд╛рдмреНрджрд┐рдХ рдореЗрдВ рдкрд╛рд╕ рдХрд░ рджрд┐рдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЙрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП toString рд╡рд┐рдзрд┐ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдорд┐рд▓рддреА рд╣реИ '[рдСрдмреНрдЬреЗрдХреНрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ]'ред

рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рдиреЛрдВ рдХреЗ рд╕рд╛рде рд╡рд┐рдирд╛рд╢рдХрд╛рд░реА

рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:

let x,
  { x: y = 1 } = { x };
y;

рдЙрдкрд░реЛрдХреНрдд рдЙрджрд╛рд╣рд░рдг рдПрдХ рд╕рд╛рдХреНрд╖рд╛рддреНрдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдорд╣рд╛рди рдХрд╛рд░реНрдп рд╣реИред Y рдХрд╛ рдореВрд▓реНрдп рдХреНрдпрд╛ рд╣реИ? рдЙрддреНрддрд░ рд╣реИ:

// -> 1

ЁЯТб рд╡реНрдпрд╛рдЦреНрдпрд╛:

let x,
  { x: y = 1 } = { x };
y;
//  тЖС       тЖС           тЖС    тЖС
//  1       3           2    4

рдКрдкрд░ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде:

  1. рд╣рдо x рдХреЛ рдмрд┐рдирд╛ рдХрд┐рд╕реА рдореВрд▓реНрдп рдХреЗ рдШреЛрд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реИред
  2. рдлрд┐рд░ рд╣рдо x рдХрд╛ рдорд╛рди рдСрдмреНрдЬреЗрдХреНрдЯ рдкреНрд░реЙрдкрд░реНрдЯреА x рдореЗрдВ рдкреИрдХ рдХрд░рддреЗ рд╣реИрдВред
  3. рдлрд┐рд░ рд╣рдо рд╡рд┐рдзреНрд╡рдВрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ x рдХрд╛ рдорд╛рди рдирд┐рдХрд╛рд▓рддреЗ рд╣реИрдВ рдФрд░ y рдХреЛ рдЕрд╕рд╛рдЗрди рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдпрджрд┐ рдорд╛рди рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рд╣реИ, рддреЛ рд╣рдо рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рдХреЗ рд░реВрдк рдореЗрдВ 1 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВред
  4. y рдХрд╛ рдорд╛рди рд▓реМрдЯрд╛рдПрдБред

рдбреЙрдЯреНрд╕ рдФрд░ рдлреИрд▓ рд░рд╣рд╛ рд╣реИ

рдРрд░реЗ рдХреЗ рдкреНрд░рд╕рд╛рд░ рдХреЗ рд╕рд╛рде рджрд┐рд▓рдЪрд╕реНрдк рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреА рд░рдЪрдирд╛ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИред рдЗрд╕ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЛ:

[...[..."..."]].length; // -> 3

ЁЯТб рд╡реНрдпрд╛рдЦреНрдпрд╛:

рдХреНрдпреЛрдВ 3? рдЬрдм рд╣рдо [рд╕реНрдкреНрд░реЗрдб рдСрдкрд░реЗрдЯрд░] (http://www.ecma-international.org/ecma-262/6.0/#sec-array-initializer) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ '@@ рдЗрдЯреНрд░реЗрдЯрд░' рд╡рд┐рдзрд┐ рдХреЛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рд▓реМрдЯрд╛ рд╣реБрдЖ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рд╣реИ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдкреБрдирд░рд╛рд╡реГрддреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рд╡рд░реНрдгреЛрдВ рдореЗрдВ рдлреИрд▓рд╛рддрд╛ рд╣реИред рдлреИрд▓рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рдЗрди рдкрд╛рддреНрд░реЛрдВ рдХреЛ рдПрдХ рд╕рд░рдгреА рдореЗрдВ рдкреИрдХ рдХрд░рддреЗ рд╣реИрдВред рдлрд┐рд░ рд╣рдо рдЗрд╕ рд╕рд░рдгреА рдХреЛ рдлрд┐рд░ рд╕реЗ рдлреИрд▓рд╛рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рд╡рд╛рдкрд╕ рд╕рд░рдгреА рдореЗрдВ рдкреИрдХ рдХрд░рддреЗ рд╣реИрдВред

A '...' рд╕реНрдЯреНрд░рд┐рдВрдЧ рдореЗрдВ рддреАрди ``рд╡рд░реНрдг рд╣реЛрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдкрд░рд┐рдгрд╛рдореА рд╕рд░рдгреА рдХреА рд▓рдВрдмрд╛рдИ3 рд╣реИред

рдЕрдм, рдЪрд░рдг-рджрд░-рдЪрд░рдг:

[...'...']             // -> [ '.', '.', '.' ]
[...[...'...']]        // -> [ '.', '.', '.' ]
[...[...'...']].length // -> 3

рдЬрд╛рд╣рд┐рд░ рд╣реИ, рд╣рдо рд╕рд░рдгреА рдХреЗ рддрддреНрд╡реЛрдВ рдХреЛ рдЬрд┐рддрдиреА рдмрд╛рд░ рдЪрд╛рд╣реЗрдВ рдЙрддрдиреА рдмрд╛рд░ рдлреИрд▓рд╛ рдФрд░ рд▓рдкреЗрдЯ рд╕рдХрддреЗ рд╣реИрдВ:

[...'...']                 // -> [ '.', '.', '.' ]
[...[...'...']]            // -> [ '.', '.', '.' ]
[...[...[...'...']]]       // -> [ '.', '.', '.' ]
[...[...[...[...'...']]]]  // -> [ '.', '.', '.' ]
// and so on тАж

рд▓реЗрдмрд▓

рдХрдИ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рд▓реЗрдмрд▓ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рдЬрд╛рдирддреЗ рд╣реИрдВред рд╡реЗ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИрдВ:

foo: {
  console.log("first");
  break foo;
  console.log("second");
}

// > first
// -> undefined

ЁЯТб рд╡реНрдпрд╛рдЦреНрдпрд╛:

рд▓реЗрдмрд▓ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдмреНрд░реЗрдХ рдпрд╛ рдЬрд╛рд░реА рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХреЗ рд╕рд╛рде рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЖрдк рд▓реВрдк рдХреА рдкрд╣рдЪрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд▓реЗрдмрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рд▓реВрдк рдХреЛ рдмрд╛рдзрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдпрд╛ рдЗрд╕рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рдЬрд╛рд░реА рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдмреНрд░реЗрдХ рдпрд╛ рдЬрд╛рд░реА рдмрдпрд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред

рдКрдкрд░ рджрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╣рдо рдПрдХ рд▓реЗрдмрд▓ foo рдХреА рдкрд╣рдЪрд╛рди рдХрд░рддреЗ рд╣реИрдВред рдЙрд╕рдХреЗ рдмрд╛рдж рдХрдВрд╕реЛрд▓.рд▓реЙрдЧ ('рдкрд╣рд▓реЗ'); рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рд╣рдо рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рдмрд╛рдзрд┐рдд рдХрд░рддреЗ рд╣реИрдВред

рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рд▓реЗрдмрд▓ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдФрд░ рдкрдврд╝реЗрдВ:

Nested labels

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 []

рдХреНрдпрд╛ рдпрд╣ рдПрдХ рдмрд╣реБ рд╡рд┐рд░рд╛рд╕рдд рд╣реИ? рдирд╣реАрдВред

# рд╡реНрдпрд╛рдЦреНрдпрд╛:

рджрд┐рд▓рдЪрд╕реНрдк рд╣рд┐рд╕реНрд╕рд╛ рдлреИрд▓реА рдЦрдВрдб ((рд╕реНрдЯреНрд░рд┐рдВрдЧ, рд╕рд░рдгреА) рдХрд╛ рдореВрд▓реНрдп рд╣реИред рдЧреНрд░реБрдкрд┐рдВрдЧ рдСрдкрд░реЗрдЯрд░ рд╣рдореЗрд╢рд╛ рдЕрдкрдирд╛ рдЕрдВрддрд┐рдо рддрд░реНрдХ рджреЗрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП (рд╕реНрдЯреНрд░рд┐рдВрдЧ, рдПрд░реЗ) рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рд┐рд░реНрдл рдПрд░реЗ рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╣рдордиреЗ рд╕рд┐рд░реНрдл рдПрдХ рд╡рд░реНрдЧ рдмрдирд╛рдпрд╛ рд╣реИ рдЬреЛ рдПрд░реЗ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рддрд╛ рд╣реИред

рдПрдХ рдЬрдирд░реЗрдЯрд░ рдЬреЛ рдЦреБрдж рдЙрдкрдЬрддрд╛ рд╣реИ

рдПрдХ рдЬрдирд░реЗрдЯрд░ рдХреЗ рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ рдЬреЛ рд╕реНрд╡рдпрдВ рдЙрдкрдЬ рджреЗрддрд╛ рд╣реИ:

(function* f() {
  yield f;
})().next();
// -> { value: [GeneratorFunction: f], done: false }

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реМрдЯрд╛рдпрд╛ рдЧрдпрд╛ рдорд╛рди рдПрдХ рд╡рд╕реНрддреБ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдорд╛рди`` рдПрдл рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИред рдЙрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рдРрд╕рд╛ рдХреБрдЫ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

(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'

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдЬреИрд╕реЗ рд╣рдо рдХреНрд▓рд╛рд╕ рдХреЗ рдЕрдВрджрд░ рдХреНрд▓рд╛рд╕ рдШреЛрд╖рд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдПрдХ рддреНрд░реБрдЯрд┐ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП, рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╣рдореЗрдВ рд╕реНрдЯреНрд░рд┐рдВрдЧ '' рдСрдмреНрдЬреЗрдХреНрдЯ '' рдорд┐рд▓рддрд╛ рд╣реИред

# рд╡реНрдпрд╛рдЦреНрдпрд╛:

ECMAScript 5 рдпреБрдЧ рдХреЗ рдмрд╛рдж рд╕реЗ keywords рдХреЛ property names рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдиреБрдорддрд┐ рджреА рдЧрдИ рд╣реИред рддреЛ рдЗрд╕ рд╕рд░рд▓ рд╡рд╕реНрддреБ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪреЛ:

const foo = {
  class: function() {}
};

рдФрд░ рдИрдПрд╕ 6 рдорд╛рдирдХреАрдХреГрдд рд╢реЙрд░реНрдЯрд╣реИрдВрдб рд╡рд┐рдзрд┐ рдкрд░рд┐рднрд╛рд╖рд╛рдПрдВред рд╕рд╛рде рд╣реА, рдХрдХреНрд╖рд╛рдПрдВ рдЕрдирд╛рдо рд╣реЛ рд╕рдХрддреА рд╣реИрдВред рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рд╣рдо рдбреНрд░реЙрдк рдХрд░рддреЗ рд╣реИрдВ : рдлрд╝рдВрдХреНрд╢рди рднрд╛рдЧ, рд╣рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ:

class {
  class() {}
}

рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╡рд░реНрдЧ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╣рдореЗрд╢рд╛ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╡рд╕реНрддреБ рд╣реЛрддреА рд╣реИред рдФрд░ рдЗрд╕рдХреЗ рдЯрд╛рдЗрдкреЛрдл рдХреЛ рдСрдмреНрдЬреЗрдХреНрдЯ' рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдпрд╣рд╛рдБ рдФрд░ рдкрдврд╝реЗрдВ:

рдЧреИрд░-рд╕рд╣рдХрд░реНрдореА рд╡рд╕реНрддреБрдПрдВ

рдкреНрд░рд╕рд┐рджреНрдз рдкреНрд░рддреАрдХреЛрдВ рдХреЗ рд╕рд╛рде, рдкреНрд░рдХрд╛рд░ рдХреА рдЬрдмрд░рджрд╕реНрддреА рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣реИред рдЬрд░рд╛ рджреЗрдЦреЛ рддреЛ:

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

ЁЯТб рд╡реНрдпрд╛рдЦреНрдпрд╛:

рдореБрд╢реНрдХрд┐рд▓ рддреАрд░ рдХрд╛рд░реНрдп

рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:

let f = () => 10;
f(); // -> 10

рдареАрдХ рд╣реИ, рдареАрдХ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛:

let f = () => {};
f(); // -> undefined

ЁЯТб рд╡реНрдпрд╛рдЦреНрдпрд╛:

рдЖрдк рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рдХреЗ рдмрдЬрд╛рдп{}рдХреА рдЙрдореНрдореАрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдШреБрдВрдШрд░рд╛рд▓реЗ рдмреНрд░реЗрд╕рд┐рдЬрд╝ рддреАрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП f рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рдПрдЧрд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдмреНрд░реИрдХреЗрдЯ рдХреЗ рд╕рд╛рде рд░рд┐рдЯрд░реНрди рд╡реИрд▓реНрдпреВ рдХреЛ рд╕рдВрд▓рдЧреНрди рдХрд░рдХреЗ, рддреАрд░ рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рд╕реАрдзреЗ {} рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИред

let f = () => ({});
f(); // -> {}

рдПрд░реЛ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдПрдХ рдирд┐рд░реНрдорд╛рддрд╛ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ

рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:

let f = function() {
  this.a = 1;
};
new f(); // -> { 'a': 1 }

рдЕрдм, рдПрдХ рддреАрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ:

let f = () => {
  this.a = 1;
};
new f(); // -> TypeError: f is not a constructor

ЁЯТб рд╡реНрдпрд╛рдЦреНрдпрд╛:

рдПрд░реЛ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЛ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕реНрддреЗрдорд╛рд▓ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдирдП рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рдкрд░ рдПрдХ рддреНрд░реБрдЯрд┐ рд╣реЛрдЧреАред рдХреНрдпреЛрдВрдХрд┐ рдПрдХ рд╢рд╛рдмреНрджрд┐рдХ рдпрд╣ рд╣реИ, рдФрд░ рдПрдХ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рд╕рдВрдкрддреНрддрд┐ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдмрд╣реБрдд рдорддрд▓рдм рдирд╣реАрдВ рд╣реЛрдЧрд╛ред

рддрд░реНрдХ рдФрд░ рддреАрд░ рдХрд╛рд░реНрдп

рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:

let f = function() {
  return arguments;
};
f("a"); // -> { '0': 'a' }

рдЕрдм, рдПрдХ рддреАрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ:

`Js let f = () => рддрд░реНрдХ; рдЪ ( "рдПрдХ"); // -> рдЕрдирдЯреНрд░реЗрдХреНрдЯреЗрдб рд░реЗрдлрд░реЗрдВрд╕: рддрд░реНрдХ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ `

# рд╡реНрдпрд╛рдЦреНрдпрд╛:

рдПрд░реЛ рдлрд╝рдВрдХреНрд╢рдВрд╕ рд╢реЙрд░реНрдЯ рдФрд░ рд▓реЗрдХреНрд╕рд┐рдХрд▓ this рд╣реЛрдиреЗ рдкрд░ рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреЗ рд╕рд╛рде рдирд┐рдпрдорд┐рдд рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХрд╛ рдПрдХ рд╣рд▓реНрдХрд╛ рд╕рдВрд╕реНрдХрд░рдг рд╣реИред рдЙрд╕реА рд╕рдордп рдПрд░реЛ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдЖрд░реНрдЧреНрдпреВрдореЗрдВрдЯреНрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рдПрдХ рд╡реИрдз рд╡рд┐рдХрд▓реНрдк рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рд╣реА рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╛рдХреА рдорд╛рдкрджрдВрдбреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ:

let f = (...args) => args;
f("a");

рдореБрд╢реНрдХрд┐рд▓ рд╡рд╛рдкрд╕реА

рд╡рд╛рдкрд╕реА рдмрдпрд╛рди рднреА рдореБрд╢реНрдХрд┐рд▓ рд╣реИред рдЗрд╕ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЛ:

(function() {
  return
  {
    b: 10;
  }
})(); // -> undefined

ЁЯТб рд╡реНрдпрд╛рдЦреНрдпрд╛:

рд╡рд╛рдкрд╕реА рдФрд░ рд▓реМрдЯреА рд╣реБрдИ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдПрдХ рд╣реА рдкрдВрдХреНрддрд┐ рдореЗрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП:

(function() {
  return {
    b: 10
  };
})(); // -> { b: 10 }

рдпрд╣ рдПрдХ рдЕрд╡рдзрд╛рд░рдгрд╛ рдХреЗ рдХрд╛рд░рдг рд╣реИ рдЬрд┐рд╕реЗ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдЕрд░реНрдзрд╡рд┐рд░рд╛рдо рд╕рдореНрдорд┐рд▓рди рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдиреНрдпреВрдХреНрд▓рд┐рдпрд░ рдХреЗ рдмрд╛рдж рдЕрд░реНрдзрд╡рд┐рд░рд╛рдо рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рддрд╛ рд╣реИред рдкрд╣рд▓реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд░рд┐рдЯрд░реНрди рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдФрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рд╢рд╛рдмреНрджрд┐рдХ рдХреЗ рдмреАрдЪ рдПрдХ рдЕрд░реНрдзрд╡рд┐рд░рд╛рдо рдбрд╛рд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдлрд╝рдВрдХреНрд╢рди рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рджреЗрддрд╛ рд╣реИ рдФрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рд╢рд╛рдмреНрджрд┐рдХ рдХрд╛ рдХрднреА рдореВрд▓реНрдпрд╛рдВрдХрди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдСрдмреНрдЬреЗрдХреНрдЯ рдкрд░ рдХрд╛рд░реНрдп рдЕрд╕рд╛рдЗрди рдХрд░рдирд╛

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} рдХреЛ рдлреВ рдХреЛ рд╕реМрдВрдкрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдЗрд╕ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдХрд╛ рдкрд░рд┐рдгрд╛рдо {n: 2} рдХреЛ foo.x рдХреЛ рд╕реМрдВрдкрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕реАрд▓рд┐рдП рдмрд╛рд░ {n: 1, x: {рд╣реИ n: 2}} рдХреЗ рд░реВрдк рдореЗрдВ рдмрд╛рд░ рдлреВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрджрд░реНрдн рд╣реИред рд▓реЗрдХрд┐рди рдХреНрдпреЛрдВ foo.x рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реИ рдЬрдмрдХрд┐ bar.x рдирд╣реАрдВ рд╣реИ?

ЁЯТб рд╡реНрдпрд╛рдЦреНрдпрд╛:

рдлреВ рдФрд░ рдмрд╛рд░ рдПрдХ рд╣реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддреЗ рд╣реИрдВ {n: 1}, рдФрд░ рд▓рд╡рд▓реАрди рдХреЛ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рд╕реЗ рдкрд╣рд▓реЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред foo = {n: 2} рдПрдХ рдирдИ рд╡рд╕реНрддреБ рдмрдирд╛ рд░рд╣рд╛ рд╣реИ, рдФрд░ рдЗрд╕рд▓рд┐рдП рдЙрд╕ рдирдИ рд╡рд╕реНрддреБ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП foo рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдпрд╣рд╛рдБ рдЪрд╛рд▓ рдХреЛ 'foo.x = ...' рдореЗрдВ foo рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдПрдХ рд▓реИрд╡рд▓реНрдпреВ рдХреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рдЕрднреА рднреА рдкреБрд░рд╛рдиреЗ foo = {n: 1} рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ 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

ЁЯТб рд╡реНрдпрд╛рдЦреНрдпрд╛:

рдХреЛрд╖реНрдардХ [] рдкрд░рд┐рдЪрд╛рд▓рдХ рдЙрддреНрддреАрд░реНрдг рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЛ рд╕реНрдЯреНрд░реАрдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддрд╛ рд╣реИред рд╕реНрдЯреНрд░рд┐рдВрдЧ рдореЗрдВ рдПрдХ рддрддреНрд╡ рддрддреНрд╡ рдХреЛ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдирд╛ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдореЗрдВ рдирд┐рд╣рд┐рдд рддрддреНрд╡ рдХреЛ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдорд╛рди рд╣реИ:

["property"].toString(); // -> 'property'

Null and Relational Operators

null > 0; // false
null == 0; // false

null >= 0; // true

ЁЯТб рд╡реНрдпрд╛рдЦреНрдпрд╛:

рд▓рдВрдмреА рдХрд╣рд╛рдиреА рдЫреЛрдЯреА, рдпрджрд┐ рд╢реВрдиреНрдп`` 0 рд╕реЗ рдХрдо рд╣реИ, рддреЛ рдЭреВрдард╛ рд╣реИ, рддреЛ рд╢реВрдиреНрдп = 0 рд╕рддреНрдп` рд╣реИред рдЗрд╕рдХреЗ рд▓рд┐рдП [рдпрд╣рд╛рдБ] (https://blog.campvanilla.com/javascript-the-curious-case-of-null-0-7b131644e274) рдХреА рдЧрд╣рди рд╡реНрдпрд╛рдЦреНрдпрд╛ рдкрдврд╝реЗрдВред

Number.toFixed () рд╡рд┐рднрд┐рдиреНрди рд╕рдВрдЦреНрдпрд╛рдПрдБ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ

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 рд╕рд╣реА рд╣реИ рдФрд░ рдлрд╝рд╛рдпрд░рдлрд╝реЙрдХреНрд╕ / рдХреНрд░реЛрдо рдЧрд▓рдд рд╣реИ, рд╡рд╛рд╕реНрддрд╡рд┐рдХрддрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдлрд╝рд╛рдпрд░рдлрд╝реЙрдХреНрд╕ / рдХреНрд░реЛрдо рдЕрдзрд┐рдХ рд╕реАрдзреЗ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдорд╛рдирдХ рдорд╛рди рд░рд╣реЗ рд╣реИрдВ (IEEE-754 рдлрд╝реНрд▓реЛрдЯрд┐рдВрдЧ рдкреЙрдЗрдВрдЯ), рдЬрдмрдХрд┐ IE11 рдЙрдиреНрд╣реЗрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд╡рдЬреНрдЮрд╛ рдХрд░рддрд╛ рд╣реИ (рдЬреЛ рд╢рд╛рдпрдж рд╣реИ ) рд╕реНрдкрд╖реНрдЯ рдкрд░рд┐рдгрд╛рдо рджреЗрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ред

рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреБрдЫ рддреНрд╡рд░рд┐рдд рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд╕рд╛рде рдРрд╕рд╛ рдХреНрдпреЛрдВ рд╣реЛрддрд╛ рд╣реИ:

// 5 рдиреАрдЪреЗ рдЧреЛрд▓рд╛рдИ рдХреЗ рд╡рд┐рд╖рдо рдкрд░рд┐рдгрд╛рдо рдХреА рдкреБрд╖реНрдЯрд┐ рдХрд░реЗрдВ
(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

рдлрд╝реНрд▓реЛрдЯрд┐рдВрдЧ рдкреЙрдЗрдВрдЯ рдирдВрдмрд░реЛрдВ рдХреЛ рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ рджрд╢рдорд▓рд╡ рдЕрдВрдХреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдХрд╛рд░реНрдпрдкреНрд░рдгрд╛рд▓реА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬреЛ рдЫреЛрдЯреА рдЕрд╢реБрджреНрдзрд┐ рдкреИрджрд╛ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдЖрдорддреМрд░ рдкрд░ рд╕реНрдЯреНрд░реАрдВрдЧ рдФрд░ рдЗрд╕реА рддрд░рд╣ рдХреА рдХреЙрд▓ рд╕реЗ рдЧреЛрд▓ рд╣реЛрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ рдореМрдЬреВрдж рд╣реЛрддреЗ рд╣реИрдВред

рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдХрд┐ рдЕрдВрдд рдореЗрдВ "5" рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рд╕рдЪ рдХреЗ рдиреАрдЪреЗ рдПрдХ рдмрд╣реБрдд рдЫреЛрдЯрд╛ рд╕рд╛ рдЕрдВрд╢ рдерд╛ред рдХрд┐рд╕реА рднреА рдЙрдЪрд┐рдд рд▓рдВрдмрд╛рдИ рдкрд░ рдЗрд╕реЗ 5 рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдирд╛ ... рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ 5 рдирд╣реАрдВ рд╣реИред

IE11, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдХреЗрд╡рд▓ (рд╢реВрдиреНрдп) рдорд╛рдорд▓реЗ рдореЗрдВ рднреА рдЕрдВрдд рддрдХ рд╕рдВрд▓рдЧреНрди рд╢реВрдиреНрдп рдХреЗ рд╕рд╛рде рдореВрд▓реНрдп рдЗрдирдкреБрдЯ рдХреА рд░рд┐рдкреЛрд░реНрдЯ рдХрд░реЗрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рд╕реАрдорд╛рдУрдВ рд╕реЗ рдкрд░реЗрд╢рд╛рдирд┐рдпреЛрдВ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореВрд▓реНрдп рдХреЛ рдЬрдмрд░рди рдЧреЛрд▓ рдХрд░рдирд╛ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИред

рд╕рдВрджрд░реНрдн рдХреЗ рд▓рд┐рдП рджреЗрдЦреЗрдВ рдиреЛрдЯ 2 ECMA-262 рдкрд░ toFixed рдХреЗ рд▓рд┐рдП рдкрд░рд┐рднрд╛рд╖рд╛ред

Math.max() less than Math.min()

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

ЁЯТб рд╡реНрдпрд╛рдЦреНрдпрд╛:

рддреБрд▓рдирд╛ null рд╕реЗ 0 рддрдХ

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпрд╛рдБ рд╡рд┐рд░реЛрдзрд╛рднрд╛рд╕ рдХрд╛ рдкрд░рд┐рдЪрдп рджреЗрддреА рд╣реИрдВ:

null == 0; // -> false
null > 0; // -> false
null >= 0; // -> true

Null рди рддреЛ рдмрд░рд╛рдмрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рди рд╣реА 0 рд╕реЗ рдЕрдзрд┐рдХ, рдЕрдЧрд░ null> = 0 рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ true рд╣реИ? (рдпрд╣ рднреА рдЙрд╕реА рддрд░рд╣ рд╕реЗ рдХрдо рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред)

ЁЯТб рд╡реНрдпрд╛рдЦреНрдпрд╛:

рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рдЗрди рддреАрдиреЛрдВ рднрд╛рд╡реЛрдВ рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╡реЗ рд╕рднреА рднрд┐рдиреНрди рд╣реИрдВ рдФрд░ рдЗрд╕ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рдЙрддреНрдкрд╛рджрди рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИрдВред

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЕрдореВрд░реНрдд рд╕рдорд╛рдирддрд╛ рддреБрд▓рдирд╛ null == 0ред рдЖрдо рддреМрд░ рдкрд░, рдпрджрд┐ рдпрд╣ рдСрдкрд░реЗрдЯрд░ рджреЛрдиреЛрдВ рддрд░рдл рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреА рдареАрдХ рд╕реЗ рддреБрд▓рдирд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рдпрд╣ рджреЛрдиреЛрдВ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреА рддреБрд▓рдирд╛ рдХрд░рддрд╛ рд╣реИред рдлрд┐рд░, рдЖрдк рдирд┐рдореНрди рд╡реНрдпрд╡рд╣рд╛рд░ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

// This is not what happens
(null == 0 + null) == +0;
0 == 0;
true;

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдХрд▓реНрдкрдирд╛ рдХреЗ рдПрдХ рдХрд░реАрдмреА рдкрдврд╝рдиреЗ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рд╕рдВрдЦреНрдпрд╛ рд░реВрдкрд╛рдВрддрд░рдг рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрд╕ рддрд░рдл рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рдЕрд╢рдХреНрдд рдпрд╛ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реИред рдЗрд╕рд▓рд┐рдП, рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рд╕рдорд╛рди рдЪрд┐рд╣реНрди рдХреЗ рдПрдХ рддрд░рдл null рд╣реИ, рддреЛ рджреВрд╕рд░реА рддрд░рдл true рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд▓рд┐рдП null рдпрд╛ рдЕрдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЪреВрдВрдХрд┐ рдпрд╣ рдорд╛рдорд▓рд╛ рдирд╣реАрдВ рд╣реИ, рдЭреВрда рд╡рд╛рдкрд╕ рдЖ рдЧрдпрд╛ рд╣реИред

рдЕрдЧрд▓рд╛, рд╕рдВрдмрдВрдзрдкрд░рдХ рддреБрд▓рдирд╛ рдЕрд╢рдХреНрдд> 0ред рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдпрд╣рд╛рдБ, рдЕрдореВрд░реНрдд рд╕рдорд╛рдирддрд╛ рдСрдкрд░реЗрдЯрд░ рдХреЗ рд╡рд┐рдкрд░реАрдд, will рдПрдХ рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд▓рд┐рдП null рдХрдиреНрд╡рд░реНрдЯред рдЗрд╕рд▓рд┐рдП, рд╣рдореЗрдВ рдпрд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдорд┐рд▓рддрд╛ рд╣реИ:

null > 0
+null = +0
0 > 0
false

рдЕрдВрдд рдореЗрдВ, рд╕рдВрдмрдВрдзрдкрд░рдХ рддреБрд▓рдирд╛ рд╢реВрдиреНрдп> = 0ред рдЖрдк рддрд░реНрдХ рджреЗ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╢реВрдиреНрдп> 0 рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП null == 0; рдЕрдЧрд░ рдРрд╕рд╛ рд╣реЛрддрд╛, рддреЛ рдЙрдкрд░реЛрдХреНрдд рдкрд░рд┐рдгрд╛рдореЛрдВ рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реЛрдЧрд╛ рдХрд┐ рдпрд╣ рднреА рдЧрд▓рдд рд╣реЛрдЧрд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ > = рдСрдкрд░реЗрдЯрд░ рдмрд╣реБрдд рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдореВрд▓ рд░реВрдк рд╕реЗ < рдСрдкрд░реЗрдЯрд░ рдХреЗ рд╡рд┐рдкрд░реАрдд рд▓реЗрдирд╛ рд╣реИред рдХреНрдпреЛрдВрдХрд┐ рдКрдкрд░ рд╕реЗ рдСрдкрд░реЗрдЯрд░ рд╕реЗ рдЕрдзрд┐рдХ рдХреЗ рд╕рд╛рде рд╣рдорд╛рд░рд╛ рдЙрджрд╛рд╣рд░рдг рднреА рдСрдкрд░реЗрдЯрд░ рд╕реЗ рдХрдо рдХреЗ рд▓рд┐рдП рд╣реИ, рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЗрд╕ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:

null >= 0;
!(null < 0);
!(+null < +0);
!(0 < 0);
!false;
true;

рд╕рдорд╛рди рдкрд░рд┐рд╡рд░реНрддрдирд╢реАрд▓ рдкреБрдирд░реНрд╡рд┐рддрд░рдг

JS рдЪрд░реЛрдВ рдХреЛ рдлрд┐рд░ рд╕реЗ рджрд┐рдЦрд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ:

a;
a;
// рдпрд╣ рднреА рдорд╛рдиреНрдп рд╣реИ
a, a;

рд╕рдЦреНрдд рдореЛрдб рдореЗрдВ рднреА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:

var a, a, a;
var a;
var a;

ЁЯТб рд╡реНрдпрд╛рдЦреНрдпрд╛:

рд╕рднреА рдкрд░рд┐рднрд╛рд╖рд╛рдУрдВ рдХреЛ рдПрдХ рдкрд░рд┐рднрд╛рд╖рд╛ рдореЗрдВ рдорд┐рд▓рд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╡реНрдпрд╡рд╣рд╛рд░ Array.prototyp.sort ()

рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ рдЖрдкрдХреЛ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреА рдПрдХ рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдХреНрд░рдордмрджреНрдз рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

[ 10, 1, 3 ].sort() // -> [ 1, 10, 3 ]

ЁЯТб рд╡реНрдпрд╛рдЦреНрдпрд╛:

рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕реЙрд░реНрдЯ рдСрд░реНрдбрд░ рддрддреНрд╡реЛрдВ рдХреЛ рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдиреЗ рдкрд░ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдлрд┐рд░ UTF-16 рдХреЛрдб рдЗрдХрд╛рдЗрдпреЛрдВ рдХреЗ рдЙрдирдХреЗ рдЕрдиреБрдХреНрд░рдореЛрдВ рдХреА рддреБрд▓рдирд╛ рдХрд░рддреЗ рд╣реИрдВред

рд╕рдВрдХреЗрдд

рдпрджрд┐ рдЖрдк рдХреБрдЫ рднреА рд▓реЗрдХрд┐рди рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рдХреНрд░рдордмрджреНрдз рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ 'рддреБрд▓рдирд╛' рдкрд╛рд╕ рдХрд░реЗрдВред

[ 10, 1, 3 ].sort((a, b) => a - b) // -> [ 1, 3, 10 ]

ЁЯУЪ рдЕрдиреНрдп рд╕рдВрд╕рд╛рдзрди

  • [wtfjs.com] (http://wtfjs.com/) - рд╡реЗрдм рдХреА рднрд╛рд╖рд╛ рдХреЗ рд▓рд┐рдП рдЙрди рд╡рд┐рд╢реЗрд╖ рдЕрдирд┐рдпрдорд┐рддрддрд╛рдУрдВ, рд╡рд┐рд╕рдВрдЧрддрд┐рдпреЛрдВ рдФрд░ рд╕реАрдзреЗ рд╕рд╛рджреЗ рджрд░реНрджрднрд░реЗ рдХреНрд╖рдгреЛрдВ рдХрд╛ рдПрдХ рд╕рдВрдЧреНрд░рд╣ред
  • [рд╡рдЯ] (https://www.destroyallsoftware.com/talks/wat) - рдХреЛрдбрдорд╢ 2012 рд╕реЗ рдЧреИрд░реА рдмрд░реНрдирд╣рд╛рд░реНрдЯ рджреНрд╡рд╛рд░рд╛ рдПрдХ рдмрд┐рдЬрд▓реА рдХреА рдмрд╛рдд
  • [рдХреНрдпрд╛ ... рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ?] (Https://www.youtube.com/watch?v=2pL28CcEijU) - рдХрд╛рдЗрд▓ рд╕рд┐рдореНрдкрд╕рди рдлреЙрд░рд╡рд░реНрдб 2 рдХреЗ рд▓рд┐рдП рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕реЗ "рдкрд╛рдЧрд▓ рдХреЛ рдмрд╛рд╣рд░ рдирд┐рдХрд╛рд▓рдиреЗ" рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред рд╡рд╣ рдХреНрд▓реАрдирд░, рдЕрдзрд┐рдХ рд╕реБрд░реБрдЪрд┐рдкреВрд░реНрдг, рдЕрдзрд┐рдХ рдкрдардиреАрдп рдХреЛрдб рдмрдирд╛рдиреЗ рдореЗрдВ рдЖрдкрдХреА рд╕рд╣рд╛рдпрддрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ, рдлрд┐рд░ рд▓реЛрдЧреЛрдВ рдХреЛ рдЦреБрд▓реЗ рд╕реНрд░реЛрдд рд╕рдореБрджрд╛рдп рдореЗрдВ рдпреЛрдЧрджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЗрд░рд┐рдд рдХрд░рддрд╛ рд╣реИред

ЁЯОУ License

CC 4.0

┬й Denys Dovhan