코드스쿼드 코코아과정 2주차 TIL - Part2
Linting이란, 특정 프로그래밍 언어로 소스 코드를 분석하고 프로그램 오류, 버그, 스타일 오류, 의심스러운 구조체 등 잠재적 문제를 표시하는 프로세스.
NaN이 'Not A Number'의 약자라는데, number가 아닌 것의 타입은 number다. 😂
요소의 수를 세기 위한 나의 가설은 이랬다:
const data1 = "[1,2,[3,4,[5,[6]]]]";
const dataArr = dataStr.split("");
dataArr = ['[', '1', ',', '2', ',', '[', '3', ',', '4', ',', '[', '5', ',', '[', '6', ']', ']', ']', ']']
let count = 0;
arr.forEach(function (letter) {
if (typeof (letter*1) === "number")
count++
});
그런데 여기서 count가 6이 아닌 '19'가 나온다.😕
알고보니 "["
, ","
이런 요소들이 *1
로 강제타입변환을 하면 NaN
이 되는데, NaN
은 타입이 number
가 되기 때문이다.
typeof NaN
//"number"
typeof NaN === "number"
//true
이러니 조건이 다 true가 될 수 밖에... 그래서 && !(letter === NaN)
라는 조건을 추가해보려 했지만
NaN === NaN
//false ⭐️⭐️⭐️
이기 때문에 NaN
을 걸러내지 못한다. 구글링을 해보니 NaN
이NaN
인지를 검사하려면 isNaN()을 써야한다.
이렇게:
isNaN(NaN);
//true ⭐️⭐️⭐️
이렇게 조건을 추가하니 값을 정상적으로 반환해준다! 🎉
function countEl (arr) {
let count = 0;
arr.forEach(function (letter) {
if (!isNaN(letter*1))
count++
});
return count;
}
//count = 6;
" "
는 숫자로 강제타입변환 시 NaN
이 아닌 0
이 나온다!
" " * 1 //0
eval()
메소드는 문자열을 JavaScript 코드로 인식해 별도의 타입변환 없이도 실행할 수 있게 변환해준다.
eval(str)은 문자로 표현된 JavaScript 코드를 실행하는 함수입니다.
-MDN
그래서 아래처럼 배열모양의 문자열을 진짜 배열로 바꾸는 데에 응용할 수도 있다!! 😃
구분자들까지 검사할 필요가 있는 게 아니라면 문자열을 배열로 바꾸기 위해서 꼭 split("")
을 써서 ["[", "1", ",", "2", ",", "[", "3", ",", "4", ",", "[", "5", ",", "[", "6", "]", "]", "]", "]"]
와 같은 모양으로 나눌 필요가 없는 것이다!
나뉘는 수(dividend; 피제수)가 나누는 수(divisor; 제수)보다 작을 때, 나머지는 나뉘는 수가 그대로 반환된다.
// 피제수 > 제수
7 % 5 //2
// 피제수 < 제수
2 % 5 //2
ES6를 지원하는 환경이라면, Spread operator(...)를 사용해 보다 편하게 배열에서 최댓값을 구할 수 있다.
이 방법은 만일 배열 내에 최댓값이 하나 이상이라고 하더라도, 최댓값 하나만을 반환한다.
const arr = [1, 2, 3, 4, 5, 5];
Math.max(...arr) //5
아래와 같이 apply(null, arr)를 사용해 최댓값을 찾을 수도 있다.
apply의 주요 기능은 1) 함수를 실행함과 동시에 2) this 값을 지정하는 것이다.
Math.max로 내장 Array 객체를 보강하게 되면 다른 라이브러리와 충돌 할 수 있으므로 apply로 배열에 직접 연결을 하는 것이다.
(syntax: 함수명.apply(this값, [매개변수로 전달되는 배열]
)
var arr = [1, 2, 18, 4, 5, 6];
Math.max.apply(null, arr); //18
여기서 this값은 지정하지 않기 때문에 null로 대체한다.
같은 원리로 Math.min(...arr)로는 최솟값을 구할 수도 있다.
var arr = [1, 2, 0, 4, 5, 6];
Math.min(...arr) //0
console로 로깅을 할 때, 객체는 console.dir();
를 사용하면 JSON파일과 유사한 object tree를 시각적으로 확인할 수 있다.
console.log
prints the element in an HTML-like tree
console.dir
prints the element in a JSON-like tree-MDN
console.dir(objTree, { depth: null });
로 객체트리(a.k.a JSON객체)를 출력한 모습 ⬇️ (stackoverflow의 관련 내용)
만일 DOM객체에 어떤 메서드가 있는 지 보고 싶다면 console.dir()
을 사용하는 것이 좋다.
JSON객체출력은 JSON.stringify()
를 이용할 수도 있다.
[
, ,
, ]
등은 '구분자'라고 부름.\d
는 digit을 의미하는 것으로 escaping 하는 방법.function MyName () {
}
MyName.prototype.getName = function () {
//함수내용
}
MyName.prototype.setName = function () {
//함수내용
}
//예제 코드
function MyName (name) {
this.name = name;
}
MyName.prototype.getName = function () {
setTimeout(function (){
debugger;
console.log("name is ", this.name);
}, 1000)
}
MyName.prototype.setName = function () {
}
const my = new MyName("Hannah");
my.getName();
=>
)에서 this는 lexical scope를 가리키기 때문에 상위스코프의 this를 의미하게 된다.Return
키워드 없이 화살표 함수(람다표기법)으로 쓰면 좀 더 세련된 코드 스타일을 만들 수 있다.서브루틴이란?
:프로그램 지침의 연속성, 유닛으로 프로그램들 혹은 라이브러리로 분할되어서 정의될 수 있다.
서브루틴은 여러 프로그램 언어에서 procedure, function, routine, method, subprogram등로 불린다.-https://codenamenadja.github.io/2020/06/06/computing/routine_subroutine/
parser : 분석된 정보(의미가 달린 토큰)를 스택에 푸시를 하는 행위.
*본 포스팅은 아래 사이트들을 참고 및 인용하여 작성되었습니다.
학습단계로 잘못된 정보가 있을 수 있습니다. 잘못된 부분에 대해 알려주시면 곧바로 정정하도록 하겠습니다 😊
https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/eval
https://ko.wikipedia.org/wiki/%EB%A6%B0%ED%8A%B8_(%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4)
http://dudmy.net/javascript/2015/11/16/javascript-sort/
https://c10106.tistory.com/3787
https://developer.mozilla.org/en-US/docs/Web/API/Console/log#Difference_with_console.dir()
https://stackoverflow.com/questions/10729276/how-can-i-get-the-full-object-in-node-jss-console-log-rather-than-object
https://ko.javascript.info/regexp-escaping
https://ko.wikipedia.org/wiki/%ED%95%98%EB%85%B8%EC%9D%B4%EC%9D%98_%ED%83%91
https://codenamenadja.github.io/2020/06/06/computing/routine_subroutine/