자바 스크립트 문자열 유형과 문자열 객체의 차이점은 무엇입니까?
나는 ECMA-262 표준 ( ECMAScript Language Specification, 3rd edition, 이것이 중요한 경우-String Type / String Object에서 3 판과 5 판 사이의 차이점을 찾지 못했습니다)을 엉망으로 만들었 습니다.
저를 당황하게하는 한 가지가 있습니다. String Type과 String Object의 차이점입니다. 예, 문자열 유형 이 16 비트 UTF-16 단위의 시퀀스이고 문자열 개체 가 내부 클래스 속성이 "문자열"로 설정되고 내부 값 속성이 다음으로 설정된 내장 개체 라는 점에서 차이점을 알고 있습니다. String Type 의 값 .
그러나 사양을 읽으면 문자열 유형이 어떤 메서드도 노출하지 않는 것 같습니다. 즉, 추가 속성이없는 값일뿐입니다. 이 코드를 사용하면 모든 것이 예상대로 정확히됩니다.
document.writeln(typeof "foo"); // 'string'
document.writeln(typeof new String("foo")); // 'object'
첫 번째 유형은 실제 문자열 유형 이고 두 번째 유형 은 객체 유형입니다 ( String 클래스의 객체 이지만 데이터 유형은 객체입니다). 그러나 이것을 보면 :
"foo".charAt(0);
fooStrObj = new String("Foo");
fooStrObj.charAt(0);
둘 다 동일한 기능을 노출하는 것처럼 보이지만 ECMA-262 표준에 정의 된 문자열 유형 에는 기능이 없습니다 . 노출하는 모든 함수는 String.prototype 개체에서 가져온 것입니다 (그리고 String Type 이 ECMA-262 표준에서 String.prototype 개체의 모든 속성과 함수를 마술처럼 노출 한다는 사실에 대한 참조는 볼 수 없습니다 ). 그래서 형의 값하는 문자열 유형은 자동으로 승진 문자열 개체 원본과 문자열 타입 내부와 같은 값 값 특성?
그리고 그것들이 정확히 똑같이 취급된다면 (모든 의도와 목적을 위해 보이는 것처럼), 왜 String 을 표현하는 두 가지 다른 방법이 있습니까?
문자열은 JS에서 값 유형이므로 속성이 첨부되거나 프로토 타입이없는 등의 속성을 가질 수 없습니다. 속성에 액세스하려는 모든 시도는 기술적으로 JS [[ToObject]] 변환 (본질적으로 새로운 문자열)을 수행합니다. .
차이점을 쉽게 구분하는 방법은 (브라우저에서)
a = "foo"
a.b = "bar"
alert("a.b = " + a.b); //Undefined
A = new String("foo");
A.b = "bar";
alert("A.b = " + A.b); // bar
또한
"foo" == new String("foo")
true이면 == 연산자의 암시 적 형식 변환으로 인해 true입니다.
"foo" === new String("foo")
실패합니다.
Java 와의 차이 int
와 유사합니다 Integer
.
표준에 따르면 String
메서드를 호출하려고하면 문자열이 자동으로 개체 로 변환됩니다 . ECMA 262-3 섹션 11.2.1 참조 ; 5 단계 호출 ToObject
(섹션 9.9에 정의 됨).
11.2.1 속성 접근 자
[...]
Production MemberExpression : MemberExpression [Expression]은 다음과 같이 평가됩니다.
- MemberExpression을 평가합니다.
- GetValue (Result (1))를 호출합니다.
- 표현을 평가합니다.
- GetValue (Result (3))를 호출합니다.
- ToObject (Result (2))를 호출합니다.
- ToString (Result (4))를 호출합니다.
- 기본 개체가 Result (5)이고 속성 이름이 Result (6) 인 Reference 유형의 값을 반환합니다.
9.9 ToObject
연산자 ToObject는 다음 표에 따라 인수를 Object 유형의 값으로 변환합니다.
[...]
[[value]] 속성이 문자열 값으로 설정된 새 String 개체를 만듭니다. String 객체에 대한 설명은 15.5를 참조하십시오.
사양 기술로서, 이것은 문자열이 실제로 객체는 아니지만 메서드가있는 것처럼 보일 수있는 방법을 설명하는 해킹입니다.
Apart from that, the wrapper objects are not very useful. I don't know why they're in the language. I rather wish they weren't. :)
'programing tip' 카테고리의 다른 글
ASP .NET MVC의 web.config에서 TargetFramework 설정은 무엇을 의미합니까? (0) | 2020.11.22 |
---|---|
C # 값 / 객체는 언제 복사되고 언제 참조가 복사됩니까? (0) | 2020.11.22 |
지도가없는 Google 장소 라이브러리 (0) | 2020.11.21 |
Pylint의 Cell-var-from-loop 경고 (0) | 2020.11.21 |
iFrame의 크기를 자동으로 조정하는 방법은 무엇입니까? (0) | 2020.11.21 |