function (num) { return ++num; }
const decrease = function (num) { return --num; };
function makeCounter(decrease) { return decrease(1); }
함수를 객체와 동일하게 사용할 수 있다는 의미로,
객체는 값이므로 함수는 값과 동일하게 취급할 수 있음
console.dir(function() { ... });
// name: "" 출력
function square(number) {
return number * number;
}
console.log(Object.getOwnPropertyDescriptors(square));
// __proto__는 square 함수의 프로퍼티가 아님
// __proto__ = Object.prototype 객체의 접근자 프로퍼티
// Object.prototype 객체로부터 프로토타입 체이닝 타고 상속을 받아서 접근이 가능해짐
const a = [1,2,3]
const alter = a[Symbol.iterator]();
alter.next();
// { value: 1, done: false } 가 반환
이렇게 이터러블한 객체일 경우, [...a]
이렇게 펼치기가 가능!
= Symbol.iterator를 활용하면 펼치기 연산이 가능
function sum() {
let res = 0;
for (const i of arguments) {
res += i;
}
return res;
}
console.log(sum(1,2,3,4,5));
하지만, 이터러블을 지원하지 않는 환경에선 여전히 유사 배열 객체로써 존재!
const a = [1,2,3]
const b = a.slice() // 깊은 복사
console.log(a === b);
// 이터러블 환경을 지원하지 않을 땐 이렇게 썼음
const array = Array.prototype.slice.call(arguments);
// false
// 하지만 지금은 요걸 지원해서 자동으로 배열 반환해줌
function sum(...args) {
return args.reduce({pre, cur} => pre + cur, 0);
}
function sum(x, y) {
console.log(arguments.length); // 5
let res = 0;
for (const i of arguments) {
res += i;
}
return res;
}
console.log(sum(1,2,3,4,5));
console.log(sum.length); // 2
const a = func => console.dir(func);
a(function() { }) // name : 빈 문자열
a(() => { }) // name : 빈 문자열
const b = a.bind({});
b.name
// 'bound a'
(function() {}).hasOwnProperty('prototype') // true