그룹에서 샤오팡팡(Xiao Fangfang)이라는 귀여운 90대 청년과 이야기를 나누던 중, IT맨들의 나쁜 습관에 대해 이야기를 나누다가 갑자기 기술에 빠져들게 된 샤오팡팡이
1. 변수를 선언합니다. 숫자형 3가지를 봤는데 차이점이 무엇인가요?
2. 분명히 우리에게는 일반적인 숫자 리터럴입니다. 다음과 같이 다양한 메서드를 직접 호출할 수 있습니다.
살짝 웃었어요. 청년이군요. 아직은 좀 어려요. 세 종류뿐 아니라 적어도 다섯 종류는 알아요! !
웃으며 웃자 입가가 씰룩거리기 시작했고, 이마에 식은땀이 흐르기 시작했습니다. 최소한 다섯 가지 종류가 있습니다. 그렇죠. 하지만. . . 차이점은 무엇입니까? . .
오랜 신인 특유의 꼼꼼함과 자부심을 갖고 '이건 모르겠으니 직접 정보를 찾아보세요'라고 경멸적으로 말했습니다. . . ECMAS - 262(제5판)을 뒤집어서 살펴보세요
1. 숫자 유형 변수를 선언하는 다섯 가지 방법
//방법 1: 가장 일반적인 방법은 숫자 리터럴을 통해 선언하는 것입니다.
var num = 123; //방법 2: 가끔 사용됨, 대부분의 경우 문자열을 숫자로 변환
var num = Number(123);
//방법 3: 거의 사용되지 않음, Rhinoceros Books를 포함한 다양한 성서에서 권장되지 않는 방법
var num = new Number(123);//방법 4: 신의 방법, 아직 사용하는 사람을 본 적이 없습니다.
var num = new Object(123) ); 🎜>//방법 5: 더 이상하고 이상합니다
var num = Object(123)
보시다시피 위의 5가지 선언 방법 중 1번 방법은 말할 필요도 없이 일반적으로 이렇게 사용되는데, 3번 방법과 5번 방법이 비교용으로 사용되는데, 이에 대해서는 아래에서 별도로 설명하겠습니다.
1.5 What 두 선언 방법의 차이점은 무엇입니까? 떨리는 손가락으로 코드를 쳤을 때 무슨 일이 일어났나요?
2. 메소드 1에 선언된 것은 분명히 객체가 아니지만 일반적으로 toString 등과 같은 메소드를 호출할 수 있는 이유는 무엇입니까?
2. 다양한 선언 방법의 차이점
방법 1: var num = 123 EC5 설명:
숫자 리터럴은 숫자 값을 나타냅니다. 이 값은 두 단계로 결정됩니다. 첫째, 수학적 값(MV)이 리터럴에서 파생되고, 두 번째로 이 수학적 값은 아래 설명된 대로 반올림됩니다.
//....개인 요약 요약:
1. 숫자 선언 방식도 num = .123, num = 123e4 등의 형태가 될 수 있으므로 정수부, 소수부 등을 빼는 등 변수의 값을 분석합니다.
2 . 파싱된 값을 근사화합니다. 예를 들어 num = 123.33333333333333...333333333333333333.... 이때 특정 근사값을 취하면 규칙이 확장되지 않습니다.
3 . 이런 방식으로 선언된 변수는 Object가 아닌 단순한 숫자 리터럴입니다. (toString 및 기타 메소드가 호출될 수 있는 이유는 나중에 설명하겠습니다.)
방법 2: var num = Number( 123);
EC5 설명:
15.7.1 함수로 호출되는 숫자 생성자
숫자가 생성자가 아닌 함수로 호출되면 유형 변환을 수행합니다. Number ( [ value ] )
값이 제공된 경우 ToNumber(value)에서 계산한 Number 값(Number 개체 아님)을 반환하고, 그렇지 않으면 0을 반환합니다. 개인 요약 요약:
여기서 Number는 단지 an으로 호출됩니다. 생성자가 아닌 일반 함수이므로 반환되는 것은 객체가 아니고 단순한 값입니다
2. 방법 1과 본질은 동일합니다. 방법 1과의 차이점은 기반으로 다른 유형 변환 프로세스를 수행해야 한다는 것입니다. 구체적인 규칙은 다음과 같습니다.
방법 3: var num = new Number(123);
EC5 설명:
15.7.2 숫자 생성자
Number가 새 표현식의 일부로 호출되면 생성자입니다. 15.7.2.1 새 숫자( [ 값. ] )
새로 생성된 객체의 [[Prototype]] 내부 속성은 Number.prototype(15.7.3.1)의 초기 값인 원래 Number 프로토타입 객체로 설정됩니다.
[[ Class]] 새로 생성된 객체의 내부 속성은 "Number"로 설정됩니다.
새로 생성된 객체의 [[PrimitiveValue ]] 내부 속성은 value가 제공되면
ToNumber(value)로 설정되고, 그렇지 않으면
0.
새로 생성된 객체의 [[Extensible]] 내부 속성이 true로 설정됩니다.개인 요약:
1. 여기서 Number 함수 생성자가 호출되고 Number 유형의 객체가 반환됩니다. 객체는 Number의 프로토타입 속성과 메서드에 액세스할 수 있습니다. 이에 대해서는 나중에 설명하겠습니다.
코드는 다음과 같습니다.
var num = new Number(123);
console.log( typeof num); //출력: object
console.log(Object. 프로토타입.toString.call(num)); //출력: [객체 번호]
3. 반환된 Number 유형 객체 내부의 원래 값([[PrimitiveValue]])은 유형 변환 후 얻은 숫자 값입니다. 구체적인 변환 규칙은
방법 4: var num = new Object(123);
EC5 설명:
15.2.2 객체 생성자
Object가 new 표현식의 일부로 호출될 때 이는 다음을 수행하는 생성자입니다.
15.2.2.1 new Object ( [ value ] )
인수 없이 또는 하나의 인수 값으로 Object 생성자가 호출되는 경우 다음 단계가 수행됩니다.
1.값이 다음과 같은 경우 제공된 경우
a. Type(value)이 Object인 경우
1. 값이 기본 ECMAScript 객체인 경우 새 객체를 생성하지 않고 단순히 값을 반환합니다.
2. 호스트 개체이면 작업이 수행되고 호스트 개체에 따라 달라질 수 있는 결과가 반환됩니다.
b. Type(값)이 문자열인 경우
를 반환합니다. c. Type(값)이 Boolean인 경우
d. Type(값)이 Number인 경우
2.Assert: 인수 값이 제공되지 않았습니다. 유형이 Null이거나 정의되지 않았습니다.
3. obj를 새로 생성된 기본 ECMAScript 객체로 둡니다.
4. obj의 [[Prototype]] 내부 속성을 표준 내장 객체 프로토타입 객체로 설정합니다(15.2.4 ).
5.obj의 [[Class]] 내부 속성을 "Object"로 설정합니다.
6. obj의 [[Extensible]] 내부 속성을 true로 설정합니다.
7. 8.12.
8.Return obj
개인적인 이해 :
위에 게시된 텍스트가 많아서 머리가 아플 수 있습니다. new Object(param)은 이러한 방식으로 변수를 선언합니다. 얻은 결과는 데이터 유형과 같이 전달된 매개변수의 특정 유형에 따라 달라집니다. 여기서의 특정 변환 규칙은 무시할 수 있습니다. 즉, 위에서 빨간색으로 표시된 텍스트만 살펴보겠습니다.
1. 숫자, Number 유형 객체 생성 및 반환 - 예, 이는 실제로 메서드 3
2와 동일합니다. Number 객체의 값은 전달된 매개변수와 동일하며 내부 [[prototype]] 속성은 Number를 가리킵니다. .prototype
방법 5: var num = Object(123);
EC5 설명:
15.2.1 함수로 호출되는 객체 생성자
Object가 생성자가 아닌 함수로 호출되는 경우
15.2.1.1 Object ( [ value ] )
Object 함수가 인수 없이 또는 하나의 인수 값으로 호출되는 경우 다음 단계가 수행됩니다.
1.값 null이거나 정의되지 않았거나 제공되지 않은 경우 표준 내장 Object 생성자가 동일한 인수(15.2.2.1)를 사용하여 호출된 것처럼 정확하게 새 Object 객체를 생성하고 반환합니다.
2.Return ToObject(value)
개인적 이해:
1. 전달된 매개변수가 비어 있거나 정의되지 않았거나 null인 경우 new Object(param)와 동일하며 param은 사용자가 전달한 매개변수입니다
2. 그렇지 않으면 객체가 반환됩니다. 객체 유형은 특히 위의 예에서 아래 표에서 볼 수 있으며 본질적으로 new Number(123)와 동일합니다.
3. 간단한 테스트 케이스
var num = Object(123);
console.log(typeof num); //출력: object console.log(Object.prototype.toString.call(num)); //출력: [object Number]
3. var num = 123; and var num = new Number( 123) 현자와 현자들은 첫 번째 방법을 사용하는 것이 가장 좋다고 경고했습니다. 매우 설득력이 있습니다. eval(num)을 사용하면 비효율적이며 예상치 못한 상황이 발생할 수 있습니다. . . Balabala
위의 잡음은 제쳐두고 여기서 우리가 집중하고 싶은 것은 다음 명령문이 잘못되지 않는 이유입니다.
var num = 123;
console.log(num.toString(num)) //출력: '123', 오류 발생 없음
리터럴 선언이 객체가 아니라 그냥 일반적인 숫자형이라는 뜻이 아니었나요? 그러나 toString 메소드 호출은 객체에서 발생하지 않습니다. 이는 비과학적인 것입니다.
그래, Rhinoceros 책을 보고 답을 찾았다:
사용자가 리터럴을 통해 변수를 선언하고 해당 변수에 대해 toString과 같은 메서드를 호출하면 JS 스크립트 엔진이 비밀리에 변수에 해당하는 객체를 패키징하고 해당 객체에 대해 해당 메서드를 호출합니다. 호출이 완료되면 객체가 소멸됩니다. 이 프로세스는 사용자에게 보이지 않으므로 많은 초보자가 이 문제를 겪을 것입니다.
알겠습니다. 위 문단은 원문이 아니라는 점을 인정하며, 이는 Rhinoceros 책의 해당 문단에 대한 개인적인 이해일 뿐이며, 좀 더 전문적이고 권위 있게 보이기 위해 의도적으로 인용 부호를 추가했습니다. . . . 위의 예시는 간단히
var num = 123;
var tmp = num;
num = new Number(num)
console.log(num.toString(num));
(어젯밤 거의 1시까지 기준을 넘기느라 너무 졸려서 게으른 상태였습니다. Rhino Book은 속이지 않을 거라 믿습니다)
4. 맨 뒤에 작성하세요
저는 항상 Javascript의 변수 선언 방법, 유형 판단 등에 대해 불평할 수 없다고 느꼈습니다. 위 내용은 초보자에게 있어서도 전망을 망치는 것과 같습니다. 2년째 자바스크립트를 사용하고 있는 저처럼 많은 베테랑 신인들이 헷갈려 하는 경우가 많습니다
간단히 요약:
1. 방법 1과 방법 2는 본질적으로 동일합니다
2. 5개는 본질적으로 동일합니다
마지막으로:
기사의 예에 오류나 누락이 있는 경우 해당 기사가 유용하다고 생각되면 "추천"을 클릭하세요. :)