자바스크립트에는 7가지 내장 타입이 있다.null, undefined, boolean, number, string, object, symbol(es6에서 추가)타입을 확인해보자. 함수는 타입이 function 으로 나오지만 실제론 object의 하위 타입이다.
자바스크립트는 변숫값의 타입이 나중에 바뀌어도 상관없다.변수에 typeof 연산자를 대어보는 것은 "이 변수의 타입이 무엇인가?"가 아니라 사실 "이 변수의 값의 타입이 무언긴가?" 라고 묻는 것이다.typeof 의 반환값은 문자열이다.
값이 없는 변수의 값은 undefined이고 typeof 반환값도 undefined.'값이 없는' 것과 '선언되지 않은' 것은 다르다. 둘다 영어로 undefined라 주의가 필요하다.undefined 나 apple은 정의되지 않았다는거나 영어로 하면 결국 똑같은 말.
typeof 안전가드를 이용하는 방법이러한 typeof 안전가드는, 브라우저에서 자바스크립트 내장 메소드 기능이 있는지 체크하는 폴리필을 만들 때 도와준다.이 때 주의할 점은 if문 안의 atob는 var를 사용하지 않아야 한다.만약 여기서 var를 쓴다면 if문이 f
구멍난 배열을 다룰 때 주의배열도 하나의 객체라고 할 수 있기 때문에 키/프로퍼티 문자열을 사용할 수 있다.배열에 문자로 된 숫자를 키값으로 넣을 경우 마치 숫자를 넣은것과 동일하게 동작하므로 주의해야 함.되도록이면 배열에는 문자열 키값이 아닌 인덱스 번호로만 사용하자
유사배열을 진짜 배열로 >함수의 매개변수를 입력하지 않았을 경우 arguments 객체, 즉 유사 배열로 값이 들어오게 되는데 이 유사배열을 진짜 배열로 바꾸고 싶을 때가 있다.
문자열과 배열은 닮았지만 자바스크립트에서는 같지 않다. 닮아있긴 하다. 둘 다 문자의 배열 이라고 할 수 있을까? 그렇지 않다. > 문자열은 불변(Immutable), 배열은 가변(Mutable) 값이다. 문자열은 불변 값이기 때문에 문자열 메소드는 원본 문자를
자바스크립트의 숫자 타입은 number가 유일하며 '정수', '부동 소수점 숫자'를 모두 아우른다.자바스크립트의 '정수'는 부동 소수점 값이 없는 값이다.
Number 타입의 메서드인 toFixed()인수로 지정한 수만큼 소수점 이하 자릿수까지 숫자를 나타낸다.반환 시 반올림하므로 주의.반환 시 문자열로 반환.toPrecision()toPrecision()도 비슷하지만 전체 숫자의 갯수를 지정할 수 있다.두 메서드는 숫자
부동 소수점 숫자의 부작용자바스크립트는 현대의 대부분의 프로그래밍 언어들과 마찬가지로 'IEEE 754'표준(부동 소수점 표준)을 따르는데 이는 부동 소수점 계산에 이슈가 생긴다.만약 이렇게 소수점 계산을 하고나서 같은지 체크를 하고 싶을 때가 있는데, 상식적으로 사람
정수는 Number.MAX_VALUE보다 훨씬 작은 수준에서 '안전'값의 범위가 정해져 있다.약 9천조 정도 되는 숫자인데 이거보다 더 큰 값을 다뤄야 하는 경우라면 BigInteger.js와 같은 라이브러리를 사용하는 것이 좋다.
ES6부터는 Number.isInteger()로 어떤 값의 정수 여부를 판단 가능하다.ES6 이전 버전을 위한 폴리필안전한 정수 여부는 ES6부터 Number.isSafeInteger()로 체크한다.ES6 이전 버전을 위한 폴리필
정수의 '안전 범위'가 약 9천조 정도지만, 32비트 숫자만 가능한 연산이 있어서 실제 범위는 훨씬 작다.32비트를 고려한 범위는Math.pow(-2,31) (약 -21억)에Math.pow(2,31)-1 (약 +21억)까지다.아래와 같이 비트 연산자로 체크할 수도 있다
undefined 타입의 값은 undefined밖에 없고null 타입의 값은 null뿐이다.이 둘은 타입과 값이 항상 같다.undefined와 null은 빈 값과 값 아닌 값을 나타냄어찌됐든 null은 식별자가 아니라 뭔가를 할당할 수 없지만undefined는 뭔가를
느슨한 모드에서는 전역 스코프에서 undefined에 값을 할당할 수 있다.(절대 비추천)그런데 황당한 것은 undefined라는 지역변수를 생성할 수 있다.절대 이렇게 쓰지 말자.보이드 연산자는 어떤 값이든 무효로 만드는 특징이 있어서 값을 undefined로 만들어
NaN은 말 그대로 '숫자 아님'이다. 하지만 사실 '유효하지 않은 숫자'라고 하는게 더 적절하다.Not a Number 즉, 숫자가 아닌데 타입이 "number"라니 이 무슨 해괴한 말인가?NaN은 유일하게 자기 자신과 비교를 해도 동등하지 않다.그래서 NaN을 판별
NaN, 0과 -0등을 ES6에서 Object.is() 라는 유틸리티 함수로 간단하게 판별할 수 있다.NaN은 물론 Number.isNaN()을 사용해도 된다.폴리필도 간단하다.0과 -0을 비교하는 것 외에는 == 또는 === 연산자로 판별하는 것이 더 효율적.
책에는 헷갈리게 값-복사, 레퍼런스-복사 라고 써있지만 간단히 말해 불변값과 가변값 이라고 보면 된다. > 불변값(immutable) - null, undefined, string, number, boolean, symbol > 가변값(mutable) - 나머지 배열
네이티브는 자바스크립트 내장함수다. 많이 쓰는 네이티브 내장함수들 > 생성자 함수 방식으로 문자열 또는 숫자를 만들면 그 값은 객체 래퍼에 감싸져서 반환되기 때문에 typeof 값은 "object"가 된다. 이런 객체 형태로 반환된 값을 문자열로 바꿔주는 것이 문
typeof가 'object'인 값에는 \[Class]라는 내부 프로퍼티가 추가로 붙는다.이것으로 typeof로 명확히 그 타입을 알 수 없는 Array 라던가 null, undefined 등과 같은 값의 본연의 타입을 알아낼 수 있다.null, undefined와 같
원시 값엔 프로퍼티나 메서드가 없으므로 .length, toString()으로 접근하려면 객체 래퍼( ex. new String("abc") )로 감싸줘야 한다.(다른 언어에서는..) 하지만 자바스크립트는 원시 값을 알아서 박싱(래핑)하므로 아래와 같은 코드가 가능하다
객체 래퍼를 사용하는 것을 권장하진 않지만 그래도 사용해야 한다면 아래와 같은 함정이 있으니 주의해야 한다.일반적인 객체는 'truthy'한 값이다. 그래서 조건값에 넣으면 true가 되어 위 코드의 구문은 실행되지 않는다.수동으로 원시 값을 박싱하려면 Object()
객체 래퍼의 원시 값은 valueOf() 메서드로 추출한다.valueOf()를 사용하는 과정에서 내부적으로는 아래와 같이 암시적 변환이 일어난다.
배열, 객체, 함수, 정규식 값은 리터럴 형태로(축약형) 생성하는 것이 일반적이지만, 리터럴은 생성자 형식으로 만든 것과 동일한 종류의 객체를 생성한다(즉, 래핑되지 않은 값은 없다).확실히 필요해서 쓰는게 아니라면 생성자 형태로 값을 선언하는 것은 가급적 쓰지 않는
생성자로 배열을 선언하거나 리터럴로 배열을 생성하거나 동일하다. 아래와 같은 기능이 있으니, 되도록이면 배열은 리터럴로 생성하자. 현재 크롬 버전 [비어 있음 x 3]
일반적으로 Object(), Function(), and RegExp() 생성자도 선택 사항이다(의도적인게 아니라면 사용하지 않는게 좋다).new Object() 는 사실상 사용할 일이 없다.프로퍼티르 하나씩 지정하지 말고 그냥 객체 리터럴로 한번에 지정하자.Funct
Date()와 Error()는 리터럴 형식이 없다.Error 생성자는 앞에 new가 있든 없든 결과는 같다.임의로 에러를 발생시켜야 하는 곳에 사용message 프로퍼티와 type등 다른 프로퍼티가 들어가 있을 수도 있지만, 사람이 읽기 편한 toString() 메서드
'심벌'은 ES6에서 처음 선보인, 새로운 원시 값 타입이다.심벌은 충돌 염려없이 객체 프로퍼티로 사용 가능한, 특별한 '유일 값'이다.심볼을 똑같이 선언해서 각각 변수에 담아도 둘은 서로 같지 않다.심볼의 타입은 symbol 이다.심볼을 객체의 key 로 사용할 수
내장 네이티브 생성자는 각자의 .prototype을 가진다.prototype 객체에는 해당 객체의 하위 타입별로 고유한 로직이 담겨 있다.각 생성자 프로토타입마다 자신의 타입에 적합한 기능이 구현되어 있다.평범하지 않은 프로토타입도 있다.네이티브 프로토타입을 변경할 수
어떤 값을 다른 타입으로 바꾸는 과정이 명시적이면 '타입 캐스팅', 암시적이면 '강제변환'이라고 하는데, '명시적 강제변환'은 코드만 봐도 의도적으로 타입변환을 일으킨다는 사실이 명백한 반면, '암시적 강제변환'은 다른 작업 도중 불분명한 부수 효과로부터 발생하는 타