2023.06.16
경고: 콤마 연산자와 화살표 함수
간결한 형태의 화살표 함수는 => 뒤에 표현식을 취하기 때문에 일부 프로그래머는 함수에서 할 일이 두세 가지만 있으면 장황한 양식을 사용하지 않기 위해 쉼표 연산자를 사용했다. 쉼표 연산자는 자바스크립트의 이상한 연산자 중 하나이다. 왼쪽 피연산자를 평가하고 결팟값을 버리고 오른쪽 피연산자를 평가하고 그 값을 결과로 취한다.
function returnSecond(a, b) {
return a, b;
}
console.log(returnSecond(1, 2)); // 2
return a, b의 결과는 b의 값이다.
function Thingy() {}
var t = new Thingy();
console.log(Object.getPrototypeOf(t) === Thingy.prototype); // true
function traditional() {}
const arrow = () => {};
console.log('prototype' in traditional); // true
console.log('prototype' in arrow); // false
단순하지 않은 매개변수 목록 및 엄격한 모드 변경
기본값이나 배우게 될 다른 ES2015+ 매개변수 기능이 없는 단순한 매개변수 목록인 매개변수 목록을 ‘단순’ 매개변수 목록이라고 한다. 매개변수 목록이 새로운 기능을 사용하는 경우 이를 ‘단순하지 않은’ 매개변수 목록이라고 한다.
놀랍게도 단순하지 않은 매개변수 목록이 있는 함수는 "use strict" 지시문을 가질 수 없다.
function example(answer = 42) {
‘use strict’; // SyntaxError: Illegal 'use strict' directive<br/>
// 단순하지 않은 매개변수 목록이 있는 함수
console.log(answer);
}
구문 분석의 복잡성을 피하기 위해 함수 정의가 이미 엄격한 컨텍스트에 표시되더라도 단순하지 않은 매개변수 목록이 있는 경우 "use strict" 지시문을 가질 수 없다. 정의된 컨텍스트의 엄격함만 상속할 수 있다.
function none() {}
console.log(none.length); // 0
function one(a) {}
console.log(one.length); // 1
function stillOne(a, b = 42) {}
console.log(stillOne.length); // 1
function oneYetAgain(a, b = 42, c) {}
console.log(oneYetAgain.length); // 1
function extend(target, ...sources) {
sources.forEach((source) => {
Object.keys(source).forEach((key) => {
target[key] = source[key];
});
});
return target;
}
const obj = extend({}, { a: 1 }, { b: 2 });
console.log(obj); // {a: 1, b: 2}
const extend = (target, ...sources) => {
sources.forEach((source) => {
Object.keys(source).forEach((key) => {
target[key] = source[key];
});
});
return target;
};
const obj = extend({}, { a: 1 }, { b: 2 });
console.log(obj); // {a: 1, b: 2}
function example(
question, // (string) The question, must end with a question mark
answer, // (string) The answer, must end with appropriate punctuation
) {
console.log('question: ' + question);
console.log('answer: ' + answer);
}
example('Do you like building software?', 'Big time!');
// Declaration
function foo() {}
console.log(foo.name); // "foo"
// Named function expression
const f = function bar() {};
console.log(f.name); // "bar"
let foo;
foo = function () {};
console.log(foo.name); // "foo"
let foo = () => {};
console.log(foo.name); // "foo"
const obj = {
foo: function () {},
};
console.log(obj.foo.name); // "foo"
(function (callback = function () {}) {
console.log(callback.name); // "callback"
})();
const obj = {};
obj.foo = function () {};
console.log(obj.foo.name); // "" - there's no name
// 앱에 사용자와 관련된 일부 비밀 정보로 키가 지정된 핸들러 캐시가 있고
// 핸드러를 일부 외부 코드에 전달해야 한다고 가정해 보자.
cache[getUserSecret(user)] = function () {};
// 함수 이름은 해당 작업에 의해 설정되었으며
// 핸들러 함수를 타사 코드에 제공하면 getUserSecret(user)의 값이 제공된다.
'use strict';
function branching(num) {
console.log(num);
if (num < 0.5) {
console.log('true branch, typeof doSomething = ' + typeof doSomething);
function doSomething() {
console.log('true');
}
} else {
console.log('false branch, typeof doSomething = ' + typeof doSomething);
function doSomething() {
console.log('false');
}
}
doSomething();
}
branching(Math.random());
'use strict';
function branching(num) {
console.log(num);
if (num < 0.5) {
let doSomething = function doSomething() {
console.log('true');
};
console.log('true branch, typeof doSomething = ' + typeof doSomething);
} else {
let doSomething = function doSomething() {
console.log('false');
};
console.log('false branch, typeof doSomething = ' + typeof doSomething);
}
doSomething();
}
branching(Math.random());
'use strict';
function branching(num) {
let f;
console.log(num);
if (num < 0.5) {
console.log('true branch, typeof doSomething = ' + typeof doSomething);
f = doSomething;
function doSomething() {
console.log('true');
}
} else {
console.log('false branch, typeof doSomething = ' + typeof doSomething);
f = doSomething;
function doSomething() {
console.log('false');
}
}
f();
}
branching(Math.random());
function branching(num) {
console.log('num = ' + num + ', typeof doSomething = ' + typeof doSomething);
if (num < 0.5) {
console.log('true branch, typeof doSomething = ' + typeof doSomething);
function doSomething() {
console.log('true');
}
console.log('end of true block');
} else {
console.log('false branch, typeof doSomething = ' + typeof doSomething);
function doSomething() {
console.log('false');
}
console.log('end of false block');
}
doSomething();
}
branching(Math.random());
function branching(num) {
var varDoSomething;
console.log('num = ' + num + ', typeof doSomething = ' + typeof doSomething);
if (num < 0.5) {
let letDoSomething = function doSomething() {
console.log('true');
};
console.log('true branch, typeof doSomething = ' + typeof doSomething);
varDoSomething = letDoSomething; // 선언이 있던 곳
console.log('end of true block');
} else {
let letDoSomething = function doSomething() {
console.log('false');
};
console.log('false branch, typeof doSomething = ' + typeof doSomething);
varDoSomething = letDoSomething; // 선언이 있던 곳
console.log('end of false block');
}
varDoSomething();
}
branching(Math.random());
var self = this;
this.entires.forEach(function (entry) {
//...
});
someArray.sort((a, b) => a - b);
function doSomething(delay = 300) {}