소개
우리 모두는 JavaScript 데이터 유형이 기본 유형(또는 기본 유형)과 참조 유형의 두 가지 범주로 구분된다는 것을 알고 있습니다.
기본 유형 값은 스택 메모리에 저장된 단순 데이터 세그먼트이며 값으로 액세스됩니다. JS에는 정의되지 않음, Null, 부울, 숫자 및 문자열의 다섯 가지 기본 유형이 있습니다.
참조 유형의 값은 힙 메모리에 저장된 객체이며, 해당 값은 참조로 액세스됩니다. 참조 유형에는 주로 Object, Array, Function, RegExp 및 Date가 포함됩니다.
객체에는 속성과 메서드가 있으므로 다음 코드가 보이는 것은 전혀 놀라운 일이 아닙니다.
var favs=['鸡蛋','莲蓬']; favs.push('秋葵'); console.log(favs);//["鸡蛋", "莲蓬", "秋葵"] console.log(favs.length);//3
배열은 참조형이므로 자연스럽게 속성(길이)과 방식(푸시)을 가질 수 있습니다. 이는 여름에 아이스크림을 먹는 것처럼 자연스러운 일입니다. 그런데 아래 코드를 보시고 잘 생각해보세요. 이것과 이것이 합법인가요?
var realMessage="Said I love you but I lied"; var myMessage=realMessage.substring(5,15); console.log(myMessage); //"I love you"
헤어지던 끈에 '하위문자열'법을 일부러 실행한 뒤, 편집본을 보다가 행복하게 잠들던 상심한 소녀가 있었습니다. 그런데, 문자열은 기본형이라고 하지 않나요? 왜 메소드를 가질 수 있나요? ? 왕실의 방법이 있습니까, Qingtian 경?
사실 이게 다 '기본 포장 유형'이라는 것 때문이에요. 이 기본 포장 유형은 특히 똑바로 서서 "끝내고 떠나고 공덕을 숨기고"진짜입니다!
기본 포장 유형
처음에 언급한 객체, 배열 및 기타 참조 유형 외에도 JavaScript는 문자열, 숫자 및 부울이라는 세 가지 특수 참조 유형을 제공하여 해당 기본 유형을 쉽게 작동할 수 있습니다.
위의 문자열 클리핑 예시를 계속 살펴보면, 하위 문자열 메서드를 사용해도 realMessage 자체의 값은 변경되지 않고 새 문자열만 반환된다는 점을 눈치채셨나요?
기본 포장형이 하는 일입니다. 원래는 메소드가 없지만, 메소드를 사용하고 싶을 때 해당 기본 포장 유형에 이 메소드가 있습니다. 예를 들어, 위의 substring 메소드는 기본형 string에는 이 메소드가 불가능하지만, 패키징 유형 String에서는 이 메소드를 실행하고 결과를 반환하게 됩니다. 실행 시:
realMessage.substring(5,15)
이 코드 줄에서 많은 일이 일어나고 있습니다.
먼저 메모리에서 realMessage의 값을 읽습니다. 이 읽기 모드에서는 배경이 작동하기 시작합니다. JS 엘리베이션은 백그라운드에서 완료된 이러한 작업을 다음과 같이 설명합니다.
1. 문자열 유형의 인스턴스를 생성합니다.
2. 인스턴스에서 지정된 메서드를 호출합니다.
3. 이 인스턴스를 삭제하세요
위의 예는 다음과 같은 코드로 설명할 수 있습니다.
var _realMessage=new String("Said I love you but I lied"); var myMessage=_realMessage.substring(5,15); _realMessgae=null; //方法调用后即销毁
그래서 우리는 자체 메소드를 실행하는 기본 유형 문자열이 아니라 백그라운드에서 그에 상응하는 기본 패키징 유형 문자열을 생성하여 기본 유형의 값을 기반으로 인스턴스를 인스턴스화한다는 것을 이해합니다. 인스턴스는 지정된 메소드를 호출하고 마침내 자신을 파괴합니다. 이는 놀라운 일입니다.
마지막 단계에서 기본 패키징 유형의 "파괴 가능" 기능에 주목하세요. 이는 기본 유형 값에 사용자 정의 속성 및 메소드를 추가할 수 없음을 결정합니다.
var me="sunjing"; me.age=18; console.log(me.age);//undefined
'me'라는 문자열에 age 속성을 추가하고 값을 멋진 18세로 설정했는데, 다시 방문해보니 이 속성의 흔적이 없었습니다. 그 이유는 다음과 같습니다.
코드 두 번째 줄의 속성 할당이 실행되면 백그라운드에서 기본 패키징 유형의 인스턴스가 생성되지만 실제로는 해당 인스턴스에 age 속성이 첨부되지만 인스턴스는 소멸됩니다. 세 번째 실행 라인이 실행되면 당연히 age 속성이 없는 기본 패키징 유형의 새 인스턴스가 다시 생성됩니다.
기본 포장 형태를 이용한 디스플레이
문자열이 읽기 모드일 때 외에도 배경은 기본 패키징 유형 인스턴스를 생성하는 데 도움이 되며 명시적으로 직접 생성할 수도 있습니다.
var str=new String("hello"); var str2=str.toUpperCase(); console.log(str2);//"HELLO:
배경이 생성에 도움이 될 때 변수에 저장되는 것과는 다릅니다.
var str1=new String("hello"); var str2="hello"; typeof str1 //"object" typeof str2 //"string"
요약
기본 패키징 유형 덕분에 문자열, 불리언, 숫자의 세 가지 기본 유형을 조작하는 것이 더 편리합니다. 이 세 가지 기본 유형의 값을 읽을 때마다 해당 패키징 유형 인스턴스가 백그라운드에서 생성됩니다. 이 인스턴스는 지정된 메서드를 호출하고 호출 후 소멸됩니다. 이러한 짧은 수명 주기로 인해 기본 유형에 사용자 정의 속성과 메서드를 추가할 수 없습니다.
자바스크립트의 String 클래스의 subString() 메소드와 Slice() 메소드를 살펴보겠습니다
최근 "Javascript를 이용한 고급 프로그래밍"이라는 책을 읽다가 이전에 접하지 못했던 실용적인 기술과 지식 포인트를 발견하여 기억력을 깊게 하기 위해 블로그에 기록하고 싶었습니다.
책의 2.8.4절에서 String 클래스의 subString() 메서드와 Slice() 메서드에 대해 설명했습니다. 다음 예와 같이 사용법과 반환 결과는 기본적으로 동일합니다.
var strObj = new String("hello world"); alert(strObj.slice(3)); // 输出结果:"ol world" alert(strObj.subString(3)); // 输出结果:"ol world" alert(strObj.slice(3, 7)); // 输出结果:"lo w" alert(strObj.subString(3,7)); // 输出结果:"lo w"
由以上代码的输出结果可已看出,slice()方法和subString()方调用方法法和输出结果完全一样,这两种方法返回的都是要处理的字符串的子串,都接受一个或两个参数,第一个参数是要获取的子串的起始位置,第二个参数是要获取子串的终止位置,如果第二个参数省略终止位置就默认为字符串的长度,且两个方法都不改变String对象自身的值。
为什么有两个功能完全相同的方法呢?事实上,这两个方法并不完全相同,不过只在参数为负值时,他们处理参数的方式稍有不同。
对于负数参数,slice()方法会用字符串的长度加上参数,subString()方法将其作为0处理,例如:
var strObj = new String("hello world"); alert(strObj.slice(-3)); // 输出结果:"rld" alert(strObj.subString(-3)); // 输出结果:"hello world" alert(strObj.slice(3,-4)); // 输出结果:"lo w" alert(strObj.subString(3,-4)) // 输出结果:"hel"
这样既可看到slice()和subString()方法的主要不同。当只有参数-3时,slice()返回"rld",subString()则返回"hello world"。这是因为对于字符串"hello world",slice(-3)将被转换成slice(8),而subString(-3)则转化成subString(0)。同样,使用3和-4差别也是很明显。slice()方法将被转换成slice(3,7),与前面的例子相同,返回"lo w"。而subString()方法则将这个两个参数解释为subString(0,3),实际上是:subString(0,3),因为subString()总是把较小的参数作为起始位,较大的数字最为终止位。