add(3)(4) =add(3,4) 함수 체인 호출

3031 단어

Code1

function add(...v) {
    return v.reduce((x,y)=>x+y);
}

Code2

function add(...v) {
    var sum = v.reduce((x,y)=>x+y);
    var tmp = function (...v) {
        sum = sum + v.reduce((x,y)=>x+y);
        return tmp;
    };
    tmp.valueOf = function (){
        return sum;
    };

    tmp.toString = function () {
        return "" + sum;
    };
    return tmp;
}

설명 코드 2

  • 이것은 함수를 실행하여 함수 자체의 값을 되돌리는 것과 유사하다
  • 그러나 계산이 끝난 후에 tmp라는 함수를 되돌려주었습니다. 이렇게 하면 계산의 결과를 얻을 수 없습니다. 우리가 필요로 하는 결과는 계산된 숫자입니다. 그러면 어떻게 합니까? 우선 자바스크립트에서 인쇄와 추가 계산은 각각 toString이나valueOf 함수를 호출한다는 것을 알아야 합니다. 그래서 우리는 tmp의 toString과valueOf 방법을 다시 써서sum의 값을 되돌려줍니다
  • 이상의 방법은 매개 변수의 유효성에 대한 검사가 부족합니다..

  • 테스트 코드2

    add(1); // function 1
    add(1, 2); // function 3
    add(1, 2)(2); // function 5
    add(1, 2)(2, 5); // function 10
    

    Code3(Code2 Plus)

    function add(...v) {
    
        let isNumber = value => typeof value === "number";
    
        //  、 
        let hasMore = v => v && v.length > 1;
    
        let subMore = v => v.reduce((x, y) => {
            x = isNumber(x) ? x : (Array.isArray(x) ? sub(x) : 0);
            y = isNumber(y) ? y : (Array.isArray(y) ? sub(y) : 0);
            return x + y;
        });
    
        let subOne = v => isNumber(v) ? v : (v && Array.isArray(v[0]) ? sub(v[0]) : 0);
    
        let sub = v => hasMore(v) ? subMore(v) : subOne(v[0]);
    
        let sum = sub(v);
    
        let tmp = function (...v) {
            sum = sum + sub(v);
            return tmp;
        };
    
        tmp.valueOf = function (){
            return sum;
        };
    
        tmp.toString = function () {
            return "" + sum;
        };
    
        return tmp;
    }
    

    설명 코드 3


    개선 후 수조와 문자열을 동시에 입력할 수 있으며, 수조의 깊이를 제한하지 않지만, 반드시 순수한 숫자이어야 하며, 문자열 숫자일 수 없고, 클래스 대상일 수도 없다

    테스트 코드 3

    add(1); // / {[Number: 1] valueOf: [Function], toString: [Function] }
    add(1, 2); // / {[Number: 3] valueOf: [Function], toString: [Function] }
    add(1, 2)(2); // / {[Number: 5] valueOf: [Function], toString: [Function] }
    add(1, 2)(2, 5); // {[Number: 10] valueOf: [Function], toString: [Function] }
    add(null, 2)(2,undefined); // { [Number: 4] valueOf: [Function], toString: [Function] }
    add(null, 2)(2,undefined, null); // { [Number: 4] valueOf: [Function], toString: [Function] }
    add(1, 2, [1,2,3,4, [1,3,4,5,1,5]]); // { [Number: 32] valueOf: [Function], toString: [Function] }
    add(1, 2, [1,2,3,4, [1,3,4,5,1,5]])(1,3,4,[1,4]); // {[Number: 45] valueOf: [Function], toString: [Function] }
    add({0: 1, 1: 2, length: 2}) ; // {[Number: 0] valueOf: [Function], toString: [Function] }
    

    숫자를 얻으려면 숫자로 바꾸는 방법을 사용해야 한다


    예: +add(1);add(1) - 0; 등등

    불완전한 곳

    add(1,1) == 2 // true
    add(1,1) === 2 // false
    

    typeof add(1,2)는 function이기 때문에 인쇄와 계산은 각각 toString이나valueOf 함수를 호출하고 ==를 사용할 때 유형을 판단해야 하기 때문에false

    좋은 웹페이지 즐겨찾기