저는 최근에 Rhino 책을 읽지 않았습니다. 그 책의 번역이 끔찍하고 발음하기 어려웠습니다. 특히 프로토타입 부분이 지저분했습니다. 나중에 동료에게 소개받은 후 js 고급 프로그래밍에 관한 책을 구입했습니다. 그런 다음 계속해서 열심히 읽었습니다. 더 이상 불평하지 말고 js의 새로운 패키징 유형에 대해 계속 이야기하겠습니다.
1: 문자열
문자열 유형에 관해 말하자면, 우리는 일반적으로 아래와 같이 문자열 유형을 정의합니다.
그런데 js에는 아주 특별한 점이 하나 있습니다. 즉, 문자열 유형이 참조 유형이 아닌 기본 유형이라는 것입니다. 즉, 문자열의 값이 "스택"에 저장되지만 이는 문자열 유형이 아닙니다. C# 등 많은 언어의 경우 js가 참조 유형으로 사용되지 않는 것은 이해할 수 있다고 생각합니다. 결국 멀티스레딩을 사용할 수 없으며 C#의 스레드 스택 공간은 문자열이 1M만 할당됩니다. C#에서는 값 유형을 사용하면 스택 폭발 가능성이 있고, js에는 스택 공간 제한이 없으므로 스택 폭발이 없습니다.
그런 다음 다음 질문이 나옵니다. 우리는 종종 하위 문자열과 같은 문자열에 대해 일련의 작업을 수행합니다. 아래와 같이:
방금 말했듯이 string의 값은 스택에 직접 저장되는데 어떻게 하위 문자열을 가질 수 있나요? 공식 홈페이지 설명에 따르면 다음과 같다. 이때 s를 참조형으로 감싸기 위해 String형을 사용하게 된다. 그런 다음 String 유형의 내부 구현을 사용하십시오. 하위 문자열 메소드가 String 내부적으로 정의되어 있으므로 실제로 위 코드는 js 내부에서 이와 같이 구현되어야 합니다.
var s=new String("hello") var r=s.substring(3) s="hello"
보시다시피 패키징 유형은 코드가 실행되는 순간 실제로 s를 String 참조 유형으로 래핑한 다음 String 참조 유형 아래에서 하위 문자열 메소드를 호출한 다음 "hello" 값을 s에 다시 할당합니다. 마지막으로 효과는 s="hello", r="lo"입니다. 주의 깊게 관찰하면 색상과 같은 속성을 s에 동적으로 첨부하면 색상이 다시 읽히지 않는다는 것을 알 수 있습니다. 아래 그림과 같은 색상 값을 읽어보세요.
위에서 언급한 원리를 이해했다면 console.log(s.color)가 정의되지 않음과 동일하다는 것은 놀라운 일이 아닙니다. s.color="red"를 사용하면 js 엔진이 속성을 호출할 수 있는 방법이 있음을 발견하면 이를 즉시 백그라운드에서 String 유형으로 동적으로 래핑한 다음 String 아래에 새로운 속성 color=red를 추가하고 내부적으로 s 값을 "hello"로 재설정합니다( s "hello"), s.color를 출력하기 위해 console.log를 실행하면 js 엔진은 속성을 호출하는 다른 방법이 있는지 확인하고 당연히 이 새로운 String 유형에서 new String("hello")을 다시 수행합니다. 색상 속성이 없으므로 정의되지 않음이 반환됩니다.
방금 말했듯이 이런 패키징 작업은 백그라운드에서 js에 의해 동적으로 추가 및 삭제되어 기본 유형을 참조 유형으로 변환합니다. 그러면 둘의 차이점은 무엇입니까?
f35d6e602fd7d0f0edfa6f7d103c1b57: 말할 필요도 없이 스택이자 힙입니다. C#을 잘 안다면 박스 및 언박스 작업이라고 생각하면 됩니다.
2cc198a1d5eb0d3eb508d858c9f5cbdb: 모든 참조 유형은 객체에서 상속된다는 것을 알고 있습니다. 객체 지향과 혼동하지 마세요. 예를 들어, js에서는 모든 유형이 객체 하위 클래스입니다. 🎜>
내부는 그렇지 않습니다. 인스턴스화를 사용하여 살펴볼 수 있습니다.
2: 부울
String 래퍼 클래스를 이해했다면 실제로 Boolean 래퍼 클래스도 이와 동일한 원리를 가지고 있지만 Boolean 유형을 사용할 때 참조 유형이 null이거나 정의되지 않은 경우라는 점을 알고 있습니다. 그렇지 않으면 항상 true가 되며 이 부울 유형은 아래와 같이 정확히 이 상자 작업을 수행합니다.이제 b는 더 이상 단순한 기본 유형이 아니라 참조 유형인 것을 알 수 있습니다. 이때 "and or"는 더 이상 내가 원하는 결과를 생성할 수 없습니다. Number 래퍼 클래스도 있으므로 이에 대한 주의 사항은 없으므로 다루지 않겠습니다.