ECMAScript 참조 유형
- 이전 페이지 ECMAScript 타입 변환
- 다음 페이지 일원 연산자
참조 타입은 일반적으로 '클래스'라고 불리며.
이 튜토리얼은 많은 ECMAScript предопределенные 참조 타입에 대해 논의할 것입니다.
참조 타입
참조 타입은 일반적으로 '클래스'라고 불리며, 즉 참조 값이 처리되는 것은 객체입니다.
이 튜토리얼은 많은 ECMAScript предопределенные 참조 타입에 대해 논의할 것입니다.
이제는 이미 논의한 원시 타입과 밀접하게 관련된 참조 타입에 대해 중점적으로 논의할 것입니다.
주의:전통적인 의미에서 ECMAScript는 정적이지 않습니다. 사실, ECMA-262에서는 '클래스'라는 단어가 전혀 등장하지 않습니다. ECMAScript는 '객체 정의'를 정의하였으며, 이는 다른 프로그래밍 언어의 클래스와 논리적으로 동일합니다.
ヒント:이 튜토리얼은 "객체"라는 용어를 사용할 것입니다.
객체는 new 연산자와 객체를 인스턴스화할 이름을 사용하여 생성됩니다. 예를 들어, 다음 코드는 Object 객체의 인스턴스를 생성합니다:
var o = new Object();
이 문법은 Java 언어와 유사하지만, 여러 개의 매개변수가 있을 때 ECMAScript는 괄호 사용을 요구합니다. 매개변수가 없는 경우, 다음과 같은 코드와 같이 괄호를 생략할 수 있습니다:
var o = new Object;
주의:구현은 필수적이지 않지만, 혼란을 피하기 위해 권장됩니다.
ヒント:우리는 이 장에서 객체와 그 행동에 대해 더 깊이 탐구할 것입니다.
이 장의 주제는 동일한 원시 유형을 가진 참조 유형입니다.
Object 객체
Object 객체는 크게 중요하지 않지만, 다른 클래스를 이해하기 전에 이를 이해하는 것이 좋습니다. ECMAScript의 Object 객체는 Java의 java.lang.Object와 유사하며, ECMAScript의 모든 객체는 이 객체를 상속받습니다. 따라서 Object 객체의 모든 속성과 메서드는 다른 객체에도 나타납니다. 따라서 Object 객체를 이해하면 다른 객체를 더 잘 이해할 수 있습니다.
Object 객체는 다음과 같은 속성을 가지고 있습니다:
- constructor
- 객체를 생성하는 함수에 대한 참조(포인터)입니다. Object 객체에서는 이 포인터가 원시의 Object() 함수를 가리킵니다.
- Prototype
- 이 객체의 객체 프로토타입에 대한 참조입니다. 모든 객체에서는 기본적으로 Object 객체의 인스턴스를 반환합니다.
Object 객체는 몇 가지 메서드를 추가로 가지고 있습니다:
- hasOwnProperty(property)
- 객체가 특정 속성을 가지고 있는지�断합니다. 이 속성은 문자열로 지정해야 합니다。(예를 들어,o.hasOwnProperty("name"))
- IsPrototypeOf(object)
- 이 객체가 다른 객체의 프로토타입인지�断합니다.
- PropertyIsEnumerable
- 주어진 속성이 for...in 문을 통해 열거할 수 있는지�断합니다.
- ToString()
- 객체의 원시 문자열 표현을 반환합니다. Object 객체에서는 ECMA-262가 이 값을 정의하지 않았기 때문에 다른 ECMAScript 구현에서는 다른 값이 있습니다.
- ValueOf()
- 좋은 객체에 적합한 원시 값을 반환합니다. 많은 객체에서 이 메서드가 반환하는 값은 ToString()의 반환 값과 동일합니다.
주석:위에 나열된 각 속성과 메서드는 다른 객체에 의해 대체됩니다.
Boolean 객체
Boolean 객체는 Boolean 원시 타입의 레퍼런스 타입입니다.
Boolean 객체를 생성하려면 Boolean 값을 파라미터로 전달하면 됩니다:
var oBooleanObject = new Boolean(true);
Boolean 객체는 Object 객체의 ValueOf() 메서드를 대체하여 원시 값을 반환하며, 즉 true와 false입니다. ToString() 메서드도 대체되어 문자열 "true" 또는 "false"를 반환합니다.
遗憾的是, ECMAScript에서 Boolean 객체는 거의 사용되지 않으며, 사용되더라도 이해하기 어렵습니다.
문제는 일반적으로 Boolean 표현식에서 Boolean 객체를 사용할 때 발생합니다. 예를 들어:
var oFalseObject = new Boolean(false); var bResult = oFalseObject && true; //출력 true
이 코드에서는 false 값으로 Boolean 객체를 생성합니다. 그런 다음 이 값과 원시 값 true를 AND 연산으로 사용합니다. Boolean 연산에서 false와 true가 AND 연산을 수행하는 결과는 false입니다. 그러나 이 줄 코드에서 계산하는 것은 oFalseObject의 값이 아니라 oFalseObject입니다.
이전에 논의했듯이, Boolean 표현식에서 모든 객체는 자동으로 true로 변환됩니다. 따라서 oFalseObject의 값은 true입니다. 그런 다음 true가 true와 AND 연산을 수행하여 결과는 true입니다.
주의:Boolean 객체의 사용 가능성을 알고 계셔도 좋지만, 이 장에서 언급한 문제를 피하기 위해 Boolean 원시 값을 사용하는 것이 좋습니다.
참조
Boolean 객체에 대한 더 많은 정보는 다음 사이트에서 확인하십시오: JavaScript Boolean 객체 참조 가이드。
Number 객체
예상했듯이, Number 객체는 Number 원시 타입의 레퍼런스 타입입니다. Number 객체를 생성하려면 다음과 같은 코드를 사용합니다:
var oNumberObject = new Number(68);
이 장의 앞 부분에서 특수 값(예: Number.MAX_VALUE)에 대해 논의한 Number 객체를 이미 알아챈 것 같습니다. 모든 특수 값은 Number 객체의 스태틱 속성입니다.
숫자 객체의 원시 값을 얻으려면 valueOf() 메서드를 사용하면 됩니다:
var iNumber = oNumberObject.valueOf();
물론, Number 클래스도 toString() 메서드를 가지고 있으며, 유형 변환에 대한 절에 대해 자세히 논의했습니다.
Object 객체에서 상속된 표준 메서드 외에도, Number 객체는 숫자를 처리하는 몇 가지 전용 메서드를 가집니다.
toFixed() 메서드
toFixed() 메서드는 지정된 자릿수의 소수점을 가진 숫자의 문자열 표현을 반환합니다. 예를 들어:
var oNumberObject = new Number(68); alert(oNumberObject.toFixed(2)); // "68.00" 가 출력됨
여기서, toFixed() 메서드의 매개변수는 2입니다. 이는 두 자릿소수를 표시해야 한다는 의미입니다. 이 메서드는 0으로 채워진 공백 문자열을 반환합니다. 화폐 처리 애플리케이션에서 매우 유용한 이 메서드는 0에서 20 자릿소수까지의 숫자를 표현할 수 있습니다. 이 범위를 초과하는 값은 오류를 일으킵니다.
toExponential() 메서드
숫자 포맷화와 관련된 또 다른 메서드는 toExponential()입니다. 이 메서드는 과학적 표기법으로 표현된 숫자의 문자열 형식을 반환합니다.
toFixed() 메서드와 유사하게, toExponential() 메서드도 출력할 소수점의 자릿수를 지정하는 매개변수를 가집니다. 예를 들어:
var oNumberObject = new Number(68); alert(oNumberObject.toExponential(1)); // "6.8e+1" 가 출력됨
이 코드의 결과는 "6.8e+1"입니다. 이전에 설명한 것처럼, 이는 6.8x10을 의미합니다.1문제는 숫자를 예정된 형식이나 지수 형식으로 어떤 형식을 사용할지 모를 때 무엇이 되는지 모릅니다? toPrecision() 메서드를 사용할 수 있습니다.
toPrecision() 메서드
toPrecision() 메서드는 가장 의미 있는 형식에 따라 숫자의 예정된 형식이나 지수 형식을 반환합니다. 그것은 숫자를 표현하는 데 사용되는 숫자의 총 수(지수를 제외한)를 가진 매개변수를 가집니다. 예를 들어,
var oNumberObject = new Number(68); alert(oNumberObject.toPrecision(1)); // "7e+1" 가 출력됨
이 코드의 임무는 숫자 68를 한 자릿수로 표현하는 것입니다. 결과는 "7e+1"이며, 다른 형식으로는 70입니다.的确, toPrecision() 메서드는 숫자를 둘러싸고 있습니다. 하지만, 68를 2 자릿수로 표현하면 훨씬 쉬워집니다:
var oNumberObject = new Number(68); alert(oNumberObject.toPrecision(2)); // "68" 가 출력됨
물론, "68" 가 나오는 이유는 그것이 정확한 표현이기 때문입니다. 하지만, 필요한 자릿수보다 많이 지정된 자릿수가 되었을 때는 어떻게 될까요?
var oNumberObject = new Number(68); alert(oNumberObject.toPrecision(3)); //출력 "68.0"
이 경우, toPrecision(3)는 toFixed(1)와 동일하며, "68.0"을 출력합니다。
toFixed(), toExponential(), and toPrecision() 메서드는 정확한 소수점 자리수로 수를 표현하기 위해 둔화 작업을 수행합니다.
ヒント:Boolean 객체와 유사하게, Number 객체도 중요하지만, 가능한 한 이러한 객체를 적게 사용하십시오. 문제를 피하기 위해 가능한 한 원시 표현법을 사용하십시오.
참조
Number 객체에 대한 더 많은 정보를 원하면 다음을 방문하세요: JavaScript Number 객체 참조 가이드。
String 객체
String 객체는 String 원시 타입의 객체 표현법입니다. 이는 다음과 같은 방식으로 생성됩니다:
var oStringObject = new String("hello world");
String 객체의 valueOf() 메서드와 toString() 메서드는 모두 String 타입의 원시 값을 반환합니다:
alert(oStringObject.valueOf() == oStringObject.toString()); //출력 "true"
이 코드를 실행하면 "true"이 출력되며, 이는 이 값이 정말 일치한다는 것을 의미합니다.
주석:String 객체는 ECMAScript에서 복잡한 참조형之一입니다. 또한, 이 장의 주요重点是 String 클래스의 기본 기능에 불과합니다. 더 많은 고급 기능은 이 튜토리얼의 관련 장을 참조하거나, 다음을 참조하세요: JavaScript String 객체 참조 가이드。
length 속성
String 객체는 length 속성을 가지고 있으며, 이는 문자열의 문자 개수입니다:
var oStringObject = new String("hello world"); alert(oStringObject.length); //출력 "11"
이 예제는 "11"을 출력하며, 이는 "hello world"에 있는 문자의 개수입니다. 주의하십시오. 문자열이 더비트 문자(ASCII 문자와는 달리 ASCII 문자는 하나의 바이트를 사용합니다)를 포함하고 있더라도, 각 문자는 하나의 문자로 계산됩니다.
charAt()와 charCodeAt() 메서드
String 객체는 많은 메서드를 가지고 있습니다.
먼저, charAt()와 charCodeAt() 메서드는 문자열의 단일 문자에 접근합니다. 이 두 메서드는 모두 하나의 파라미터를 가지고 있으며, 이는 처리할 문자의 위치입니다.
charAt() 메서드는 지정된 위치에 있는 문자를 포함한 문자열을 반환합니다:
var oStringObject = new String("hello world"); alert(oStringObject.charAt(1)); //출력 "e"
문자열 "hello world"에서 위치 1에 있는 문자는 "e"입니다. "ECMAScript 원시 타입" 섹션에서 설명한 것처럼, 첫 번째 문자의 위치는 0이며, 두 번째 문자의 위치는 1입니다. 따라서 charAt(1)을 호출하여 "e"를 반환합니다.
문자 대신 문자 코드를 얻고 싶다면 charCodeAt() 메서드를 호출할 수 있습니다:
var oStringObject = new String("hello world"); alert(oStringObject.charCodeAt(1)); // 출력 "101"
이 예제는 "101"을 출력하며, 소문자 "e"의 문자 코드입니다.
concat() 메서드
이제 concat() 메서드를 소개합니다. 이 메서드는 하나나 여러 개의 문자열을 String 객체의 원본 값에 연결합니다. 이 메서드는 String 원본 값을 반환하며, 원본 String 객체는 변경되지 않습니다:
var oStringObject = new String("hello "); var sResult = oStringObject.concat("world"); alert(sResult); // 출력 "hello world" alert(oStringObject); // 출력 "hello "
위의 코드에서 concat() 메서드가 반환하는 것은 "hello world"이며, String 객체는 여전히 "hello "을 저장하고 있습니다. 이 이유로 더 일반적으로 문자열을 연결하는 데 플러스 기호(+)를 사용합니다. 이 형식은 실제 행동을 논리적으로 나타냅니다:
var oStringObject = new String("hello "); var sResult = oStringObject + "world"; alert(sResult); // 출력 "hello world" alert(oStringObject); // 출력 "hello "
indexOf()와 lastIndexOf() 메서드
지금까지 문자열을 연결하는 방법, 문자열 내의 단일 문자에 접근하는 방법에 대해 논의했습니다. 그러나 특정 문자열에서 특정 문자가 정말 존재하는지 확정할 수 없다면 어떤 메서드를 호출해야 할까요? 이 경우 indexOf()와 lastIndexOf() 메서드를 호출할 수 있습니다.
indexOf()와 lastIndexOf() 메서드는 모두 지정된 부분 문자열이 다른 문자열 내에서의 위치를 반환합니다. 부분 문자열을 찾지 못하면 -1을 반환합니다.
이 두 메서드의 차이점은 indexOf() 메서드가 문자열의 시작 부분(위치 0)에서 문자열을 검색하고, lastIndexOf() 메서드가 문자열의 끝 부분에서 부분 문자열을 검색한다는 점입니다. 예를 들어:
var oStringObject = new String("hello world!"); alert(oStringObject.indexOf("o")); 출력 "4" alert(oStringObject.lastIndexOf("o")); 출력 "7"
여기서 첫 번째 "o" 문자열은 위치 4에 있으며 "hello"의 "o"입니다;마지막 "o" 문자열은 위치 7에 있으며 "world"의 "o"입니다. 이 문자열에 "o" 문자열이 하나만 있는 경우, indexOf()와 lastIndexOf() 메서드가 반환하는 위치는 같습니다.
localeCompare() 메서드
다음 메서드는 localeCompare()입니다. 문자열을 정렬합니다. 이 메서드는 하나의 매개변수를 가지며 - 비교할 문자열입니다. 반환되는 값은 다음 세 가지 중 하나입니다:
- String 객체가 매개변수의 문자열 앞에 알파벳 순서로 정렬된 경우 음수를 반환합니다.
- String 객체가 매개변수의 문자열과 같은 경우 0을 반환합니다
- String 객체가 매개변수의 문자열 뒤에 알파벳 순서로 정렬된 경우 양수를 반환합니다.
주석:반환된 값이 음수인 경우 가장 일반적이게는 -1입니다. 하지만 실제로는 구현에 따라 결정됩니다. 반환된 값이 양수인 경우도 마찬가지로 가장 일반적이게는 1입니다. 하지만 실제로는 구현에 따라 결정됩니다.
다음은 예제입니다:
var oStringObject = new String("yellow"); alert(oStringObject.localeCompare("brick")); //출력 "1" alert(oStringObject.localeCompare("yellow")); //출력 "0" alert(oStringObject.localeCompare("zoo")); //출력 "-1"
이 코드에서 문자열 "yellow"는 "brick"、"yellow" 및 "zoo"와 3개의 값과 비교됩니다. 알파벳 순서로 정렬된 경우 "yellow"는 "brick" 뒤에 위치하기 때문에 localeCompare()는 1을 반환합니다. "yellow"는 "yellow"와 같기 때문에 localeCompare()는 0을 반환합니다. "zoo"는 "yellow" 뒤에 위치하기 때문에 localeCompare()는 -1을 반환합니다. 또한 강조하면, 반환된 값은 구현에 따라 결정되므로 localeCompare() 메서드를 다음과 같이 호출하는 것이 좋습니다:
var oStringObject1 = new String("yellow"); var oStringObject2 = new String("brick"); var iResult = oStringObject1.localeCompare(oStringObject2); if(iResult < 0) { alert(oStringObject1 + " 이 " + oStringObject2 + " 앞에 있습니다 "); } alert(oStringObject1 + " 이 " + oStringObject2 + " 뒤에 있습니다 "); } alert(" 두 문자열이 같습니다 "); }
이 구조를 사용하면 이 코드가 모든 구현에서 올바르게 실행될 수 있도록 보장할 수 있습니다.
localeCompare() 메서드의 독특한 점은, 메서드가 실행되는 위치의 구역(locale, 국가/지역과 언어를 의미)가 이 메서드가 어떻게 실행되는지 정확히 설명한다는 것입니다. 미국에서는 ECMAScript 구현의 표준 언어가 영어이며, localeCompare()는 대소문자 구분을 합니다. 대문자는 소문자보다 글자順에서 뒤쪽에 위치합니다. 하지만 다른 구역에서는 이와 같지 않을 수 있습니다.
slice()와 substring()
ECMAScript는 두 가지 메서드를 제공하여 문자열 값을 부분 문자열로 생성합니다. 이 두 메서드는 모두 처리할 문자열의 부분 문자열을 반환하며, 하나 또는 두 가지 매개변수를 받습니다. 첫 번째 매개변수는 가져올 부분 문자열의 시작 위치이며, 두 번째 매개변수(사용할 경우)는 가져올 부분 문자열의 종료 전 위치입니다(즉, 반환 값에 포함되지 않는 종료 위치의 문자를 의미합니다). 두 번째 매개변수를 생략하면 종료 위치는 문자열의 길이로 설정됩니다.
concat() 메서드와 마찬가지로, slice()와 substring() 메서드는 String 객체 자체의 값을 변경하지 않습니다. 그들은 원본 String 값을 반환하고 String 객체를 변경하지 않습니다.
var oStringObject = new String("hello world"); alert(oStringObject.slice("3")); // 출력 "lo world" alert(oStringObject.substring("3")); // 출력 "lo world" alert(oStringObject.slice("3", "7")); // 출력 "lo w" alert(oStringObject.substring("3", "7")); // 출력 "lo w"
이 예제에서, slice()와 substring()의 사용법과 반환 값이 같습니다. 매개변수가 3일 때, 두 메서드는 모두 "lo world"를 반환합니다. "hello"의 두 번째 "l"이 위치 3에 있기 때문입니다. 매개변수가 "3"과 "7" 두 개가 있을 때, 두 메서드는 모두 "lo w"를 반환합니다. "world"의 "o"는 위치 7에 있기 때문에 결과에 포함되지 않습니다.
왜 완전히 동일한 기능을 가진 두 가지 메서드가 있을까요? 사실, 이 두 메서드는 완전히 동일하지 않지만, 매개변수가 부정수일 때만, 매개변수를 처리하는 방식이 약간 다릅니다.
부정수 매개변수를 사용할 때, slice() 메서드는 문자열의 길이에 매개변수를 더하고, substring() 메서드는 그 값을 0으로 처리합니다(그也就是说, 무시합니다). 예를 들어:
var oStringObject = new String("hello world"); alert(oStringObject.slice("-3")); // 출력 "rld" alert(oStringObject.substring("-3")); // 출력 "hello world" alert(oStringObject.slice("3, -4")); // 출력 "lo w" alert(oStringObject.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(3, 0)으로 해석하여, 실제로는 substring(0, 3)입니다. 이는 substring()가 항상 작은 숫자를 시작 위치로, 큰 숫자를 종료 위치로 사용하기 때문입니다. 따라서 substring("3, -4")는 "hel"를 반환합니다. 마지막 줄 코드는 이 메서드를 사용하는 방법을 설명합니다.
toLowerCase(), toLocaleLowerCase(), toUpperCase(), 및 toLocaleUpperCase()
맨 마지막으로 논의할 메서드는 대소문자 변환에 관련됩니다. 대소문자 변환을 수행하기 위해서는 4 가지 메서드가 사용됩니다.
- toLowerCase()
- toLocaleLowerCase()
- toUpperCase()
- toLocaleUpperCase()
이름에서 사용됨을 통해 알 수 있듯이, 전 두 가지 메서드는 문자열을 전체 소문자로 변환하는 데 사용되며, 나머지 두 가지 메서드는 전체 대문자로 변환하는 데 사용됩니다.
toLowerCase() 및 toUpperCase() 메서드는 원본입니다. 이 메서드는 java.lang.String 중에서 같은 메서드를 원형으로 구현됩니다.
toLocaleLowerCase() 및 toLocaleUpperCase() 메서드는 특정 지역에 기반하여 구현됩니다. (localeCompare() 메서드와 같습니다). 많은 지역에서 지역 특정 메서드는 일반 메서드와 완전히 같습니다. 그러나 몇 가지 언어는 Unicode 대소문자 변환에 특정 규칙을 적용합니다(예: 터키어). 따라서 올바른 변환을 위해 지역 특정 메서드를 사용해야 합니다.
var oStringObject = new String("Hello World"); alert(oStringObject.toLocaleUpperCase()); // 출력 "HELLO WORLD" alert(oStringObject.toUpperCase()); // 출력 "HELLO WORLD" alert(oStringObject.toLocaleLowerCase()); // 출력 "hello world" alert(oStringObject.toLowerCase()); // "hello world" 출력
이 코드에서 toUpperCase()와 toLocaleUpperCase()는 모두 "HELLO WORLD"를 출력하며, toLowerCase()와 toLocaleLowerCase()는 모두 "hello world"를 출력합니다. 일반적으로 어떤 인코딩으로 언어가 실행되는지 알지 못할 때는 지역 특정 메서드를 사용하는 것이 안전합니다.
ヒント:기억해 두세요, String 객체의 모든 속성과 메서드는 String 원시 값에 적용할 수 있습니다. 왜냐하면 그들은 가상 객체이기 때문입니다.
instanceof 연산자
typeof 연산자를 사용하여 참조 타입을 저장할 때 문제가 발생합니다. 어떤 타입의 객체를 참조하는지에도 불구하고, 모두 "object"을 반환합니다. ECMAScript는 이 문제를 해결하기 위해 instanceof 연산자를 도입했습니다.
instanceof 연산자는 typeof 연산자와 유사하며, 처리 중인 객체의 타입을 식별하는 데 사용됩니다. typeof 메서드와 달리, instanceof 메서드는 개발자가 명확하게 특정 타입의 객체를 확인하도록 요구합니다. 예를 들어:
var oStringObject = new String("hello world"); alert(oStringObject instanceof String); // "true" 출력
이 코드는 "변수 oStringObject가 String 객체의 인스턴스인가"를 묻고 있습니다. oStringObject는 정말 String 객체의 인스턴스입니다. 따라서 결과는 "true"입니다. typeof 메서드와 같이 유연하지 않지만, typeof 메서드가 "object"을 반환하는 경우 instanceof 메서드는 매우 유용합니다.
- 이전 페이지 ECMAScript 타입 변환
- 다음 페이지 일원 연산자