2016-11-28 1 views
2

난 그냥 뭔가를 시도하고 발견 된이 :String (number)가 number.toString을 내부적으로 호출합니까?

사용자 정의 toString 내부 String(n)를 호출 할 경우,이 오류 Maximum Call Stack exceeded 자신을 호출하고 발생,

JSFiddle

Number.prototype.toString = function() { 
 
    return String(this) 
 
} 
 

 
var a = 10; 
 
try { 
 
    a.toString() 
 
} catch (err) { 
 
    console.log(err.message) 
 
}

하지만, 직접 var b = String(a)으로 전화하면 01을 호출하지 않습니다.기능.

Number.prototype.toString = function(){ 
 
    console.log(this); 
 
    return '' + this; 
 
} 
 

 
var a = 10; 
 
a.toString();

JSFiddle : 나는 조각도 동일한 오류를 던지고있다 위 알지만, Node, chrome - JSFiddleFirefox - JSFiddle에 확인하고는 일치한다. var b = String(a)number.toString()을 호출하지 않으므로 '' + this도 호출합니다. 이것은 number.toString()''+this에 호출하는 Stack snippet의 일부 최적화입니다.

제 질문은 무엇입니까? 왜이 이상한 행동입니까?

+0

@Downvoters이다, 나는 당신의 관점을 존중하지만 당신이 생각하는 경우에, 뭔가 게시물에 문제가있다, 당신의 의견을 공유하시기 바랍니다. 투표 만하면 누구에게도 도움이되지 않습니다. – Rajesh

답변

2

실제 숫자는 내부 메서드를 호출하여 문자열로 변환하며 명시 적으로 호출되지 않는 한 출력은 valueOftoString의 영향을받지 않습니다.

그럼 왜 처음에 toString이 호출 되었습니까? "조잡"(비 엄격한) 모드에서 this의 값 String(this) 또는 '' + this에 전달되기 전에 오브젝트 형태 (즉 new Number(10)의 상당)로 변환되기 때문에

이다.

(이러한 이유로, 당신은 엄격 모드를 사용하는 일반 응용 프로그램에서이 두 가지 방법의 차이를 볼 수 있습니다.) this으로

는, 객체 모두 String()+ 또한 운영자는 변환을 시도합니다 객체를 문자열로 변환합니다. 이것은 일반적으로 obj.toString 또는 obj.valueOf을 호출하여 수행됩니다.

String(this)이 실패하는 이유에 관해서는

하지만 '' + this하지 않는의 String 기능은 valueOf를 호출하기 전에 개체에서 toString를 호출합니다.

그러나 추가 연산자 (+)를 사용하면 valueOftoString의 순서가 반대가됩니다.

+0

"*이 값은 객체 형식으로 변환 될 것입니다 ... *. 두 번째 부분 인'String (value)'은'value.toString'을 호출 할 것이라고 생각합니다. 따라서 * toString * 메서드가 호출하는 것보다 * 문자열 *, 재귀가 발생합니다. [* ECMA-262 §21.1.1.1 *] (http://ecma-international.org/ecma-262/7.0/index.html#sec-string-constructor-string-value) – RobG

+0

@RobG : 'toString'이 처음에 호출 된 이유는 숫자의 객체 형식에 대한 String()입니다. 내가 말한 것을 분명히하려고합니다. –

+0

Cool 사실, ECMA-262는 [* ToString (number) * 알고리즘]에서 toString을 호출하지 않습니다 (http://ecma-international.org/ecma-262/7.0/index.html#sec -tostring-to-the-number-type), 그것은 구현 방법 일 수도 있습니다. – RobG

0

전화/신청서를 사용해야 할 수도 있습니다.내가 생각

Number.prototype.toString = function() { 
 
    console.log(this) 
 
    return String(this) 
 
} 
 

 
var a = 10; 
 
try { 
 
    a.toString.call() 
 
    console.log(a) 
 
} catch (err) { 
 
    console.log(err.message) 
 
}

이유는 The reason to use JS .call() method?

+0

안녕하세요, 질문의 목적은 왜 이런 일이 일어나고 있는지 이해하는 것입니다. 또한 포인터 만 있으면 'this'없이'.call'을 실행하면 문맥이 지워집니다. – Rajesh

관련 문제