valueOf 및 toString

10643 단어 toString
고전적인 제목이 하나 있다.
var add = function() {___}; console.log(add(3)(4)(5)); //  60

제목은 무한 곱하기가 필요합니다.add 함수를 보충해 주십시오.
우선,dd 함수는 매개 변수를 가진function을 되돌려야 하며, 그렇지 않으면 후속적인 곱셈 작업을 할 수 없다.그 다음에 마지막까지 곱하면 매개 변수가 없습니다.add 함수는 직접 수치를 되돌려야 합니다.사실 이것은 깊이 있는 함수와 유사하여 n의 값에 따라 귀속된다.
1 var add = function(n) {

2   if(n === 5) 

3     return n;

4   return n * add(n + 1);

5 }

6 console.log(add(3));

두 번째 줄은 매개 변수가 없을 때의 판단 조작과 같고, 네 번째 줄은 매개 변수를 가진 방법을 되돌리는 것과 같다.이 문제의 난점은 값의 누적이다. 만약에 전역 변수 저장 값을 설정할 수 있다면 매우 편리할 것이다. 중간 변수가 없기 때문에 js 함수 특성에 따라 함수만 되돌릴 수 있고 함수와 숫자가 곱하는 방식은 되돌릴 수 없다.글로벌 변수를 설정할 수 있는 경우:
1 var add = function(n) {

2   ans *= n;

3   return add;

4 }

5 var ans = 1;

6 add(5)(4)(3);

7 console.log(ans);

함수를 되돌려야 하기 때문에 값의 누적을 실현해야 하고 변수를 추가할 수 없기 때문에 누적된 값을 매개 변수로만 전달할 수 있습니다.
1 var add = function(a) {

2   var temp = function(b) {

3     return add(a * b);

4   }

5   return temp;

6 }

그럼,add(3)(4)(5)는 상기 코드에서 어떻게 작동합니까?1단계 a=3, b=4, 연산 후add(3*4)(5), 2단계, a=12, b=5, 연산 후add(3*4*5), 3단계 a=60 전입,temp 방법return, 컨트롤러에서 다음과 같이 보십시오.
function (b) {

   return add(a * b);

} 

이때 function의 toString과 valueOf 방법을 주목해야 한다.toString과 valueOf 방법을 다시 쓰면 답을 얻을 수 있습니다.
 1 var add = function(a) {

 2   var temp = function(b) {

 3     return add(a * b);

 4   }

 5   temp.toString = temp.valueOf = function() {

 6     return a;

 7   }

 8   return temp;

 9 }

10 console.log(add(3)(4)(5));

 
valueOf & toString 정보:
js에null을 제외한 모든 대상은valueOf와toString 방법이 있습니다. 일반적인 상황에서 대상은 toString 방법을 먼저 호출한 다음valueOf를 호출합니다.
var bbb = {

  toString: function() {

    console.log('toString');

    return 10;

  },

  valueOf: function() {

    console.log('valueOf');

    return 10;

  }

}



alert(bbb);// 10 toString

alert(+bbb); // 10 valueOf

alert(''+bbb); // 10 valueOf

alert(String(bbb)); // 10 toString

alert(Number(bbb)); // 10 valueOf

alert(bbb == '10'); // true valueOf

alert(bbb === '10'); // false

이것은 사도 정미의 한 예인데, 그도 결과에 대해 해석을 했다.문자열로 변환할 때 toString 방법을 호출하고, 수치로 변환할 때valueOf 방법을 호출하지만, 그 중 두 가지는 매우 조화롭지 않다. 하나는 alert('+bb), 문자열 조합은 toString 방법을 호출하는 것이다. 다른 하나는 = = 조작부호가 은식 변환을 하지 않기 때문에 호출하지 않는다는 것이다.진상을 추궁하기 위해서 우리는 더욱 엄밀한 실험이 필요하다.
var aa = {

  i: 10,

  toString: function() {

    console.log('toString');

    return this.i;

  }

}

 

alert(aa);// 10 toString

alert(+aa); // 10 toString

alert(''+aa); // 10 toString

alert(String(aa)); // 10 toString

alert(Number(aa)); // 10 toString

alert(aa == '10'); // true toString

aa가 valueOf 방법을 다시 쓰지 않았기 때문에 실제 운행할 때 먼저 toString 방법을 찾는다. 예를 들어alert(+aa)는 사실valueOf 방법을 우선적으로 호출해야 하지만 valueOf가 있기 때문에 그 다음에 toString을 호출해야 한다.
var bb = {

   i: 10,

   valueOf: function() {

     console.log('valueOf');

     return this.i;

   }

 }

 

 alert(bb);// [object Object]

 alert(+bb); // 10 valueOf

 alert(''+bb); // 10 valueOf

 alert(String(bb)); // [object Object]

 alert(Number(bb)); // 10 valueOf

 alert(bb == '10'); // true valueOf

상기 결과는 그다지 조화롭지 않은 것 같다. 사고방식에 따라 toString 방법이 없기 때문에value Of를 호출한다. 그러나 왜 1과 4가 출력되는지는 [object object]이다.사도 정미는 Object의 toString 방법을 계승하여 제거를 시도한 후
Object.prototype.toString = null;

 

var cc = {

  i: 10,

  valueOf: function() {

    console.log('valueOf');

    return this.i;

  }

}

 

alert(cc);// 10 valueOf

alert(+cc); // 10 valueOf

alert(''+cc); // 10 valueOf

alert(String(cc)); // 10 valueOf

alert(Number(cc)); // 10 valueOf

alert(cc == '10'); // true valueOf

toString만 다시 쓰면 대상이 변환될 때 valueOf의 존재를 무시하고 변환합니다.단, valueOf 방법만 다시 쓰면 문자열로 변환할 때 toString 방법을 우선적으로 고려합니다.toString을 호출할 수 없는 상황에서 valueOf만 출전시킬 수 있습니다.그 이상한 문자열 연결 문제는 조작부호에서 나온 것일 수도 있습니다. ECMA262-5를 펼치면 getValue 작업이 있습니다.응, 그럼 수수께끼가 풀렸을 거야.다시 쓰기는 호출의 최적화를 높일 수 있지만, 조작부호가 있는 상황에서valueOf의 우선순위는 원래 toString보다 높다.

좋은 웹페이지 즐겨찾기