рдкрд░рд┐рднрд╛рд╖рд┐рдд рдпрд╛ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд? рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рд╕рд░рдгрд┐рдпрд╛рдБ рдмрдирд╛рдиреЗ рдХреА рдорд╛рддреНрд░рд╛

рдЫрд╡рд┐

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

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

рдиреЛрдЯ: рдореИрдВрдиреЗ рдЙрд╕ рдЪрд░реНрдЪрд╛ рдХреЗ рддрд╣рдд, рдПрдВрдбреНрд░реАрдЬреАрдПрд╕ рдЙрдкрдирд╛рдо рдХреЗ рддрд╣рдд рднреА рдЬрд╡рд╛рдм рджрд┐рдпрд╛ - рд╡рд╣рд╛рдВ рдореИрдВрдиреЗ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдЙрддреНрддрд░ рджрд┐рдпрд╛, рдпрд╣рд╛рдВ рдореИрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдХрд╡рд░ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реВрдВрдЧрд╛ред

рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдПрдХ рд╕рд░рдгреА рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЪреБрдиреМрддреА рд╣реИред рд╣рдо рдпрд╣ рдХреИрд╕реЗ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ? рдЕрдЬреАрдм рддрд░рд╣ рд╕реЗ рдкрд░реНрдпрд╛рдкреНрдд, рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ, рдЬреЛ рд╣рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЙрд╕рдХреЗ рдЖрдзрд╛рд░ рдкрд░ред

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

рд╕рд░рдгрд┐рдпреЛрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рддреЗ рд╕рдордп, рдПрдХ рдЦрд╝рд╛рд╕рд┐рдпрдд рд╣реИ: рдЕрдЧрд░ рд╣рдо рдРрд░реЗ (...) рдпрд╛ рдирдП рдРрд░реЗ (...) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдХреЛрдИ рдорд╛рдпрдиреЗ рдирд╣реАрдВ рд░рдЦрддрд╛ рд╣реИ - ECMAScript рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдЙрдирдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЗрд╕реЗ рд╕рдордХрдХреНрд╖ рдорд╛рдирддрд╛ рд╣реИред

22.1.1 The Array Constructor The Array constructor is the %Array% intrinsic object and the initial value of the Array property of the global object. When called as a constructor it creates and initializes a new exotic Array object. When Array is called as a function rather than as a constructor, it also creates and initializes a new Array object. Thus the function call Array(тАж) is equivalent to the object creation expression new Array(тАж) with the same arguments. 

рдЗрд╕рд▓рд┐рдП, рдореИрдВ рд╢рд░рд╛рд░рддреА рд░реВрдк рд╕реЗ рджрд░реНрд╢рди рдирд╣реАрдВ рджреВрдВрдЧрд╛, рдФрд░ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рдореИрдВ рдХреЗрд╡рд▓ рдирдП рдРрд░реЗ (...) рдирд┐рд░реНрдорд╛рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реВрдВрдЧрд╛, рддрд╛рдХрд┐ рдХрд┐рд╕реА рдХреЛ рднреНрд░рдорд┐рдд рди рдХрд░реЗрдВред

рдЪрд▓рд┐рдП рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред

рдПрдХ рд╕рд░рдгреА рдмрдирд╛рдПрдБ:

 let arr = new Array(5); 

рд╣рдореЗрдВ рдХреНрдпрд╛ рдорд┐рд▓рд╛?

 console.log(arr); // Array(5) [ <5 empty slots> ] console.log(arr[0]); // undefined console.log(Object.getOwnPropertyDescriptor(arr,"0")); // undefined 

рд╣рдореНрдо ... рдареАрдХ рд╣реИ, рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдпрд╣ рдРрд╕рд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП - рд╣рдордиреЗ рд▓рдВрдмрд╛рдИ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХреА рдФрд░ рдкрд╛рдВрдЪ рдЦрд╛рд▓реА рдХреЛрд╢рд┐рдХрд╛рдПрдВ рдкреНрд░рд╛рдкреНрдд рдХреАрдВ , рдЬрд┐рдирдХрд╛ рдореВрд▓реНрдп рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реИ , рдЬрд┐рд╕реЗ рдЖрдЧреЗ рднреА рдХрд╛рдо рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд╣реИ рдирд╛? рд╕рдЪ рд╣реИ, рдХреБрдЫ рдРрд╕реЗ рдмрд┐рдВрджреБ рд╣реИрдВ рдЬреЛ рдореБрдЭреЗ рднреНрд░рдорд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдЖрдЗрдП рдЗрд╕реЗ рджреЗрдЦреЗрдВред

 let arr = new Array(5).map(function() { return new Array(5); }); console.log(arr); // Array(5) [ <5 empty slots> ] console.log(arr[0]); // undefined console.log(Object.getOwnPropertyDescriptor(arr,"0")); // undefined console.log(arr[0][0]); // TypeError: arr[0] is undefined 

рдпрд╣ рдХреИрд╕рд╛ рд╣реИ, рдЖрдЦрд┐рд░рдХрд╛рд░, рд╣рдореЗрдВ рдПрдХ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдерд╛, рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдХреЛрд╢рд┐рдХрд╛ рдореЗрдВ, рддрджрдиреБрд╕рд╛рд░, 5 рддрддреНрд╡реЛрдВ рдХреА рдПрдХ рд╕рд░рдгреА рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП ...

рдЖрдЗрдП рд╣рдо рдлрд┐рд░ рд╕реЗ ECMAScript рдбреЙрдХреНрдпреВрдореЗрдВрдЯ рдХреА рдУрд░ рдореБрдбрд╝реЗрдВ рдФрд░ рджреЗрдЦреЗрдВ рдХрд┐ рдПрдХ рддрд░реНрдХ рдХреЗ рд╕рд╛рде рд╕рд░рдгрд┐рдпрд╛рдБ рдмрдирд╛рдиреЗ рдХреА рд╡рд┐рдзрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЗрд╕рдореЗрдВ рдХреНрдпрд╛ рд▓рд┐рдЦрд╛ рд╣реИ:

 22.1.1.2 Array (len) This description applies if and only if the Array constructor is called with exactly one argument. 1. Let numberOfArgs be the number of arguments passed to this function call. 2. Assert: numberOfArgs = 1. 3. If NewTarget is undefined, let newTarget be the active function object, else let newTarget be NewTarget. 4. Let proto be GetPrototypeFromConstructor(newTarget, "%ArrayPrototype%"). 5. ReturnIfAbrupt(proto). 6. Let array be ArrayCreate(0, proto). 7. If Type(len) is not Number, then 1. Let defineStatus be CreateDataProperty(array, "0", len). 2. Assert: defineStatus is true. 3. Let intLen be 1. 8. Else, 1. Let intLen be ToUint32(len). 2. If intLen тЙа len, throw a RangeError exception. 9. Let setStatus be Set(array, "length", intLen, true). 10. Assert: setStatus is not an abrupt completion. 11. Return array. 

рдФрд░, рдЬреЛ рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ, рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рд╡рд╕реНрддреБ рдмрдирд╛рдИ рдЧрдИ рд╣реИ, рд▓рдВрдмрд╛рдИ рд╕рдВрдкрддреНрддрд┐ ArrayCreate рдкреНрд░рдХреНрд░рд┐рдпрд╛ (рдмрд┐рдВрджреБ 6) рдореЗрдВ рдмрдирд╛рдИ рдЧрдИ рд╣реИ, рд▓рдВрдмрд╛рдИ рд╕рдВрдкрддреНрддрд┐ рдореЗрдВ рдорд╛рди рдиреАрдЪреЗ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ (рдмрд┐рдВрджреБ 9), рдФрд░ рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛? рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓реЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЬрдм рддрд░реНрдХ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рддреЛ рдХреЛрдИ рд╕рдВрдЦреНрдпрд╛ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдПрдХ рд╕рд░рдгреА рдПрдХ рд╕реЗрд▓ "0" рдХреЗ рд╕рд╛рде рдЗрд╕реА рдореВрд▓реНрдп (рдмрд┐рдВрджреБ 7) рдХреЗ рд╕рд╛рде рдмрдирд╛рдИ рдЧрдИ рд╣реИ, рдЙрдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рд╢рдмреНрдж рдирд╣реАрдВ рд╣реИ ... рдЕрд░реНрдерд╛рдд, рд╡рд╣рд╛рдБ == 5 рд▓рдВрдмрд╛рдИ рд╣реИ, рд▓реЗрдХрд┐рди рдХреЛрдИ рдкрд╛рдВрдЪ рд╕реЗрд▓ рдирд╣реАрдВ рд╣реИред рд╣рд╛рдВ, рдХрдВрдкрд╛рдЗрд▓рд░ рд╣рдореЗрдВ рднреНрд░рдорд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬрдм рд╣рдо рдХрд┐рд╕реА рдПрдХрд▓ рдХрдХреНрд╖ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рдХрд╛ рдореВрд▓реНрдп рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реИ , рдЬрдмрдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдирд╣реАрдВ рд╣реИред

рдпрд╣рд╛рдВ, рддреБрд▓рдирд╛ рдХреЗ рд▓рд┐рдП, рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рднреЗрдЬреЗ рдЧрдП рдХрдИ рддрд░реНрдХреЛрдВ рдХреЗ рд╕рд╛рде рдРрд░реЗ рдмрдирд╛рдиреЗ рдХреА рд╡рд┐рдзрд┐:

 22.1.1.3 Array (...items ) This description applies if and only if the Array constructor is called with at least two arguments. When the Array function is called the following steps are taken: 1. Let numberOfArgs be the number of arguments passed to this function call. 2. Assert: numberOfArgs тЙе 2. 3. If NewTarget is undefined, let newTarget be the active function object, else let newTarget be NewTarget. 4. Let proto be GetPrototypeFromConstructor(newTarget, "%ArrayPrototype%"). 5. ReturnIfAbrupt(proto). 6. Let array be ArrayCreate(numberOfArgs, proto). 7. ReturnIfAbrupt(array). 8. Let k be 0. 9. Let items be a zero-origined List containing the argument items in order. 10. Repeat, while k < numberOfArgs 1. Let Pk be ToString(k). 2. Let itemK be items[k]. 3. Let defineStatus be CreateDataProperty(array, Pk, itemK). 4. Assert: defineStatus is true. 5. Increase k by 1. 11. Assert: the value of array's length property is numberOfArgs. 12. Return array. 

рдпрд╣рд╛рдВ, рдХреГрдкрдпрд╛ - 10 рдмрд┐рдВрджреБ, рдЙрдиреНрд╣реАрдВ рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдгред

рдФрд░ рдЕрдм, Array.prototyp.map () рдЖрдЧреЗ рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИ?

 22.1.3.15 Array.prototype.map ( callbackfn [ , thisArg ] ) 1. Let O be ToObject(this value). 2. ReturnIfAbrupt(O). 3. Let len be ToLength(Get(O, "length")). 4. ReturnIfAbrupt(len). 5. If IsCallable(callbackfn) is false, throw a TypeError exception. 6. If thisArg was supplied, let T be thisArg; else let T be undefined. 7. Let A be ArraySpeciesCreate(O, len). 8. ReturnIfAbrupt(A). 9. Let k be 0. 10. Repeat, while k < len 1. Let Pk be ToString(k). 2. Let kPresent be HasProperty(O, Pk). 3. ReturnIfAbrupt(kPresent). 4. If kPresent is true, then 1. Let kValue be Get(O, Pk). 2. ReturnIfAbrupt(kValue). 3. Let mappedValue be Call(callbackfn, T, ┬лkValue, k, O┬╗). 4. ReturnIfAbrupt(mappedValue). 5. Let status be CreateDataPropertyOrThrow (A, Pk, mappedValue). 6. ReturnIfAbrupt(status). 5. Increase k by 1. 11. Return A. 

рдЦрдгреНрдб 7 - рдореВрд▓ рд╕рд░рдгреА рдХреА рдПрдХ рдкреНрд░рддрд┐ рдмрдирд╛рдИ рдЧрдИ рд╣реИ, рдЦрдгреНрдб рдореЗрдВ 10 рд▓реЗрди рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХреЛ рдЗрд╕рдХреЗ рддрддреНрд╡реЛрдВ рдкрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рд╕реНрд░реЛрдд рд╕рд░рдгреА рдореЗрдВ рдХреЛрдИ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕реЗрд▓ рд╣реИ, рддреЛ рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП 10.2 рдЬрд╛рдБрдЪ рдХрд░реЗрдВ, рддрд╛рдХрд┐, рдпрджрд┐ рд╕рдлрд▓ рд╣реЛ, рддреЛ рдорд╛рдирдЪрд┐рддреНрд░ (10.4) рдФрд░ рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдореЗрдВ рдЙрдкрдпреБрдХреНрдд рд╕реЗрд▓ рдмрдирд╛рдПрдВ - 10.4.5ред рдЪреВрдВрдХрд┐ 5.2 рдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рд▓рд┐рдП 10.2 рдЧрд▓рдд рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╕рд░рдгреА рдХреА рд▓реМрдЯреА рд╣реБрдИ рдХреЙрдкреА рдореЗрдВ рдПрдХ рднреА рд╕реЗрд▓ рдирд╣реАрдВ рдмрдирд╛рдИ рдЬрд╛рдПрдЧреАред

рддреЛ, рд╕рд░рдгреА рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдФрд░ Array.prototype.map () рд╡рд┐рдзрд┐ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреА рд╣реИ, рд╣рдордиреЗ рдЗрд╕реЗ рд╕рдордЭ рд▓рд┐рдпрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдХрд╛рд░реНрдп рдЕрдирд╕реБрд▓рдЭрд╛ рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдмрдирд╛ рд░рд╣рд╛, рдХреНрдпреЛрдВрдХрд┐ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдирд╣реАрдВ рд╣реБрдЖ рдерд╛ред рдлрдВрдХреНрд╢рди.рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк.apply () рдмрдЪрд╛рд╡ рдХреЗ рд▓рд┐рдП рдЖрдПрдЧрд╛!
рдЖрдЗрдП рдЗрд╕реЗ рддреБрд░рдВрдд рдХрд╛рд░реНрд░рд╡рд╛рдИ рдореЗрдВ рджреЗрдЦреЗрдВ:

 let arr = Array.apply(null, new Array(5)); console.log(arr); // Array(5) [ undefined, undefined, undefined, undefined, undefined ] console.log(arr[0]); // undefined console.log(Object.getOwnPropertyDescriptor(arr,"0")); // Object { value: undefined, writable: true, enumerable: true, configurable: true } 

рд╣реБрд░реНрд░реЗ, рд╕рднреА рдкрд╛рдВрдЪ рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЛ рдпрд╣рд╛рдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рджреЗрдЦрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдкрд╣рд▓реЗ, рдкрд░реАрдХреНрд╖рдг, рд╕рдВрдЦреНрдпрд╛ "0" рдХреЗ рд╕рд╛рде рд╕реЗрд▓ рдореЗрдВ рдПрдХ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рд╣реИред

рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдХрд╛рд░реНрдпрдХреНрд░рдо рдиреЗ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдХрд╛рдо рдХрд┐рдпрд╛:

  1. рд╣рдордиреЗ Function.prototype.apply () рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд┐рдпрд╛ рдФрд░ рдЗрд╕реЗ рд╢реВрдиреНрдп рд╕рдВрджрд░реНрдн рдкрд╛рд╕ рдХрд┐рдпрд╛, рдФрд░ рд╕рд░рдгреА рдирдпрд╛ рдРрд░реЗ (5) рдХреЗ рд░реВрдк рдореЗрдВ ред
  2. рдирдИ рдРрд░реЗ (5) рдиреЗ рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЗ рдмрд┐рдирд╛ рдПрдХ рд╕рд░рдгреА рдмрдирд╛рдИ, рд▓реЗрдХрд┐рди 5 рдХреА рд▓рдВрдмрд╛рдИ рдХреЗ рд╕рд╛рдеред
  3. Function.prototyp.apply () рдиреЗ рд╕рд░рдгреА рдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рддрд░реНрдХреЛрдВ рдореЗрдВ рддреЛрдбрд╝рдиреЗ рдХреА рдЖрдВрддрд░рд┐рдХ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛, рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, Array рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рдорд╛рди рдХреЗ рд╕рд╛рде рдкрд╛рдВрдЪ рддрд░реНрдХ рдкрд╛рд░рд┐рдд рдХрд┐рдПред
  4. рдПрд░реЗ рдиреЗ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рдореВрд▓реНрдпреЛрдВ рдХреЗ рд╕рд╛рде 5 рддрд░реНрдХ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдП, рдЙрдиреНрд╣реЗрдВ рд╕рдВрдмрдВрдзрд┐рдд рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдореЗрдВ рдЬреЛрдбрд╝рд╛ред

рд╕рдм рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рд╣реЛрдиреЗ рд▓рдЧрддрд╛ рд╣реИ, рд╕рд┐рд╡рд╛рдп рдлрд╝рдВрдХреНрд╢рди рдХреА рдпрд╣ рдЖрдВрддрд░рд┐рдХ рд╡рд┐рдзрд┐ рдХреНрдпрд╛ рд╣реИ редprototype.apply () , рдЬреЛ 5 рддрд░реНрдХреЛрдВ рдХреЛ рдХреБрдЫ рднреА рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ - рдореИрдВ рдлрд┐рд░ рд╕реЗ рд╕реБрдЭрд╛рд╡ рджреЗрддрд╛ рд╣реВрдВ рдХрд┐ рдЖрдк ECMAScript рджрд╕реНрддрд╛рд╡реЗрдЬ рдХреЛ рджреЗрдЦреЗрдВ:

 19.2.3.1 Function.prototype.apply 1. If IsCallable(func) is false, throw a TypeError exception. 2. If argArray is null or undefined, then Return Call(func, thisArg). 3. Let argList be CreateListFromArrayLike(argArray). 7.3.17 CreateListFromArrayLike (obj [, elementTypes] ) 1. ReturnIfAbrupt(obj). 2. If elementTypes was not passed, let elementTypes be (Undefined, Null, Boolean, String, Symbol, Number, Object). 3. If Type(obj) is not Object, throw a TypeError exception. 4. Let len be ToLength(Get(obj, "length")). 5. ReturnIfAbrupt(len). 6. Let list be an empty List. 7. Let index be 0. 8. Repeat while index < len a. Let indexName be ToString(index). b. Let next be Get(obj, indexName). c. ReturnIfAbrupt(next). d. If Type(next) is not an element of elementTypes, throw a TypeError exception. e. Append next as the last element of list. f. Set index to index + 1. 9. Return list. 

рд╣рдо рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рдмрд┐рдВрджреБрдУрдВ рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ:

19.2.3.1 - рдкреИрд░рд╛рдЧреНрд░рд╛рдл 3: рдПрдХ рд╕рд░рдгреА рдХреЗ рд╕рдорд╛рди рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реЗ рддрд░реНрдХреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдмрдирд╛рдирд╛ (рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рдпрд╛рдж рдХрд░рддреЗ рд╣реИрдВ, рдРрд╕реА рд╡рд╕реНрддреБрдУрдВ рдХреА рд▓рдВрдмрд╛рдИ рд╕рдВрдкрддреНрддрд┐ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП)ред

7.3.17 - рд╕реВрдЪреА рдирд┐рд░реНрдорд╛рдг рд╡рд┐рдзрд┐ рд╕реНрд╡рдпрдВред рдпрд╣ рдЬрд╛рдВрдЪрддрд╛ рд╣реИ рдХрд┐ рд╡рд╕реНрддреБ рд╣реИ рдпрд╛ рдирд╣реАрдВ, рдФрд░, рдпрджрд┐ рд╣рд╛рдВ, рддреЛ рд▓рдВрдмрд╛рдИ рдХреНрд╖реЗрддреНрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдиреБрд░реЛрдз (рдкреИрд░рд╛рдЧреНрд░рд╛рдл 4)ред рдлрд┐рд░ "0" рдХреЗ рдмрд░рд╛рдмрд░ рдПрдХ рдЗрдВрдбреЗрдХреНрд╕ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдкреИрд░рд╛рдЧреНрд░рд╛рдл 7)ред рдПрдХ рд▓реВрдк рд▓рдВрдмрд╛рдИ рдХреНрд╖реЗрддреНрд░ (рдкреИрд░рд╛рдЧреНрд░рд╛рдл 8) рд╕реЗ рд▓рд┐рдпрд╛ рдореВрд▓реНрдп рдХреЗ рд▓рд┐рдП рд╕реВрдЪрдХрд╛рдВрдХ рдХреА рд╡реГрджреНрдзрд┐ рдХреЗ рд╕рд╛рде рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕ рдЪрдХреНрд░ рдореЗрдВ, рд╣рдо рд╕рдВрдмрдВрдзрд┐рдд рд╕реВрдЪрдХрд╛рдВрдХреЛрдВ (рдЦрдВрдб 8 рдП рдФрд░ 8 рдмреА) рдХреЗ рд╕рд╛рде рд╕рдВрдЪрд░рд┐рдд рд╕рд░рдгреА рдХреЗ рд╕реЗрд▓ рдореВрд▓реНрдпреЛрдВ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдФрд░ рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рдпрд╛рдж рдХрд░рддреЗ рд╣реИрдВ, рдЬрдм рдХрд┐рд╕реА рд╕рд░рдгреА рдореЗрдВ рдХрд┐рд╕реА рдПрдХрд▓ рдХрдХреНрд╖ рдХреЗ рдореВрд▓реНрдп рддрдХ рдкрд╣реБрдВрдЪ рд╣реЛрддреА рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреЛрдИ рдХреЛрд╢рд┐рдХрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ, рддрдм рднреА рдпрд╣ рдПрдХ рдорд╛рди рджреЗрддрд╛ рд╣реИ - рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд ред рдкрд░рд┐рдгрд╛рдореА рдореВрд▓реНрдп рддрд░реНрдХ рд╕реВрдЪреА (рдкреИрд░рд╛ 8e) рдХреЗ рдЕрдВрдд рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЦреИрд░, рдЕрдм рдЬрдм рд╕рдм рдХреБрдЫ рдЧрд┐рд░ рдЧрдпрд╛ рд╣реИ, рддреЛ рдЖрдк рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдмрд╣реБрдд рдЦрд╛рд▓реА рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

 let arr = Array.apply(null, new Array(5)).map(function(){ return Array.apply(null,new Array(5)); }); console.log(arr); // Array(5) [ (5) [тАж], (5) [тАж], (5) [тАж], (5) [тАж], (5) [тАж] ] console.log(arr[0]); // Array(5) [ undefined, undefined, undefined, undefined, undefined ] console.log(Object.getOwnPropertyDescriptor(arr,"0")); // Object { value: (5) [тАж], writable: true, enumerable: true, configurable: true } console.log(arr[0][0]); // undefined console.log(Object.getOwnPropertyDescriptor(arr[0],"0")); // Object { value: undefined, writable: true, enumerable: true, configurable: true } 

рдЕрдм, рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╕рдм рдХреБрдЫ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ рдФрд░ рджрд┐рдЦрддрд╛ рд╣реИ: рд╣рдо, рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЬрд╛рдирддреЗ рд╣реИрдВ, рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдЦрд╛рд▓реА Array.apply (рдЕрд╢рдХреНрдд, рдирдпрд╛ рдРрд░реЗ (5)) рд╕рд░рдгреА рдмрдирд╛рдПрдВ рдФрд░ рдлрд┐рд░ рдЗрд╕реЗ рдореИрдк рд╡рд┐рдзрд┐ рдореЗрдВ рдкрд╛рд╕ рдХрд░реЗрдВ, рдЬреЛ рдЙрд╕реА рд╕рд░рдгреА рдХреЛ рдмрдирд╛рддрд╛ рд╣реИред рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЖрдк рдЗрд╕реЗ рдФрд░ рднреА рдЖрд╕рд╛рди рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред рдкреНрд░рд╕рд╛рд░ - ... рдСрдкрд░реЗрдЯрд░ ECMAScript6 рдореЗрдВ рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛, рдФрд░, рдЬреЛ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╣реИ, рдпрд╣ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рднреА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╣рдо рдмрд╕ рдореЗрдВ рдбреНрд░рд╛рдЗрд╡ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 let arr = new Array(...new Array(5)).map(() => new Array(...new Array(5))); 

рдпрд╛ рд╣рдо рдЗрд╕реЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рд░рд▓ рдХрд░реЗрдВрдЧреЗ, рднрд▓реЗ рд╣реА рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рдирдпрд╛ рд╡рд╛рджрд╛ рдХрд┐рдпрд╛ рдерд╛ рдХрд┐ рд╕реНрдкрд░реНрд╢ рди рдХрд░реЗрдВ ...

 let arr = Array(...Array(5)).map(() => Array(...Array(5))); 
рдзреНрдпрд╛рди рджреЗрдВ: рдпрд╣рд╛рдВ рд╣рдордиреЗ рдПрд░реЛ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдЕрднреА рднреА рдПрдХ рдкреНрд░рд╕рд╛рд░ рдСрдкрд░реЗрдЯрд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЬреЛ рдЙрдирдХреЗ рд╕рдорд╛рди рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдореЗрдВ рджрд┐рдЦрд╛рдИ рджрд┐рдПред

рд╣рдо рдкреНрд░рд╕рд╛рд░ рдСрдкрд░реЗрдЯрд░ рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрдд рдореЗрдВ рдирд╣реАрдВ рдЬрд╛рдПрдВрдЧреЗ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╕рд╛рдорд╛рдиреНрдп рд╡рд┐рдХрд╛рд╕ рдХреЗ рд▓рд┐рдП, рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдпрд╣ рдЙрджрд╛рд╣рд░рдг рднреА рдЙрдкрдпреЛрдЧреА рдерд╛ред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдо, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдЕрдкрдиреЗ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдлрдВрдХреНрд╢рди .prototype.apply () рд╕реЙрд░реНрдЯрд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдЦрд╛рд▓реА рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЗ рд╕рд╛рде рд╣рдорд╛рд░реЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп рд╕рд░рдгрд┐рдпреЛрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░реЗрдЧрд╛, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рдЖрдВрддрд░рд┐рдХ рд╕рд┐рджреНрдзрд╛рдВрддреЛрдВ рдХреЛ рд╕рдордЭрдиреЗ рдФрд░, рддрджрдиреБрд╕рд╛рд░, рд╕рд╣реА рдФрд░ рдкрд░реНрдпрд╛рдкреНрдд рдЙрдкрдпреЛрдЧред рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдХрд╛рд░реНрдп, рдорд╛рд╕реНрдЯрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрдзрд╛рд░ рд╣реИ рдЬреЛ рдПрдХ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рд╣реИред рдареАрдХ рд╣реИ, рдФрд░, рдЬрд╝рд╛рд╣рд┐рд░ рд╣реИ, рдпрд╣ рдЗрддрдирд╛ рд╕рд░рд▓ рддреЗрдЬрд╝ рдФрд░ рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред

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

рд╡рд╣ рдЕрдВрджрд░ рдЪрд▓рд╛ рдЧрдпрд╛:

Array.apply(null, new Array(5)).map(function(){
return new Array(5);
});


рдЖрдкрдХреЛ рдХреНрдпрд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкрд░рд┐рдгрд╛рдо рдпрд╣рд╛рдБ рд╣реЛрдЧрд╛?

рдЬрд╡рд╛рдм рд╣реИ
рдХрдВрд╕реЛрд▓.рд▓реЙрдЧ (рдЧрд┐рд░рдлреНрддрд╛рд░); // рдРрд░реЗ (5) [(5) [...], (5) [...], (5) [...], (5) [...], (5) [...]
рдХрдВрд╕реЛрд▓.рд▓реЙрдЧ (рдЧрд┐рд░рдлреНрддрд╛рд░ [рдХреЛ реж]); // рдРрд░реЗ (5) [<5 рдЦрд╛рд▓реА рд╕реНрд▓реЙрдЯ>]
рдХрдВрд╕реЛрд▓.рд▓реЙрдЧ (Object.getOwnPropertyDescriptor (рдЧрд┐рд░рдлреНрддрд╛рд░, "0")); // рдСрдмреНрдЬреЗрдХреНрдЯ {рдореВрд▓реНрдп: (5) [...], рд▓реЗрдЦрди рдпреЛрдЧреНрдп: рд╕рддреНрдп, рдЧрдгрдирд╛ рдпреЛрдЧреНрдп: рд╕рддреНрдп, рд╡рд┐рдиреНрдпрд╛рд╕ рдпреЛрдЧреНрдп: рд╕рддреНрдп}
рдХрдВрд╕реЛрд▓.рд▓реЙрдЧ (рдЧрд┐рд░рдлреНрддрд╛рд░ [0] [0]); // рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд
рдХрдВрд╕реЛрд▓.рд▓реЙрдЧ (Object.getOwnPropertyDescriptor (рдЧрд┐рд░рдлреНрддрд╛рд░ [0], "0")); // рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд

рдпрд╣ рдирд╣реАрдВ рд╣реИ, рд╡рд╣ рдирд╣реАрдВ рд╣реИ рдЬреЛ рд╡рд╣ рдЪрд╛рд╣рддрд╛ рдерд╛ ...

рд╕рдВрджрд░реНрдн:

тЖТ ECMAScript 2015 рднрд╛рд╖рд╛ рдХреА рд╡рд┐рд╢рд┐рд╖реНрдЯрддрд╛
тЖТ рдХреНрдпрд╛ рд╣реИ Array.apply рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ

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


All Articles