JavaScript에서 2+2가 22인 이유(버그를 유발하는 기타 문제)
12229 단어 webdevjavascript
2+2가 22일 때
로컬 저장소에 숫자 2를 저장하고 몇 가지 계산을 위해 다시 검색한다고 가정해 보겠습니다.
const firstNumber = localStorage.getItem("number"); // "2"
const secondNumber = 2;
console.log(firstNumber + secondNumber); // Outputs "22"
예, 이제 합계는 22입니다! 왜 그런거야? 로컬 저장소에서 데이터를 얻었을 때 숫자 2...를 문자열로 얻었기 때문입니다.
연산자
+
를 사용하고 관련 문자열이 있는 경우 JavaScript는 두 문자열을 연결(즉, 결합)하려고 한다고 간주합니다. secondNumber
를 문자열로 변환하고 두 문자열을 결합합니다.이것을 피하려면 정수에
parseInt
를 사용하거나 소수가 있는 숫자에 parseFloat
를 사용하여 문자열을 실수로 변환해야 합니다.const firstNumber = parseInt(localStorage.getItem("number")); // 2
const secondNumber = 2;
console.log(firstNumber + secondNumber); // Outputs 4
문자열도 포함할 수 있는 소스에서 숫자를 가져오려는 경우 이 작업을 수행해야 합니다. 예를 들어
localStorage
, HTML 속성 값, HTML 요소의 텍스트 내용 또는 쿼리 문자열입니다.(실수로) 변수를 선언하지 않고 생성하기
JavaScript에서는 변수를 선언하지 않고 생성할 수 있습니다. 즉,
var
, const
또는 let
를 사용하지 않고 :const someNumber = 42; // I've created a variable declaring it
someOtherNumber = 547; // I've created a variable without declaring it
문제는 이전에 사용한 변수를 사용하려는 경우 이름의 철자를 잘못 입력하면 실수로 새 변수를 만들 수 있다는 것입니다.
function calculateAverage(...numbers) {
let average = 0;
for (let number of numbers) {
average += number;
}
averag = average / numbers.length; // I misspelt "average"! 😱
return average;
}
console.log(calculateAverage(8, 6, 10, 2, 54)); // Outputs 80
평균은 16이어야 하지만 대신 80을 반환합니다. 왜요? 루프 후에 "평균"의 철자를 잘못 입력하고 새로운 변수
averag
를 생성했기 때문입니다. 이제 실제 평균은 해당 변수에 있으며 실제average
값에는 루프를 통해 수행한 합계가 포함됩니다.그것을 해결하는 방법? 해결책은 파일의 시작 부분이나
"use strict"
블록에 문자열<script>
을 추가하는 것입니다. 선언하지 않고 변수를 생성하는 것을 허용하지 않으며 그렇게 하려고 하면 오류가 발생합니다."use strict";
function calculateAverage(...numbers) {
let average = 0;
for (let number of numbers) {
average += number;
}
// It throws an error, "averag is not defined"
averag = average / numbers.length;
return average;
}
console.log(calculateAverage(8, 6, 10, 2, 54));
그러나 이미 존재하는 파일이나 스크립팅 블록에 추가하려면 먼저 모든 변수가
const
, let
또는 적어도 var
를 사용하여 올바르게 선언되었는지 확인하십시오.등호 연산자
모든 JavaScript 개발자는
==
연산자가 두 변수 또는 값이 같은지 확인한다는 것을 알고 있습니다.const numberTen = 10;
const anotherNumberTen = 10;
console.log(numberTen == anotherNumberTen); // Outputs "true"
그러나 이 연산자를 객체나 배열과 함께 사용하려면 조금 더 까다로워집니다.
const someObject = { name: "Sonic", amimal: "Hedgehog" };
const someOtherObject = { name: "Sonic", amimal: "Hedgehog" };
console.log(someObject == someOtherObject); // Outputs "false"
왜요? JavaScript에서 연산자는 두 변수가 동일한 객체를 참조하는 경우 true를 반환합니다. 이 경우, 우리는 두 개의 다른 객체를 가지고 있는데, 그것들은 단지 같은 속성을 가지고 있습니다.
두 개체를 비교하려는 경우 가장 좋은 방법은 필요한 속성을 확인하는 것입니다. 이 경우 다음과 같이 할 것입니다.
const someObject = { name: "Sonic", amimal: "Hedgehog" };
const someOtherObject = { name: "Sonic", amimal: "Hedgehog" };
console.log(someObject.name == someOtherObject.name); // Outputs "true"
내가 가장 좋아하는 것: 바나나!
마지막 것은 누구에게도 버그를 일으키지 않지만 나는 그것을 좋아합니다.
console.log(("b" + "a" + + "a" + "a").toLowerCase());
// Outputs "banana"
대체 여기에서 무슨 일이 있었던 걸까요? 먼저
"b"
를 첫 번째 "a"
와 연결하므로 "ba"
를 얻습니다. 이제 두 개의+
기호와 또 다른"a"
기호가 있습니다. 일단 첫 번째+
를 건너뛰고+ "a"
부분으로 넘어가 보겠습니다."
"a"
양수로 변환"을 의미합니다. 그러나 그 문자는 분명히 유효한 숫자가 아니므로 표현식은 NaN
를 반환합니다. +
기호는 "ba"
를 NaN
와 연결하기 전에 건너뛰었고 "baNaN"
가 있습니다.마지막으로 문자열
"a"
을 얻기 위해 마지막"baNaNa"
과 연결하고 소문자로 변환합니다. 짜잔, 우리는 이 이상한 표현에서 바나나를 얻었습니다.추신. 읽은 내용이 마음에 드셨나요? 매주 저는 더 나은 JavaScript 개발자가 되기 위한 무료 팁과 통찰력이 포함된 이메일을 보냅니다. 관심이 있으시면 click here to subscribe .
Reference
이 문제에 관하여(JavaScript에서 2+2가 22인 이유(버그를 유발하는 기타 문제)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/nicozerpa/why-2-2-equals-22-in-javascript-and-other-gotchas-that-cause-bugs-44ek텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)