취미로 프로그래밍 독학하는 사람인데여
function hello(name1, name2) {
console.log(name1, (name2 || 'Hi'));
}
hello('Kim'); // Kim Hi 출력
hello('Park', 'Hello'); // Park Hello 출력
저거 굵은글씨 아무리 봐도 이해가 안됨;; 불린값으로 나와야되는거 아님? 어째서 삼항연산자처럼 실행되는거임?;;
취미로 프로그래밍 독학하는 사람인데여
function hello(name1, name2) {
console.log(name1, (name2 || 'Hi'));
}
hello('Kim'); // Kim Hi 출력
hello('Park', 'Hello'); // Park Hello 출력
저거 굵은글씨 아무리 봐도 이해가 안됨;; 불린값으로 나와야되는거 아님? 어째서 삼항연산자처럼 실행되는거임?;;
JavaScript의 Short Circuit 특성을 이용한 일종의 Hack임. 고로 JavaScript에서만 가능. 예를 들어 boolean1 && boolean2 라는 식에서 boolean1이 false이면 굳이 boolean2를 읽을 필요 없이 전체 식은 false가 되지? 반면 boolean1이 true면 boolean2 값에 따라 전체 식의 값이 true인지 false인지 결정되고. 타 언어의 Short Circuit에서는 &&, || 같은 연산자에서 앞의 항만 신경쓰는데 JavaScript에서는 뒤의 항도 적극 이용한다. value = a && b; 면 if(!a) value = a; else value = b; 처럼 작동한다. 예) value = null && 3; 이면
저건 루비도 마찬가지임
다른 언어에서는 value가 false가 되는데 JavaScript에서는 &&, ||의 결과를 boolean으로 고정해두지 않아서 value 값은 (false로 판단되는) null 값으로 되어서 value == null 이 됨. ||도 마찬가지여서. false || x 면 앞의 식이 false기 때문에 뒤의 식에 의해 식의 값이 결정되므로 false || x는 그냥 x랑 같아지게 된다. 다른 언어에서는 true when x is evaluated as true, otherwise false 지만.
루비도 그러냐? 암튼. C/C++의 short circuit보다 더 확장된 형태의 short circuit임. 스크립트 언어여서 가능하다랄까.
C/C++에서도 컴파일러에서 얼마든지 저런 거 지원하려면 할 수 있는데 속도만 느려지니까 안하는 거. 반면 스크립트 언어들은 이미 속도를 깎아먹을대로 깎아먹은 상태니깐 맘 편하게 이런 게 적용되어 있고.
물론 C/C++ 표준 자체가 &&, || 연산자의 값을 제한해 놓은 탓도 있겠지만. 표준에서 그렇게 제한해놓은 이면에는 저런 계산이 깔려있다.
루비에선 저걸 이용해 idiom으로 x ||= x || value 이런식으로 많이 쓰지
아잘못썼다 x ||= value
이걸 지원하는 언어는 내가 위에서 말했듯이 대부분 스크립트 언어들인데, 그래서 이걸 지원하는 언어라면 적극적으로 코드에서 쓰는 게 성능에 좋음. 왜냐하면 직접 if 문으로 하는 것보다 인터프리터 내부에서 기계어 코드로 알아서 if 돌려주는 게 더 빠를테니깐.
(난 자바스크립트만 되는 줄 알았는데 ㄴㄴ이가 루비도 된다고 하니)
아 그렇구나;;;; 감사합니다 프갤성님덜 ㅠㅠㅠ