рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЬрд╛рджреВ: рддрд░реНрдХ

arguments рдПрдХ рдмрд╣реБрдд рд╣реА рд╡рд┐рд╢рд┐рд╖реНрдЯ рдмрд╛рдд рд╣реИ рдЬреЛ рд╢реБрд░реБрдЖрддреА рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рд╢реМрдХреАрдиреЛрдВ рдХреЛ рд╣реА рдкрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ "рдПрдХ рд╕рд░рдгреА рдХреА рддрд░рд╣ рд╣реИ, рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рддрд░рд╣ рдХрд╛ рдЧрд▓рдд" рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЗрд╕рдореЗрдВ рдХрдИ рджрд┐рд▓рдЪрд╕реНрдк рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рд╣реИрдВред рдореИрдВ TypeHinting, рдбрд┐рдлрд╝реЙрд▓реНрдЯ рддрд░реНрдХ рдФрд░ рдХрд┐рд╕реА рдЕрдиреНрдп рд╡рд┐рд╖рдп рдкрд░ рдЗрд╕ рд╡рд┐рд╖рдп рдореЗрдВ рдХрд▓реНрдкрдирд╛ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░рддрд╛ рд╣реВрдВред
 (function (foo, bar) { console.log(typeof arguments); // ? arguments[0] = 42; console.log(foo); // ? })(10, 20); 


рдФрд░ рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рд╡рд┐рдЪрд╛рд░ рдкреБрд╕реНрддрдХрд╛рд▓рдп рднреА рджрд┐рдЦрд╛рддреЗ рд╣реИрдВ
 function test (foo, bar) { Args(arguments).defaults(100, 100); return [foo, bar]; }; test( ); // 100, 100 test(15 ); // 15, 100 test(21, 42); // 21, 42 



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

рддрд░реНрдХ рдХреНрдпрд╛ рд╣реИрдВ


рдпрд╣ рдПрдХ рд╣реИрд╢ рд╣реИред рд╕рд╛рдорд╛рдиреНрдп рд╣реИрд╢ рдХреА рддрд░рд╣ var object = {}
 (function () { console.log( typeof arguments, // object Object.getPrototypeOf(arguments) == Object.prototype // true ) })(); 


рдЗрд╕рд╕реЗ рдПрдХ рд╕рд░рдгреА рдмрдирд╛рдирд╛ рд╕рд░рд▓ рд╣реИ:
 var array = Array.prototype.slice.call(arguments, 0); //  ,   : var array = [].slice.call(arguments, 0); 


рд╣рдо arguments рдУрд░ рд╕реЗ рдРрд░реЗ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХреЗ slice рд╡рд┐рдзрд┐ рдХреЛ рдХрд╣рддреЗ рд╣реИрдВред

рддрд░реНрдХреЛрдВ рдореЗрдВ рдХреНрдпрд╛ рд╣реИ


arguments.length arguments.length - рдлрд╝рдВрдХреНрд╢рди рдХреЛ рджрд┐рдП рдЧрдП рддрд░реНрдХреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ред
 var count = function () { console.log(arguments.length); }; count(); // 0 count(first, second); // 2 


рдпрд╣ рдордд рднреВрд▓реЛ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдПрдХ length рдЧреБрдг рднреА рд╣реЛрддрд╛ рд╣реИ, рдЬреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рдХреЗ рд╣реЗрдбрд░ рдореЗрдВ рдХрд┐рддрдиреЗ рддрддреНрд╡ рдШреЛрд╖рд┐рдд рдХрд┐рдП рдЧрдП рд╣реИрдВ:

 function one (foo) {}; function three (foo, bar, qux) {}; console.log( one.length); // 1 console.log(three.length); // 3 


arguments.callee arguments.callee - рдлрдВрдХреНрд╢рди рдХрд╛ рдПрдХ рд▓рд┐рдВрдХред

 function foo () { console.log(arguments.callee === foo); // true } 


рдЗрд╕ рддрд░рд╣ рд╕реЗ рдЖрдк рдЬрд╛рдВрдЪ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рддрддреНрд╡реЛрдВ рдХреА рд╕рд╣реА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВ:

 function test (foo, bar, qux) { return arguments.callee.length === arguments.length; } test(1); // false test(1,2,3); // true 


рддрд░реНрдХ рдореЗрдВ рддрд░реНрдХ


arguments рдореЗрдВ рдкрд╛рд░рд┐рдд рддрд░реНрдХреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рднреА рд╢рд╛рдорд┐рд▓ рд╣реИред
 function test (foo, bar) { console.log(foo, bar); // 'a', 'b' console.log(arguments[0], arguments[1]); // 'a', 'b' } test('a', 'b'); 


рдЕрдм рджрд┐рд▓рдЪрд╕реНрдк рднрд╛рдЧ рдХреЗ рд▓рд┐рдПред рдХрдИ рд▓реЛрдЧ рдпрд╣ рдирд╣реАрдВ рдЬрд╛рдирддреЗ рдХрд┐ рддрд░реНрдХреЛрдВ рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп - рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рдВрджрд░реНрдн рд╣реЛрддреЗ рд╣реИрдВ, рдореВрд▓реНрдп рдирд╣реАрдВ, рдФрд░ рддрд░реНрдХреЛрдВ рд╕реЗ рдирд┐рдХрдЯрддрд╛ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ:
 (function (foo) { arguments[0] = 42; console.log(foo); // 42! foo = 20; console.log(arguments[0]); // 20 })(5); 


рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХрдиреЗрдХреНрд╢рди рдХрд╛рдлреА рдордЬрдмреВрдд рд╣реИ:

 function foo (qux) { change(arguments); return qux; }; function change(a) { a[0] = 42; } foo(10); // 42 


рдЗрд╕рд╕реЗ рдХреНрдпрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ?


рдХрдИ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ "рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдЪрд░ рд╣реИрдВред" рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, php:
 function ($foo = 30, $bar = 'test') { var_dump($foo); var_dump($bar); } 


рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ, рдпрд╣ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:
 function (foo, bar) { if (typeof foo === 'undefined') foo = 30; if (typeof bar === 'undefined') bar = 'test'; console.log(foo, bar); } 


arguments рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рдЬрд╛рдирдиреЗ рдХреЗ рдмрд╛рдж arguments рдЖрдк рдПрдХ рд╕реБрдВрджрд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ:
 function test(foo, bar) { Args(arguments).defaults(30, 'test'); console.log(foo, bar) } test(); // 30, 'test' 


рдЗрд╕ рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛:
 function Args (args) { if (this instanceof Args) { this.args = args; } else { //     new,    ,      return new Args(args); } }; Args.prototype = { defaults: function () { var defaults = arguments; for (var i = defaults.length; i--;) { if (typeof args[i] === 'undefined') args[i] = defaults[i]; } return this; } }; 


рдЗрд╕реА рддрд░рд╣, рдЖрдк рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдкреНрд░рдХрд╛рд░ рдХреА рдХрд╛рд╕реНрдЯрд┐рдВрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 function test(foo) { Args(arguments) .defaults(10) .cast(Number); console.log(foo) } test('0100'); // 100 


рдпрд╛ рдЯрд╛рдЗрдк рд╣рд┐рдВрдЯрд┐рдВрдЧ:

 function test(foo, bar) { Args(arguments).types(Foo, Bar); // code } test(new Foo(), new Bar()); test(1, 2); // Error 


рджрд┐рд▓рдЪрд╕реНрдк рд╡рд┐рдЪрд╛рд░реЛрдВ рдХрд╛ - рдпрд╣ рд╕рдВрджреЗрд╢ рдХрд┐ рд╕рднреА рддрд░реНрдХ рдЖрд╡рд╢реНрдпрдХ рд╣реИрдВ:

 function test (foo, bar, qux) { Args(arguments).allRequired(); } test(1,2,3); // success test(1,2); // Error: 3 args required, 2 given 


рдирд┐рд╖реНрдХрд░реНрд╖


рдореИрдВрдиреЗ рдЗрди рд╕рднреА рд╡рд┐рдЪрд╛рд░реЛрдВ рдФрд░ рдЕрд╡рд╕рд░реЛрдВ (рдФрд░ рдЗрд╕рд╕реЗ рднреА рдЕрдзрд┐рдХ) рдХреЛ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ - Args.js.
рдореИрдВ рдЗрд╕ рдмрд╛рдд рд╕реЗ рд╕рд╣рдордд рд╣реВрдВ рдХрд┐ рдХреБрдЫ рдЪреАрдЬреЗрдВ (рдЬреИрд╕реЗ рдЯрд╛рдЗрдкрд╣рд┐рдиреНрдЯрд┐рдВрдЧ) рднрд╛рд╖рд╛ рдХреА рд╡рд┐рдЪрд╛рд░рдзрд╛рд░рд╛ рдХреЗ рдЕрдиреБрдХреВрд▓ рдирд╣реАрдВ рд╣реИрдВред рдЙрд╕реА рд╕рдордп, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЪреВрдХ рдПрдХ рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдЪреАрдЬ рд╣реИ, рдЖрдИрдПрдордПрдЪрдУред
рдЕрднреА рдХреЗ рд▓рд┐рдП, рдпрд╣ рдПрдХ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рд╣реИ, рдФрд░ рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рдЖрдк рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдЖрдкрдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рдирд╣реАрдВ рдХрд┐ рдЖрдк рд╕рд┐рд░реНрдл рдПрдХ рд╕реБрдВрджрд░ рднрд╛рд╖рд╛ рд╕реЗ рд╕реА # рдХреЗ рд╕рдорд╛рди рдХреБрдЫ рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВред
рдореЗрд░рд╛ рд╕реБрдЭрд╛рд╡ рд╣реИ рдХрд┐ рдЪрд░реНрдЪрд╛ рдХрд░рдирд╛, рдХреЛрдб рдХреА рдЖрд▓реЛрдЪрдирд╛ рдХрд░рдирд╛, рдХреБрдЫ рдЬреЛрдбрд╝реЗ рдвреВрдВрдврдирд╛ рдФрд░ рдХреЛрдб рдХреА рдХреБрдЫ рдкрдВрдХреНрддрд┐рдпрд╛рдВ рдХрд░рдирд╛)

Args.js



рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рддреАрди рд▓реЛрдХрдкреНрд░рд┐рдп рдмреНрд░рд╛рдЙрдЬрд╝рд░реЛрдВ (рдЖрдИрдИ, рдПрдлрдПрдХреНрд╕ , рдУрдкреЗрд░рд╛) рдореЗрдВ рдПрдХ рдмрдЧ рдХреЗ рдХрд╛рд░рдг, рдореИрдВ рд╡рд╛рдВрдЫрд┐рдд рдкреНрд░рднрд╛рд╡ рдкреНрд░рд╛рдкреНрдд рдирд╣реАрдВ рдХрд░ рд╕рдХрд╛ , рд╕рдмрд╕реЗ рд╕реНрд╡рд╛рджрд┐рд╖реНрдЯ рдЪреАрдЬ рдиреЗ рдХреЗрд╡рд▓ рдХреНрд░реЛрдо рдореЗрдВ рдХрд╛рдо рдХрд┐рдпрд╛ (рдареАрдХ рд╣реИ, рдХрдо рд╕реЗ рдХрдо рдпрд╣ рдиреЛрдб рдореЗрдВ рдХрд╛рдо рдХрд░реЗрдЧрд╛)ред рдЖрд╢рд╛ рд╣реИ рдХрд┐ рд╣рдо рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдПрдХ рд╕рд╛рде рд╣рд▓ рдХрд░реЗрдВрдЧреЗред

UPD : рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ, рдЙрдиреНрд╣реЗрдВ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рдпрд╣ рдПрдХ рдХреНрд░реЛрдо рдмрдЧ рд╣реИ, рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рд╕реБрдЦрдж рд╣реИ! рдзрдиреНрдпрд╡рд╛рдж рдЬрдореИрдХрд╛

Source: https://habr.com/ru/post/In117868/


All Articles