프로그래밍 언어를 배우는 것은 두 가지 측면 만 있습니다. 하나는 구문이고 다른 하나는 데이터 유형입니다. C- 유사 언어의 구문은 기능, 산술 작업 등과 객체 지향 언어가 객체에 추가되는 경우에 지나지 않습니다.
구문은 언어 디자이너가 미리 만든 일련의 규칙 일뿐입니다. 다른 언어의 문법은 다르지만 모두 공통점이 있습니다. 하나 또는 두 개의 프로그래밍 언어에 익숙한 사람들에게는 문법이 다른 프로그래밍 언어를 배울 때 종종 문제가되지 않습니다 (물론 C와 같은 언어를 학습 한 경우 처음으로 LISP에 참여하는 데 시간이 걸릴 것입니다). 학습의 초점은 종종 데이터 유형 및 관련 작업에 이루어지며 "데이터 구조 + 알고리즘 = 프로그램"이라는 오래된 말이 없습니다! 둘째, 일부 언어 자체의 구문에는 디자인 문제가 있으므로 (JavaScript는 더욱 그렇습니다) 이러한 점을 파헤칠 필요는 없습니다. 물론, 당신이 괴짜라고 주장한다면, 당신은 그것을 가지고 놀 수 있습니다.
이 기사는 JavaScript의 데이터 유형에 대한 자세한 소개를 제공합니다.
약한 유형 대 강한 유형
JavaScript의 디자인 철학을 고려할 때 JavaScript는 약한 언어로 설계되었습니다.
이것에 대해 말하면, 약한 유형과 강한 유형의 차이에 대해 이야기하는 것은 불가피합니다.
어떤 사람들은 실수로 두 가지의 차이점은 "강하게 입력 된 언어는 변수를 선언 할 때 유형을 표시해야하지만 약하게 입력 한 사람은 사용하지 않습니다"라고 생각합니다. 사실,이 견해는 잘못되었습니다. 예를 들어 다음 Java 코드 스 니펫 :
코드 사본은 다음과 같습니다.
문자열 s = "hello";
int l = s.getBytes (). 길이;
컴파일러는 .length가 법적 표현이라는 것을 어떻게 알 수 있습니까? 컴파일러는 S의 데이터 유형이 문자열이라는 것을 알고 있기 때문입니다. 문자열의 getBytes 메소드가 호출되면 반환 값의 데이터 유형은 바이트 []이므로 .Length는 법적 표현입니다.
둘 사이의 실제 차이점은 다음과 같습니다.
강하게 입력 된 언어에서, 각 표현식의 유형은 컴파일 시간에 결정될 수 있으며 해당 유형에 적용되는 작업 만 허용됩니다.
약한 유형 언어를 사용하면 모든 유형에 따라 모든 작업이 부과 될 수 있지만이 작업은 런타임에 오류를보고 할 수 있습니다.
데이터 유형
ECMAScript 5.1의 사양에 따르면, JavaScript에는 6 가지 데이터 유형, 즉 정의되지 않은, null, 부울, 번호, 문자열 및 객체가 있습니다. 처음 5 개는 기본 유형에 속하며 마지막은 객체 유형에 속합니다.
기본 데이터 유형
정의되지 않은 유형은 정의되지 않은 값이 하나 뿐이며, 이는 "null 값"을 의미하며 모든 데이터 유형에 적용됩니다.
NULL 유형의 값은 하나뿐이므로 NULL이므로 "객체 없음"을 의미하며 객체 유형에만 적용됩니다.
부울 유형은 참과 거짓의 두 가지 값을 가지고 있습니다
유형 숫자 값은 Java의 두 배와 유사한 IEEE 754 표준을 따르는 64 비트 부동 소수점 번호 세트입니다. 정수 데이터 구조가 없습니다. 또한 NAN, Infinity, -infinity의 세 가지 특별한 값이 있습니다.
유형 문자열의 값은 유한 유니 코드 문자 모음입니다. '또는'로 둘러싸여 있어야합니다.
널과 정의되지 않은
NULL과 UNDEFIND는 모두 "비 부가가치"라는 개념을 나타냅니다.
-Null은 비어 있습니다
- 정의되지 않은 것은 그것이 존재하지 않음을 의미합니다. 이 값은 초기화가없는 모든 변수, 함수의 매개 변수 누락 및 명시 적 반환 값이 없습니다.
다른 언어에서는 널 값을 나타내는 데 하나만 사용됩니다. JavaScript에 정의되지 않은 이유는 무엇입니까? 이것은 역사적 이유로 인해 발생합니다.
JavaScript는 Java 구문을 채택하고 유형을 기본 유형 및 객체 유형으로 나눕니다. Java에서는 Null이 빈 개체를 나타내는 데 사용되며 JavaScript는 당연한 것으로 예상됩니다. C 언어에서 NULL은 숫자로 변환 될 때 0이며 JavaScript도 동일한 방법을 채택합니다.
코드 사본은 다음과 같습니다.
> 번호 (null)
0
> 5 + 널
5
JavaScript 1.0에서는 아직 예외 처리가 없습니다. 일부 예외 (초기 변수 없음, 함수를 호출 할 때 매개 변수가 없음)의 경우 특수 값으로 표시해야합니다. Null은 좋은 선택이지만 Brendan Eich는 다음 두 가지를 피하고 싶어합니다.
-이 특수 값은 객체 별이기 때문에 참조 속성이 없어야합니다.
-이 특별 값은 프로그램의 오류를 감지하기가 쉽지 않기 때문에 0으로 변환해서는 안됩니다.
이 두 가지 이유로 Brendan Eich는 정의되지 않은 것을 선택했으며, 이는 Nan에게 강요 될 수 있습니다.
코드 사본은 다음과 같습니다.
> 번호 (정의되지 않은)
난
> 5 + 정의되지 않았습니다
난
JSON 객체를 다룰 때 결과는 매우 다릅니다.
코드 사본은 다음과 같습니다.
> json.parse (null)
널
> json.parse (정의되지 않은)
// firfox syntaxerror : json.parse : JSON 데이터의 1 열 1 열에서 예상치 못한 문자
// chrome syntaxerror : 예기치 않은 토큰 u
> json.stringify (null)
"널"
> json.stringify (정의되지 않은)
한정되지 않은
객체 유형
스크립팅 언어로서 JavaScript 자체는 매우 간소화 된 기능을 가지고 있으며 호스트 환경에서 많은 기능 (파일 읽기 및 쓰기, 네트워킹 등)이 제공됩니다. 호스트 환경과 JavaScript 언어 사이의 다리는 객체입니다. 호스트 환경은 JavaScript 구문을 준수하는 일련의 객체를 제공함으로써 다양한 기능을 제공합니다.
JavaScript 객체 지향 프로그래밍 (프로토 타입이 무엇인지 모르는 경우이 기사를 읽는 것이 좋습니다) 의이 기사에서, 나는 객체가 Java의 Hashmap과 마찬가지로 JavaScript의 일련의 키-값 쌍임을 반복적으로 강조했습니다. 그러나 JavaScript의 객체의 속성에는 해시 맵에서 사용할 수없는 일부 설명 자 (속성 설명자)가있을 수 있습니다.
속성 설명자
속성 설명자는 두 가지 범주로 나뉩니다.
데이터 디스크립터 (Data Descriptor)는 일련의 부울 값을 포함하여 속성이 수정 및 삭제를 허용하는지 여부를 나타냅니다.
GET 및 SET 기능을 포함한 액세서 디스크립터.
두 설명자는 모두 물체이며, 둘 다 다음 두 부울 속성을 가지고 있습니다.
구성 가능은 디스크립터가 수정 및 삭제를 허용하는지 여부를 지정하는 데 사용됩니다. 기본값은 False입니다.
열거 가능한 것은 객체를 가로 질러 속성에 액세스할지 여부를 지정하는 데 사용됩니다 (for ... in loop 또는 object.keys 메소드 사용). 기본값은 False입니다.
위의 두 가지 공통 속성 외에도 데이터 디스크립터에는 다음 두 가지 속성이 있습니다.
- 값은이 속성의 값을 지정하는 데 사용되며 기본값은 정의되지 않았습니다.
-Sritable은 속성 값이 속성 값의 변경을 허용하는지 여부를 지정하는 데 사용됩니다. 기본값은 False입니다
액세스 설명자에는 두 가지 속성이 있습니다.
-Get은 속성에 액세스 할 때 액세서 (Getter, 본질적으로 함수)를 지정하는 데 사용되며 액세서의 반품 값은 속성의 값입니다. 기본값은 정의되지 않았습니다
- 세트는이 속성에 액세스 할 때 평가자 (세터, 본질적으로 함수)를 지정하는 데 사용됩니다. 평가자는 매개 변수를 수락합니다. 기본값은 정의되지 않았습니다
Object.DefineProperty를 사용하여 객체의 속성 설명자를 설정할 수 있습니다. 예를 들어:
코드 사본은 다음과 같습니다.
// __proto__ 사용
object.defineProperty (obj, 'key', {
__proto__ : null, // 상속 된 속성 없음
값 : '정적'// 열거 할 수 없습니다
// 구성 가능하지 않습니다
// 쓰기는 안됩니다
// 기본값으로
});
위의 예에서, 우리는 디스크립터가 상속의 특성을 가지고 있음을 알 수 있습니다. 디스크립터 객체의 __proto__를 NULL로 명시 적으로 설정하여 Object.Prototype에서 해당 속성을 상속하지 않습니다. 물론 설명자의 모든 속성을 명시 적으로 설정할 수도 있습니다.
코드 사본은 다음과 같습니다.
// 명시 적입니다
object.defineProperty (obj, 'key', {
열거 가능 : 거짓,
구성 가능 : False,
쓰기 가능 : 거짓,
가치 : '정적'
});
이 효과는 첫 번째 코드와 동일합니다.
다음은 Access Descriptor의 또 다른 예입니다.
코드 사본은 다음과 같습니다.
// 액세서 속성 디스크립터가있는 DefineProperty와 함께 추가 된 객체 속성의 예
var bvalue = 38;
object.defineProperty (obj, 'key', {
get : function () {return bvalue; },
세트 : 함수 (newValue) {bvalue = newValue; },
열거 가능 : 사실,
구성 가능 : true
});
액세스 설명자 및 데이터 설명자는 혼동할 수 없다는 점에 유의해야합니다. 다음을 작성하는 것은 잘못입니다.
코드 사본은 다음과 같습니다.
// 둘 다 혼합하려고 시도 할 수 없습니다.
object.defineProperty (obj, 'confrict', {
값 : 0x9F91102,
get : function () {return 0xdeadbeef; }
});
// typeError를 던지기 : 속성 설명자는 값을 지정해서는 안됩니다.
// getter 또는 setter가 지정 될 때 쓰기 가능
타입
런타임에 변수 유형을 알고 싶다면 연산자 유형을 사용할 수 있습니다. Typeof의 반환 값은 다음과 같습니다.
주목해야 할 것은 null == "객체"유형입니다. ECMAScript 5.1 표준에 따르면 NULL 유형은 기본 유형이어야합니다. 왜 물체가 여기에서 반환됩니까? 그 이유는 다음과 같습니다.
JavaScript 1.0에서 JavaScript의 값은 유형 태그 및 실제 값과 같은 구조로 표시됩니다. 객체의 유형 플래그는 0이고 NULL은 C 언어의 NULL 포인터 (0x00)를 나타내므로 NULL의 유형 플래그는 0입니다.
위는이 기사의 전체 내용입니다. 필요한 경우 참조하십시오.