JavaScript 일반적인 오류
이 장에서는 일반적인 JavaScript 오류를 몇 가지 지적합니다.
실수로 대입 연산자를 사용하는 경우:
프로그래머가 if
문구에서 실수로 대입 연산자를 사용하는 경우:=
)이 비교 연산자가 아니라 대입 연산자====
),JavaScript 프로그램은 예상치 못한 결과를 생성할 수 있습니다.
이 문구 if
문구는 반환합니다: false
예상했던 것처럼, x는 10과 다르기 때문에:
var x = 0; if (x == 10)
이 문구 if
문구는 반환합니다: true
예상하지 않았던 것처럼, 10은 true이기 때문에:
var x = 0; if (x = 10)
이 문구 if
문구는 반환합니다: false
예상하지 않았던 것처럼, 0은 false이기 때문에:
var x = 0; if (x = 0)
할당은 항상 할당된 값을 반환합니다.
대략적인 비교를 기대합니다
일반적인 비교에서 데이터 타입은 중요하지 않습니다. 이 문구 if
문구는 반환합니다: true
:
var x = 10; var y = "10"; if (x == y)
정확한 비교에서 데이터 타입은 실제로 중요합니다. 이 문구 if
문구는 반환합니다: false
:
var x = 10; var y = "10"; if (x === y)
일반적인 오류는 switch
문구에서 정확한 비교를 사용합니다:
이 문구 switch
문구는 표시됩니다:
var x = 10; switch(x) { case 10: alert("Hello"); }
이 문구 switch
문구는 표시되지 않습니다:
var x = 10; switch(x) { case "10": alert("Hello"); }
혼란스러운 덧셈과 쇄결
덧셈를 더하는 데 사용합니다.숫자。
쇄결(Cascade)를 더하는 데 사용합니다.문자열。
JavaScript에서는 이 두 연산 모두 같은 +
연산자.
따라서 숫자를 숫자로 더하는 것과 숫자를 문자열로 더하는 것은 다른 결과를 산출합니다:
var x = 10 + 5; // x의 결과는 15 var x = 10 + "5"; // x의 결과는 "105"
두 변수를 더하는 경우 결과를 예측하기 어렵습니다:
var x = 10; var y = 5; var z = x + y; // z의 결과는 15 var x = 10; var y = "5"; var z = x + y; // z의 결과는 "105"
혼란스러운 부동소수점
JavaScript에서의 숫자는 모두 64비트로 저장됩니다.부동소수점 (Floats)。
모든 프로그래밍 언어, JavaScript를 포함하여, 부동소수점 값을 처리하는 어려움이 있습니다:
var x = 0.1; var y = 0.2; var z = x + y // z의 결과는 0.3이 아닙니다
위의 문제를 해결하기 위해 곱셈과 나눗셈을 사용하세요:
예제
var z = (x * 10 + y * 10) / 10; // z의 결과는 0.3입니다
JavaScript 문자열 줄바꿈
JavaScript는 문장을 줄바꿈하여 두 줄로 작성할 수 있습니다:
예제 1
var x = "Hello World!";
하지만, 문자열 중간에서 줄바꿈은 올바르지 않습니다:
예제 2
var x = "Hello World!";
예제 3
var x = "Hello \", World!";
return 문장을 줄바꿈하다
줄 끝에 자동으로 문장을 닫는 것은 기본적인 JavaScript 행동입니다.
따라서 다음 두 예제는 동일한 결과를 반환합니다:
예제 1
function myFunction(a) { var power = 10 return a * power }
예제 2
function myFunction(a) { var power = 10; return a * power; }
JavaScript는 문장을 줄바꿈하여 두 줄로 작성할 수도 있습니다.
따라서 예제 3도 동일한 결과를 반환합니다:
예제 3
function myFunction(a) { var power = 10; return a * power; }
하지만, 다음과 같이: return
문장을 줄바꿈하면 무엇이 일어날까요:
예제 4
function myFunction(a) { var power = 10; return a * power; }
이 함수는 다음을 반환합니다 undefined
!
왜 그런가요? JavaScript는 당신의 의도를 다음과 같이 생각합니다:
예제 5
function myFunction(a) { var power = 10; return; a * power; }
설명
만약 문장이 불완전하다면:
var
JavaScript는 다음 줄을 읽어 이 문장을 완료합니다:
power = 10;
하지만 이 문장은 완전합니다:
return
JavaScript는 이 문장을 자동으로 닫습니다:
return;
이런 일이 발생하는 이유는 JavaScript에서 문장을 종료하는 세미콜론을 사용하는 것은 선택 사항이기 때문입니다.
JavaScript는 줄 끝에 자동으로 문장을 닫습니다 return
문장을 줄바꿈하지 마세요. 그것은 본인이 완전한 문장입니다.
따라서 결코 return
문장을 줄바꿈합니다。
배열에 접근하기 위해 이름으로 인덱싱을 사용합니다
많은 프로그래밍 언어가 이름 지정된 인덱스를 포함한 배열을 지원합니다。
이름 지정된 인덱스를 포함한 배열은 연결 배열(또는 해시)라고 합니다.
JavaScript 지원하지 않습니다이름 지정된 인덱스를 포함한 배열
JavaScript에서는배열사용숫자 인덱스:
예제
var person = []; person[0] = "Bill"; person[1] = "Gates"; person[2] = 46; var x = person.length; // person.length은 3을 반환합니다 var y = person[0]; // person[0]은 "Bill"을 반환합니다
JavaScript에서는객체사용이름 지정된 인덱스。
이름 지정된 인덱스를 사용하면, 배열에 접근할 때 JavaScript가 배열을 표준 객체로 재정의할 수 있습니다。
자동 재정의 후, 배열 메서드나 속성은 undefined이나 비정확한 결과를 생성할 수 있습니다:
예제
var person = []; person["firstName"] = "Bill"; person["lastName"] = "Gates"; person["age"] = 46; var x = person.length; // person.length은 0을 반환합니다 var y = person[0]; // person[0]은 undefined을 반환합니다
정의를 끝내기 위해 컴마를 사용하십시오
객체 및 배열 정의에서의 트레일링 컴마는 ECMAScript 5에서 합법적입니다。
객체 인스턴스:
person = {firstName:"Bill", lastName:"Gates", age:62,}
배열 인스턴스:
points = [35, 450, 2, 7, 30, 16,];
경고!!
Internet Explorer 8은 충돌할 수 있습니다。
JSON은 트레일링 컴마를 허용하지 않습니다。
JSON:
person = {firstName:"Bill", lastName:"Gates", age:62}
JSON:
points = [35, 450, 2, 7, 30, 16];
Undefined은 Null이 아닙니다
JavaScript 객체, 변수, 속성 및 메서드는 정의되지 않을 수 있습니다.
또한, 비어 있는 JavaScript 객체의 값은 null
。
이는 테스트 대상이 비어 있는지 확인하는 것이 어려워질 수 있습니다。
테스트 타입이 undefined
대상이 존재하는지 테스트할 수 있습니다:
예제
if (typeof myObj === "undefined")
그러나 객체가 undefined인지 테스트할 수는 없습니다 null
이유는 객체가 undefined이면 오류가 발생할 수 있기 때문입니다:
불정확한:
if (myObj === null)
이 문제를 해결하려면, 객체가 null인지 테스트해야 합니다 null
이렇게 하지 않고 undefined으로 테스트해야 합니다。
하지만 이는 여전히 오류를 일으킬 것입니다:
불정확한:
if (myObj !== null && typeof myObj !== "undefined")
따라서, null이 아닌 것을 테스트하기 전에 먼저 undefined을 테스트해야 합니다:
정확한:
if (typeof myObj !== "undefined" && myObj !== null)
블록 스코프를 기대하지 않습니다
JavaScript 하지 않습니다각 코드 블록에 새로운 스코프를 생성합니다
많은 프로그래밍 언어가 이렇게 하지만 JavaScript 그렇지 않습니다。
이 코드가 반환할 것이라고 생각합니다 undefined
,는 새로운 JavaScript 개발자의 일반적인 오류입니다:
예제
for (var i = 0; i < 10; i++) { // 코드 블록 } return i;