function square(number) {
return number * number;
}
console.log(Object.getOwnPropertyDescriptors(square));
/*
arguments: {value: null, writable: false, enumerable: false, configurable: false}
caller: {value: null, writable: false, enumerable: false, configurable: false}
length: {value: 1, writable: false, enumerable: false, configurable: true}
name: {value: 'square', writable: false, enumerable: false, configurable: true}
prototype: {value: {…}, writable: true, enumerable: false, configurable: false}
*/
// __proto__는 square 함수의 프로퍼티가 아니다
console.log(Object.getOwnPropertyDescriptors(square, '__proto__')); // undefined
// square 함수는 Object.prototype 객체로 부터 __proto__ 접근자 프로퍼티 상속
console.log(Object.getOwnPropertyDescriptors(Object.prototype, '__proto__')); //
💡 arguments 객체의 Symbol(Symbol.iterator) 프로퍼티
- arguments 객체의 Symbol 프로퍼티는 arguments 객체를 순회 가능한 자료 구조인 이터러블로 만들기 위한 프로퍼티
function multiply(x, y) { const iterator = arguments[Symbol.iterator](); // 이터레이터의 next 메서드를 호출하여 이터러블 객체 arguments를 순회 console.log(iterator.next()); // {value: 1, done: false} console.log(iterator.next()); // {value: 2, done: false} console.log(iterator.next()); // {value: 3, done: false} console.log(iterator.next()); // {value: undefined, done: true} return x * y; } multiply(1, 2, 3);
function sum() {
let res = 0;
// arguments 객체는 length 프로퍼티가 있는 유사 배열 객체 for 문으로 순회 가능
for ( let i = 0; i < arguments.length; i++) {
res += arguments[i];
}
return res;
}
console.log(sum()); // 0
console.log(sum(1, 2)); // 3
console.log(sum(1, 2, 3)); // 6
💡 유사 배열 객체와 이터러블
- 이터러블 개념이 없던 ES5에서 arguments 객체는 유사 배열 객체로 구분,
하지만 이터러블이 도입된 ES6부터 arguements 객체는 유사 배열 객체면서 동시에 이터러블
function sum() {
//arguments 객체를 배열로 변환
const array = Array.prototype.slice.call(arguments);
return array.reduce((pre, cur) => pre + cur, 0);
}
console.log(sum(1, 2)); //3
console.log(sum(1, 2, 3, 4, 5)); // 15
// ES6 Rest 파라미터
function sum(...args) {
return args.reduce((pre, cur) => pre + cur, 0);
}
console.log(sum(1, 2)); //3
console.log(sum(1, 2, 3, 4, 5)); // 15
function foo() {}
console.log(foo.length); // 0
function bar(x) {
return x;
}
console.log(bar.length); // 1
function baz(x, y) {
return x * y;
}
console.log(baz.length); // 2
// 기명 함수 표현식
var nameFunc = function foo() {};
console.log(namedFunc.name); // foo
// 익명 함수 표현식
var anonymousFunc = function() {};
// ES5 : name 프로퍼티는 빈 문자열
// ES6 : name 프로퍼티는 함수 객체를 가리키는 변수 이름을 값으로 갖는다
console.log(anonymousFunc.name); // anonymousFnc
// 함수 선언문
function bar() {}
console.log(bar.name); // bar
// 함수 객체는 prototype 프로퍼티를 소유
(function () {}).hasOwnProperty('prototype'); // true
// 일반 객체는 prototype 프로퍼티를 소유하지 않음
({}).hasOwnProperty('prototype'); // false
📖 참고도서 : 모던 자바스크립트 Deep Dive 자바스크립트의 기본 개념과 동작 원리 / 이웅모 저 | 위키북스