94 KiB
f*ck рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреНрдпрд╛ рд╣реИ
рдордЬрд╛рдХрд┐рдпрд╛ рдФрд░ рдореБрд╢реНрдХрд┐рд▓ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА
рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдПрдХ рдорд╣рд╛рди рднрд╛рд╖рд╛ рд╣реИред рдЗрд╕рдХрд╛ рдПрдХ рд╕рд░рд▓ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рд╣реИ, рдПрдХ рдмрдбрд╝рд╛ рдкрд╛рд░рд┐рд╕реНрдерд┐рддрд┐рдХреА рддрдВрддреНрд░, рдФрд░, рдЬреЛ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ, рдПрдХ рдорд╣рд╛рди рд╕рдореБрджрд╛рдпред
рдЙрд╕реА рд╕рдордп, рд╣рдо рд╕рднреА рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореБрд╢реНрдХрд┐рд▓ рднрд╛рдЧреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдлреА рдордЬрд╝реЗрджрд╛рд░ рднрд╛рд╖рд╛ рд╣реИред рдЙрдирдореЗрдВ рд╕реЗ рдХреБрдЫ рд╣рдорд╛рд░реА рд░реЛрдЬрд╝рдорд░реНрд░рд╛ рдХреА рдиреМрдХрд░реА рдХреЛ рдЬрд▓реНрджреА рд╕реЗ рдирд░рдХ рдореЗрдВ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдЙрдирдореЗрдВ рд╕реЗ рдХреБрдЫ рд╣рдореЗрдВ рдЬрд╝реЛрд░ рд╕реЗ рд╣рдБрд╕рд╛ рд╕рдХрддреЗ рд╣реИрдВред
WTFJS рдХреЗ рд▓рд┐рдП рдореВрд▓ рд╡рд┐рдЪрд╛рд░ рд╣реИ Brian Leroux. рдпрд╣ рд╕реВрдЪреА рдЙрдирдХреА рдмрд╛рддреЛрдВ рд╕реЗ рдкреНрд░реЗрд░рд┐рдд рд╣реИ тАЬWTFJSтАЭ at dotJS 2012:
Node рдкреИрдХреЗрдЬреНрдб рдкрд╛рдВрдбреБрд▓рд┐рдкрд┐
рдЖрдк рдЗрд╕ рд╣реИрдВрдбрдмреБрдХ рдХреЛ npm рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣рд╛рдВ рдЬрд╛рдУ:
$ npm install -g wtfjs
рдЕрдм рдЖрдкрдХреЛ рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдкрд░ wtfjs рдЪрд▓рд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рдЖрдкрдХреЗ рдЪрдпрдирд┐рдд $ PAGER рдореЗрдВ рдореИрдиреБрдЕрд▓ рдХреЛ рдЦреЛрд▓реЗрдЧрд╛ред рдЕрдиреНрдпрдерд╛, рдЖрдк рдпрд╣рд╛рдВ рдкрдврд╝рдирд╛ рдЬрд╛рд░реА рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВред
рд╕реНрд░реЛрдд рдпрд╣рд╛рдВ рдЙрдкрд▓рдмреНрдз рд╣реИ: https://github.com/denysdovhan/wtfjs
Translations
Currently, there are these translations of wtfjs:
рдПрдХ рдФрд░ рдЕрдиреБрд╡рд╛рдж рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░реЗрдВ
Table of Contents
- ЁЯТкЁЯП╗ рдкреНрд░реЗрд░рдгрд╛
- тЬНЁЯП╗ рдиреЛрдЯреЗрд╢рди
- ЁЯСА рдЙрджрд╛рд╣рд░рдг
[]рдХреЗ рдмрд░рд╛рдмрд░![]trueis not equal![], but not equal[]too- true is false
- baNaNa
NaNis not aNaN- рдпрд╣ рд╡рд┐рдлрд▓ рд╣реИ
[]is truthy, but nottruenullis falsy, but notfalsedocument.allis an object, but it is undefined- рдиреНрдпреВрдирддрдо рдорд╛рди рд╢реВрдиреНрдп рд╕реЗ рдЕрдзрд┐рдХ рд╣реИ
- рдлрдВрдХреНрд╢рди рдХреЛрдИ рдлрдВрдХреНрд╢рди рдирд╣реАрдВ рд╣реИ
- Adding arrays
- рд╕рд░рдгреА рдореЗрдВ рдЕрд▓реНрдкрд╡рд┐рд░рд╛рдо
- рдРрд░реЗ рд╕рдорд╛рдирддрд╛ рдПрдХ рд░рд╛рдХреНрд╖рд╕ рд╣реИ
undefinedandNumberparseIntрдПрдХ рдмреБрд░рд╛ рдЖрджрдореА рд╣реИрд╕рддреНрдпрдФрд░рдЕрд╕рддреНрдпрдХреЗ рд╕рд╛рде рдЧрдгрд┐рдд- HTML рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдорд╛рдиреНрдп рд╣реИрдВ
NaNisnota number[]andnullare objects- Magically increasing numbers
- Precision of
0.1 + 0.2 - рдкреИрдЪрд┐рдВрдЧ рдирдВрдмрд░
- Comparison of three numbers
- рдордЬреЗрджрд╛рд░ рдЧрдгрд┐рдд
- RegExps рдХрд╛ рдЬреЛрдбрд╝
- рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕
рд╕реНрдЯреНрд░рд┐рдВрдЧрдХреЗ рдЙрджрд╛рд╣рд░рдг рдирд╣реАрдВ рд╣реИрдВ - рдмреИрдХрдЯрд┐рдХреНрд╕ рдХреЗ рд╕рд╛рде рдХреЙрд▓рд┐рдВрдЧ рдлрд╝рдВрдХреНрд╢рди
- рдкреБрдХрд╛рд░ рдкреБрдХрд╛рд░ рдкреБрдХрд╛рд░
- A
constructorproperty - рд╡рд╕реНрддреБ рдХреА рд╕рдВрдкрддреНрддрд┐ рдХреА рдХреБрдВрдЬреА рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд╕реНрддреБ
- рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдкрд┐рдВрдЧ рдХреЛ
__proto__рдХреЗ рд╕рд╛рде рдПрдХреНрд╕реЗрд╕ рдХрд░рдирд╛ `$ {{рд╡рд╕реНрддреБ}}`- рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рдиреЛрдВ рдХреЗ рд╕рд╛рде рд╡рд┐рдирд╛рд╢рдХрд╛рд░реА
- рдбреЙрдЯреНрд╕ рдФрд░ рдлреИрд▓ рд░рд╣рд╛ рд╣реИ
- рд▓реЗрдмрд▓
- Nested labels
- рдХрдкрдЯреА
рдХреЛрд╢рд┐рд╢..рдЪреЗрдХ - рдХреНрдпрд╛ рдпрд╣ рдХрдИ рд╡рд┐рд░рд╛рд╕рдд рд╣реИ?
- рдПрдХ рдЬрдирд░реЗрдЯрд░ рдЬреЛ рдЦреБрдж рдЙрдкрдЬрддрд╛ рд╣реИ
- рдХрдХреНрд╖рд╛ рдХрд╛ рдПрдХ рд╡рд░реНрдЧ
- рдЧреИрд░-рд╕рд╣рдХрд░реНрдореА рд╡рд╕реНрддреБрдПрдВ
- рдореБрд╢реНрдХрд┐рд▓ рддреАрд░ рдХрд╛рд░реНрдп
- рдПрд░реЛ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдПрдХ рдирд┐рд░реНрдорд╛рддрд╛ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ
рддрд░реНрдХрдФрд░ рддреАрд░ рдХрд╛рд░реНрдп- рдореБрд╢реНрдХрд┐рд▓ рд╡рд╛рдкрд╕реА
- рдСрдмреНрдЬреЗрдХреНрдЯ рдкрд░ рдХрд╛рд░реНрдп рдЕрд╕рд╛рдЗрди рдХрд░рдирд╛
- рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдСрдмреНрдЬреЗрдХреНрдЯ рдЧреБрдг рддрдХ рдкрд╣реБрдБрдЪрдирд╛
- Null and Relational Operators
Number.toFixed ()рд╡рд┐рднрд┐рдиреНрди рд╕рдВрдЦреНрдпрд╛рдПрдБ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИMath.max()less thanMath.min()- рддреБрд▓рдирд╛
nullрд╕реЗ0рддрдХ - рд╕рдорд╛рди рдкрд░рд┐рд╡рд░реНрддрдирд╢реАрд▓ рдкреБрдирд░реНрд╡рд┐рддрд░рдг
- рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╡реНрдпрд╡рд╣рд╛рд░ Array.prototyp.sort ()
- ЁЯУЪ рдЕрдиреНрдп рд╕рдВрд╕рд╛рдзрди
- ЁЯОУ License
ЁЯТкЁЯП╗ рдкреНрд░реЗрд░рдгрд╛
рд╕рд┐рд░реНрдл рдордиреЛрд░рдВрдЬрди рдХреЗ рд▓рд┐рдП
тАФ тАЬрд╕рд┐рд░реНрдл рдордиреЛрд░рдВрдЬрди рдХреЗ рд▓рд┐рдП: рдПрдХреНрд╕реАрдбреЗрдВрдЯрд▓ рд░рд┐рд╡реЛрд▓реНрдпреВрд╢рдирд░реА рдХреА рдХрд╣рд╛рдиреАтАЭ, 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
ЁЯТб рд╡реНрдпрд╛рдЦреНрдпрд╛:
рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдЗрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рдкреАрдЫреЗ рддрд░реНрдХ рдХреЛ рд╕рдЦреНрддреА рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ:
- If
Type(x)is different fromType(y), return false.- If
Type(x)is Number, then
- If
xis NaN, return false.- If
yis NaN, return false.- тАж тАж тАж
тАФ 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 withundefinedwhiletruewhen 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
0less thanNumber.MIN_VALUEin 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
ЁЯТб рд╡реНрдпрд╛рдЦреНрдпрд╛:
рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдХреЗ рдЕрдиреБрд╕рд╛рд░:
- рдпрджрд┐ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЖрд╣реНрд╡рд╛рди рдкрд░ рдХреЛрдИ рддрд░реНрдХ рдирд╣реАрдВ рджрд┐рдпрд╛ рдЧрдпрд╛, рддреЛ
nрдХреЛ+ 0рд╣реЛрдиреЗ рджреЗрдВред - рдФрд░, рдЪрд▓реЛ
nрд╣реЛ?ToNumber (рдорд╛рди)ред рдЕрдкрд░рд┐рднрд╛рд╖рд┐рддрдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ,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
argumentis true, return 1. Ifargumentis 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 рдорд╛рдирдХ рдХреЗ рдХрд╛рд░рдг рд╣реЛрддрд╛ рд╣реИред рдЗрд╕ рдкреИрдорд╛рдиреЗ рдкрд░, рдпрд╣ рдирд┐рдХрдЯрддрдо рд╕рдо рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдЧреЛрд▓ рд╣реЛрддрд╛ рд╣реИред рдЕрдзрд┐рдХ рдкрдврд╝реЗрдВ:
- 6.1.6 The Number Type
- IEEE 754 on Wikipedia
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 рддрд░реАрдХреЛрдВ рдХреЛ рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ [] рдФрд░ `{} рдХреЗ рд▓рд┐рдП рдирд┐рд╣рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдореЗрдВ рдореВрд▓реНрдпрд╛рдВрдХрди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдФрд░ рдкрдврд╝реЗрдВ:
- 12.8.3 The Addition Operator (
+) - 7.1.1 ToPrimitive(
input[,PreferredType]) - 7.1.12 ToString(
argument)
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]);
ЁЯТб рд╡реНрдпрд╛рдЦреНрдпрд╛:
рдзреНрдпрд╛рди рджреЗрдВ, рдпрд╣ рдЖрдкрдХреЗ рджрд┐рдорд╛рдЧ рдХреЛ рддреЛрдбрд╝ рд╕рдХрддрд╛ рд╣реИ! рдЕрдкрдиреЗ рд╕рд┐рд░ рдореЗрдВ рдЗрд╕ рдХреЛрдб рдХреЛ рдкреБрди: рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ: рд╣рдо рд▓рд╛рдЧреВ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреЙрд▓ рд╡рд┐рдзрд┐ рд▓рд╛рдЧреВ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдЕрдзрд┐рдХ рдкрдврд╝реЗрдВ:
- 19.2.3.3 Function.prototype.call(
thisArg, ...args) - **19.2.3.1 ** Function.prototype.apply(
thisArg,argArray)
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.prototyp.constructor] (https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Object/constructor) - [** 19.1.3.1 ** Object.prototype.constructor] (https://www.ecma-international.org/ecma-262/#sec-object.prototyp.constructor)
рд╡рд╕реНрддреБ рдХреА рд╕рдВрдкрддреНрддрд┐ рдХреА рдХреБрдВрдЬреА рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд╕реНрддреБ
{ [{}]: {} } // -> { '[object Object]': {} }
ЁЯТб рд╡реНрдпрд╛рдЦреНрдпрд╛:
рдпрд╣ рдХрд╛рдо рдХреНрдпреЛрдВ рдХрд░рддрд╛ рд╣реИ? рдпрд╣рд╛рдВ рд╣рдо рдПрдХ Computed рд╕рдВрдкрддреНрддрд┐ name рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдЬрдм рдЖрдк рдЙрди рдХреЛрд╖реНрдардХреЛрдВ рдХреЗ рдмреАрдЪ рдПрдХ рд╡рд╕реНрддреБ рдХреЛ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдЖрдкрддреНрддрд┐ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рд╕рдВрдкрддреНрддрд┐ рдХреБрдВрдЬреА '[рдСрдмреНрдЬреЗрдХреНрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ] рдФрд░ рдореВрд▓реНрдп {} `рдорд┐рд▓рддрд╛ рд╣реИред
рд╣рдо рдЗрд╕ рддрд░рд╣ "рдХреЛрд╖реНрдардХ рдирд░рдХ" рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ:
({ [{}]: { [{}]: {} } }[{}][{}]); // -> {}
// structure:
// {
// '[object Object]': {
// '[object Object]': {}
// }
// }
рд╡рд╕реНрддреБ рд╢рд╛рдмреНрджрд┐рдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдпрд╣рд╛рдБ рдФрд░ рдЕрдзрд┐рдХ рдкрдврд╝реЗрдВ:
- рдПрдордбреАрдПрди рдкрд░ (рдСрдмреНрдЬреЗрдХреНрдЯ рдЗрдирд┐рд╢рд▓рд╛рдЗрдЬрд╝рд░] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Oference/Object_initializer)
- [** резреи.реи.рем ** рд╡рд╕реНрддреБ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝рд░] (http://www.ecma-international.org/ecma-262/6.0/#sec-object-initializer)
рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдкрд┐рдВрдЧ рдХреЛ __proto__ рдХреЗ рд╕рд╛рде рдПрдХреНрд╕реЗрд╕ рдХрд░рдирд╛
рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ, рдЖрджрд┐рдореЛрдВ рдХреЗ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдирд╣реАрдВ рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЕрдЧрд░ рд╣рдо рдЖрджрд┐рдо рдХреЗ рд▓рд┐рдП __proto__ рдХрд╛ рдорд╛рди рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдпрд╣ рдорд┐рд▓реЗрдЧрд╛:
(1).__proto__.__proto__.__proto__; // -> null
ЁЯТб рд╡реНрдпрд╛рдЦреНрдпрд╛:
рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реЛрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЬрдм рдХрд┐рд╕реА рдЪреАрдЬрд╝ рдХрд╛ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдЗрд╕реЗ ToObject рдореЗрдердб рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдХреЗ рд░реИрдкрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рд▓рдкреЗрдЯ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рддреЛ, рдЪрд░рдг-рджрд░-рдЪрд░рдг:
(1)
.__proto__(
// -> [Number: 0]
1
)
.__proto__.__proto__(
// -> {}
1
).__proto__.__proto__.__proto__; // -> null
рдпрд╣рд╛рдБ __proto__ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рд╣реИ:
- [** B.2.2.1 ** Object.prototypeред ** proto **] (https://www.ecma-international.org/ecma-262/#sec-object.prototype.proto)
- [** 7.1.13 ** ToObject (
рддрд░реНрдХ)] (https://www.ecma-international.org/ecma-262/#sec-toobject)
`$ {{рд╡рд╕реНрддреБ}}`
рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдХреНрдпрд╛ рд╣реИ?
`${{ Object }}`;
The answer is:
// -> '[object Object]'
ЁЯТб рд╡реНрдпрд╛рдЦреНрдпрд╛:
рд╣рдордиреЗ рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдПрдХ рд╕рдВрдкрддреНрддрд┐ рдХреЗ рд╕рд╛рде рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рд╣реИ Object рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ Shorthand рд╕рдВрдкрддреНрддрд┐ рдЕрдВрдХрди:
`Js { рд╡рд╕реНрддреБ рд╡рд╕реНрддреБ; } `
рдлрд┐рд░ рд╣рдордиреЗ рдЗрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдЯреЗрдореНрдкрд▓реЗрдЯ рд╢рд╛рдмреНрджрд┐рдХ рдореЗрдВ рдкрд╛рд╕ рдХрд░ рджрд┐рдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЙрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП toString рд╡рд┐рдзрд┐ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдорд┐рд▓рддреА рд╣реИ '[рдСрдмреНрдЬреЗрдХреНрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ]'ред
- [** резреи.реи.реп ** рдЯреЗрдореНрдкрд▓реЗрдЯ рд╕рд╛рд╣рд┐рддреНрдп] (https://www.ecma-international.org/ecma-262/#sec-template-literals)
- рдПрдордбреАрдПрди рдкрд░ (рдСрдмреНрдЬреЗрдХреНрдЯ рдЗрдирд┐рд╢рд▓рд╛рдЗрдЬрд╝рд░] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Oference/Object_initializer)
рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рдиреЛрдВ рдХреЗ рд╕рд╛рде рд╡рд┐рдирд╛рд╢рдХрд╛рд░реА
рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:
let x,
{ x: y = 1 } = { x };
y;
рдЙрдкрд░реЛрдХреНрдд рдЙрджрд╛рд╣рд░рдг рдПрдХ рд╕рд╛рдХреНрд╖рд╛рддреНрдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдорд╣рд╛рди рдХрд╛рд░реНрдп рд╣реИред Y рдХрд╛ рдореВрд▓реНрдп рдХреНрдпрд╛ рд╣реИ? рдЙрддреНрддрд░ рд╣реИ:
// -> 1
ЁЯТб рд╡реНрдпрд╛рдЦреНрдпрд╛:
let x,
{ x: y = 1 } = { x };
y;
// тЖС тЖС тЖС тЖС
// 1 3 2 4
рдКрдкрд░ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде:
- рд╣рдо
xрдХреЛ рдмрд┐рдирд╛ рдХрд┐рд╕реА рдореВрд▓реНрдп рдХреЗ рдШреЛрд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдпрд╣рдЕрдкрд░рд┐рднрд╛рд╖рд┐рддрд╣реИред - рдлрд┐рд░ рд╣рдо
xрдХрд╛ рдорд╛рди рдСрдмреНрдЬреЗрдХреНрдЯ рдкреНрд░реЙрдкрд░реНрдЯреАxрдореЗрдВ рдкреИрдХ рдХрд░рддреЗ рд╣реИрдВред - рдлрд┐рд░ рд╣рдо рд╡рд┐рдзреНрд╡рдВрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ
xрдХрд╛ рдорд╛рди рдирд┐рдХрд╛рд▓рддреЗ рд╣реИрдВ рдФрд░yрдХреЛ рдЕрд╕рд╛рдЗрди рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдпрджрд┐ рдорд╛рди рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рд╣реИ, рддреЛ рд╣рдо рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рдХреЗ рд░реВрдк рдореЗрдВ1рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВред yрдХрд╛ рдорд╛рди рд▓реМрдЯрд╛рдПрдБред
- Object initializer at MDN
рдбреЙрдЯреНрд╕ рдФрд░ рдлреИрд▓ рд░рд╣рд╛ рд╣реИ
рдРрд░реЗ рдХреЗ рдкреНрд░рд╕рд╛рд░ рдХреЗ рд╕рд╛рде рджрд┐рд▓рдЪрд╕реНрдк рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреА рд░рдЪрдирд╛ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИред рдЗрд╕ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЛ:
[...[..."..."]].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
ЁЯТб рд╡реНрдпрд╛рдЦреНрдпрд╛:
рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд╕рдорд╛рди, рдЗрди рд▓рд┐рдВрдХ рдХрд╛ рдЕрдиреБрд╕рд░рдг рдХрд░реЗрдВ:
- [** резреи.резрем ** рдХреЛрдорд╛ рд╕рдВрдЪрд╛рд▓рдХ (
,)] (https://www.ecma-international.org/ecma-262/#sec-comma-operator) - [** 13.13 ** рд▓реЗрдмрд▓ рдХрд┐рдП рдЧрдП рд╡рд┐рд╡рд░рдг] (https://tc39.github.io/ecma262/#sec-labelled-statements)
- [рд▓реЗрдмрд▓ рдХрд┐рдП рдЧрдП рдХрдерди] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/label) MDN рдкрд░
рдХрдкрдЯреА рдХреЛрд╢рд┐рд╢..рдЪреЗрдХ
рдпрд╣ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреНрдпрд╛ рд▓реМрдЯреЗрдЧреА? 2 рдпрд╛ 3?
(() => {
try {
return 2;
} finally {
return 3;
}
})();
рдЙрддреНрддрд░ 3 рд╣реИред рдЖрд╢реНрдЪрд░реНрдп рдЪрдХрд┐рдд?
# рд╡реНрдпрд╛рдЦреНрдпрд╛:
- [** 13.15 ** рдж
рдХреЛрд╢рд┐рд╢рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ] (https://www.ecma-international.org/ecma-262/#sec-try-statement)
рдХреНрдпрд╛ рдпрд╣ рдХрдИ рд╡рд┐рд░рд╛рд╕рдд рд╣реИ?
рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдг рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ:
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
// тАж
ЁЯТб рд╡реНрдпрд╛рдЦреНрдпрд╛:
рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдпрд╣ рдЗрд╕ рддрд░рд╣ рдХреНрдпреЛрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдХреЗ рдЗрди рд╡рд░реНрдЧреЛрдВ рдХреЛ рдкрдврд╝реЗрдВ:
- [** реирел ** рдирд┐рдпрдВрддреНрд░рдг рдЕрдореВрд░реНрдд рд╡рд╕реНрддреБрдПрдВ] (https://www.ecma-international.org/ecma-262/#sec-control-abstraction-objects)
- [** реирел.рей ** рдЬреЗрдирд░реЗрдЯрд░ рдСрдмреНрдЬреЗрдХреНрдЯ] (https://www.ecma-international.org/ecma-262/#sec-generator-objects)
рдХрдХреНрд╖рд╛ рдХрд╛ рдПрдХ рд╡рд░реНрдЧ
рдЗрд╕ рдУрдлрд╝реНрд╕реЗрдЯреЗрдб рд╕рд┐рдВрдЯреИрдХреНрд╕ рдкреНрд▓реЗрдЗрдВрдЧ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:
typeof new class {
class() {}
}(); // -> 'object'
рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдЬреИрд╕реЗ рд╣рдо рдХреНрд▓рд╛рд╕ рдХреЗ рдЕрдВрджрд░ рдХреНрд▓рд╛рд╕ рдШреЛрд╖рд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдПрдХ рддреНрд░реБрдЯрд┐ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП, рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╣рдореЗрдВ рд╕реНрдЯреНрд░рд┐рдВрдЧ '' рдСрдмреНрдЬреЗрдХреНрдЯ '' рдорд┐рд▓рддрд╛ рд╣реИред
# рд╡реНрдпрд╛рдЦреНрдпрд╛:
ECMAScript 5 рдпреБрдЧ рдХреЗ рдмрд╛рдж рд╕реЗ keywords рдХреЛ property names рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдиреБрдорддрд┐ рджреА рдЧрдИ рд╣реИред рддреЛ рдЗрд╕ рд╕рд░рд▓ рд╡рд╕реНрддреБ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪреЛ:
const foo = {
class: function() {}
};
рдФрд░ рдИрдПрд╕ 6 рдорд╛рдирдХреАрдХреГрдд рд╢реЙрд░реНрдЯрд╣реИрдВрдб рд╡рд┐рдзрд┐ рдкрд░рд┐рднрд╛рд╖рд╛рдПрдВред рд╕рд╛рде рд╣реА, рдХрдХреНрд╖рд╛рдПрдВ рдЕрдирд╛рдо рд╣реЛ рд╕рдХрддреА рд╣реИрдВред рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рд╣рдо рдбреНрд░реЙрдк рдХрд░рддреЗ рд╣реИрдВ : рдлрд╝рдВрдХреНрд╢рди рднрд╛рдЧ, рд╣рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ:
class {
class() {}
}
рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╡рд░реНрдЧ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╣рдореЗрд╢рд╛ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╡рд╕реНрддреБ рд╣реЛрддреА рд╣реИред рдФрд░ рдЗрд╕рдХреЗ рдЯрд╛рдЗрдкреЛрдл рдХреЛ рдСрдмреНрдЬреЗрдХреНрдЯ' рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдпрд╣рд╛рдБ рдФрд░ рдкрдврд╝реЗрдВ:
- [** резрек.рей ** рд╡рд┐рдзрд┐ рдкрд░рд┐рднрд╛рд╖рд╛рдПрдБ] (https://www.ecma-international.org/ecma-262/#sec-method-definitions)
- [** резрек.рел ** рдХрдХреНрд╖рд╛ рдкрд░рд┐рднрд╛рд╖рд╛рдПрдБ] (https://www.ecma-international.org/ecma-262/#sec-class-definitions)
рдЧреИрд░-рд╕рд╣рдХрд░реНрдореА рд╡рд╕реНрддреБрдПрдВ
рдкреНрд░рд╕рд┐рджреНрдз рдкреНрд░рддреАрдХреЛрдВ рдХреЗ рд╕рд╛рде, рдкреНрд░рдХрд╛рд░ рдХреА рдЬрдмрд░рджрд╕реНрддреА рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣реИред рдЬрд░рд╛ рджреЗрдЦреЛ рддреЛ:
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
ЁЯТб рд╡реНрдпрд╛рдЦреНрдпрд╛:
- [рд╕реЗрд░реНрдЧреЗрдИ рд░реБрдмрдиреЛрд╡ рджреНрд╡рд╛рд░рд╛ рдПрдХ рддрд╕реНрд╡реАрд░] (https://gist.github.com/chicoxyzzy/5dd24608e886adf5444499896dff1197)
- [** рем.рез.рел.рез ** рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЬреНрдЮрд╛рдд рдкреНрд░рддреАрдХ] (https://www.ecma-international.org/ecma-262/#sec-well-ogn-symbols)
рдореБрд╢реНрдХрд┐рд▓ рддреАрд░ рдХрд╛рд░реНрдп
рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:
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");
- Arrow functions at MDN.
рдореБрд╢реНрдХрд┐рд▓ рд╡рд╛рдкрд╕реА
рд╡рд╛рдкрд╕реА рдмрдпрд╛рди рднреА рдореБрд╢реНрдХрд┐рд▓ рд╣реИред рдЗрд╕ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЛ:
(function() {
return
{
b: 10;
}
})(); // -> undefined
ЁЯТб рд╡реНрдпрд╛рдЦреНрдпрд╛:
рд╡рд╛рдкрд╕реА рдФрд░ рд▓реМрдЯреА рд╣реБрдИ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдПрдХ рд╣реА рдкрдВрдХреНрддрд┐ рдореЗрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП:
(function() {
return {
b: 10
};
})(); // -> { b: 10 }
рдпрд╣ рдПрдХ рдЕрд╡рдзрд╛рд░рдгрд╛ рдХреЗ рдХрд╛рд░рдг рд╣реИ рдЬрд┐рд╕реЗ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдЕрд░реНрдзрд╡рд┐рд░рд╛рдо рд╕рдореНрдорд┐рд▓рди рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдиреНрдпреВрдХреНрд▓рд┐рдпрд░ рдХреЗ рдмрд╛рдж рдЕрд░реНрдзрд╡рд┐рд░рд╛рдо рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рддрд╛ рд╣реИред рдкрд╣рд▓реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд░рд┐рдЯрд░реНрди рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдФрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рд╢рд╛рдмреНрджрд┐рдХ рдХреЗ рдмреАрдЪ рдПрдХ рдЕрд░реНрдзрд╡рд┐рд░рд╛рдо рдбрд╛рд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдлрд╝рдВрдХреНрд╢рди рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рджреЗрддрд╛ рд╣реИ рдФрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рд╢рд╛рдмреНрджрд┐рдХ рдХрд╛ рдХрднреА рдореВрд▓реНрдпрд╛рдВрдХрди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
- [** 11.9.1 ** рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдЕрд░реНрдзрд╡рд┐рд░рд╛рдо рд╕рдореНрдорд┐рд▓рди рдХреЗ рдирд┐рдпрдо] (https://www.ecma-international.org/ecma-262/#sec-rules-of-automatic-semicolon-insertion)
- [** 13.10 ** рдж
рд░рд┐рдЯрд░реНрдирд╕реНрдЯреЗрдЯрдореЗрдВрдЯ] (https://www.ecma-international.org/ecma-262/#sec-return-statement)
рдСрдмреНрдЬреЗрдХреНрдЯ рдкрд░ рдХрд╛рд░реНрдп рдЕрд╕рд╛рдЗрди рдХрд░рдирд╛
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
ЁЯТб рд╡реНрдпрд╛рдЦреНрдпрд╛:
- рдЪрд╛рд░реНрд▓реА рд╣рд╛рд░реНрд╡реЗ рджреНрд╡рд╛рд░рд╛ Math.max () Math.min () рд╕реЗ рдХрдо рдХреНрдпреЛрдВ рд╣реИ? (Https://charlieharvey.org.uk/page/why_math_max_is_less_than_math_min)
рддреБрд▓рдирд╛ 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;
ЁЯТб рд╡реНрдпрд╛рдЦреНрдпрд╛:
рд╕рднреА рдкрд░рд┐рднрд╛рд╖рд╛рдУрдВ рдХреЛ рдПрдХ рдкрд░рд┐рднрд╛рд╖рд╛ рдореЗрдВ рдорд┐рд▓рд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
- [** 13.3.2 ** рдЪрд░ рдХрдерди] (https://www.ecma-international.org/ecma-262/#sec-variable-statement)
рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╡реНрдпрд╡рд╣рд╛рд░ 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
┬й Denys Dovhan
