우리가 좋아하는(또는 싫어하는) 언어인 JavaScript는 강력하면서도 당혹스러운 독특한 동작과 특징으로 가득 차 있습니다. 이러한 "이상한 부분"은 초보자에게 혼란을 줄 수 있지만, 능숙한 개발자가 되려면 이러한 부분을 마스터하는 것이 필수적입니다. 모든 개발자가 알아야 할 몇 가지 흥미로운 JavaScript 특징을 살펴보겠습니다.
JavaScript는 유형 간 값을 변환하여 도움을 주려고 노력하지만 이러한 "유용성"은 놀라운 결과를 초래할 수 있습니다.
예: 예상치 못한 수학
console.log('5' - 3); // 2 console.log('5' + 3); // '53'
자바스크립트에서 이 동작은 함수가 어떻게 호출되는지에 따라 달라지기 때문에 혼란스러울 때가 많습니다.
예: 다양한 상황
function showThis() { console.log(this); } showThis(); // Window or undefined in strict mode const obj = { method: showThis }; obj.method(); // obj const boundFunc = showThis.bind(obj); boundFunc(); // obj
JavaScript는 단일 스레드이지만 이벤트 루프를 통해 비동기 작업을 처리할 수 있습니다.
예: 무엇이 먼저 실행됩니까?
console.log('Start'); setTimeout(() => console.log('Timeout'), 0); Promise.resolve().then(() => console.log('Promise')); console.log('End');
출력
Start End Promise Timeout
이벤트 루프를 이해하는 것은 고성능 비동기 코드를 작성하는 데 핵심입니다.
클로저는 외부 함수가 반환된 후에도 함수가 어휘 범위를 "기억"하는 경우입니다.
예: 개인 변수
function counter() { let count = 0; return function () { count++; console.log(count); }; } const increment = counter(); increment(); // 1 increment(); // 2
클로저를 사용하면 비공개 변수를 생성하고 함수 호출 전반에 걸쳐 상태를 유지할 수 있습니다.
JavaScript는 프로토타입 기반 상속을 사용합니다. 즉, 객체는 다른 객체의 속성과 메서드를 상속받을 수 있습니다.
예: 사용자 정의 방법
console.log('5' - 3); // 2 console.log('5' + 3); // '53'
프로토타입을 사용하면 인스턴스 전체에서 효율적으로 메서드를 공유할 수 있습니다.
JavaScript는 느슨한 동등(==)과 엄격한 동등(===)을 모두 제공하며 서로 다르게 동작합니다.
예: Null 및 정의되지 않음의 이상한 경우
function showThis() { console.log(this); } showThis(); // Window or undefined in strict mode const obj = { method: showThis }; obj.method(); // obj const boundFunc = showThis.bind(obj); boundFunc(); // obj
명시적으로 유형 변환이 필요한 경우가 아니면 항상 ===를 사용하세요.
기본이 아닌 값을 직접 비교하지 마세요({} !== {}).
JavaScript는 객체와 배열을 참조 유형으로 처리합니다. 즉, 참조에 대한 변경 사항이 원본에 영향을 미칩니다.
예: 함정 복사
console.log('Start'); setTimeout(() => console.log('Timeout'), 0); Promise.resolve().then(() => console.log('Promise')); console.log('End');
NaN은 "Not a Number"를 의미하지만 그 동작은 전혀 간단하지 않습니다.
예: NaN 비교
Start End Promise Timeout
NaN과 같은 특수한 경우에 엄격한 동등성이 필요할 때 Object.is를 사용하세요.
호이스팅은 변수 및 함수 선언을 해당 범위의 맨 위로 이동합니다.
예: 변수 호이스팅
function counter() { let count = 0; return function () { count++; console.log(count); }; } const increment = counter(); increment(); // 1 increment(); // 2
변수 호이스팅 혼동을 피하려면 let과 const를 사용하세요.
기본 매개변수는 함수를 더욱 유연하게 만들지만 정의되지 않은 매개변수와 결합하면 이상하게 동작할 수 있습니다.
예: 기본값 및 인수
function Person(name) { this.name = name; } Person.prototype.greet = function () { console.log(`Hello, my name is ${this.name}`); }; const alice = new Person('Alice'); alice.greet(); // Hello, my name is Alice
기본 매개변수는 인수가 null이 아닌 정의되지 않은 경우에만 적용됩니다.
JavaScript의 특이한 점은 실망스럽기도 하고 재미있기도 합니다. 이러한 동작을 이해하면 더 나은 개발자가 될 뿐만 아니라 언어의 유연성과 디자인 선택을 이해하는 데에도 도움이 됩니다.
다음 중 어떤 문제가 발생했으며 어떻게 해결하셨나요? 아래 댓글로 여러분의 생각을 공유해주세요!
위 내용은 모든 개발자가 알아야 할 JavaScript의 이상한 부분 디코딩의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!