function solution(files) {
files.sort((a, b) => {
let [firstHead, firstNum] = getData(a);
let [secondHead, secondNum] = getData(b);
if (firstHead < secondHead) return -1;
else if (firstHead > secondHead) return 1;
return firstNum - secondNum;
});
return files;
}
function getData(file) {
let headIndex;
let numberIndex;
for (let i = 0; i < file.length; i++) {
if (!headIndex && !isNaN(parseInt(file[i]))) {
headIndex = i;
}
if (headIndex && isNaN(parseInt(file[i + 1]))) {
numberIndex = i;
break;
}
}
const head = file.slice(0, headIndex);
const number = file.slice(headIndex, numberIndex + 1);
return [head.toLowerCase(), Number(number)];
}
isNaN()
을 사용할 때 매개변수 안에 문자열 그대로 대입하였다. 만약 "1"이나 "A"와 같은 문자를 대입한다면, "false"과 "true"처럼 예상과 같은 결과가 나온다.
" "나 ""와 같이 빈 문자를 대입한다면 어떤 결과가 나올까? 이 문제에서는 숫자가 아닌 것으로 인식해 "true"가 나오길 기대한다.
그러나 isNaN()
은 빈 문자나 공백을 숫자로 인식해 "false"를 반환한다.
isNaN(NaN); // true
isNaN(undefined); // true
isNaN({}); // true
isNaN(true); // false
isNaN(null); // false
isNaN(37); // false
// Strings
isNaN("37"); // false: "37" is converted to the number 37 which is not NaN
isNaN("37.37"); // false: "37.37" is converted to the number 37.37 which is not NaN
isNaN("37,5"); // true
isNaN("123ABC"); // true: Number("123ABC") is NaN
isNaN(""); // false: the empty string is converted to 0 which is not NaN
isNaN(" "); // false: a string with spaces is converted to 0 which is not NaN
// Dates
isNaN(new Date()); // false; Date objects can be converted to a number (timestamp)
isNaN(new Date().toString()); // true; the string representation of a Date object cannot be parsed as a number
따라서 isNaN()
안에서 문자열을 판단하고 싶다면 문자열을 숫자로 바꾸는 과정을 추가해야 안전하게 사용할 수 있다.