javaScript基本功001

一、valueOf與toStringjavascript

會寫前端JS的人不必定知道一些js內部運行時調用,如valueOf與toString,他們都在類型轉換時或對象被運用來運算時轉換時隱式調用他們,html

這就像一般說的強制轉換,而有時爲了實現更適合自身的功能須要,重寫了這兩個方法。前端

javascript中全部數據類型都擁有valueOf和toString這兩個方法,null除外。java

valueOf()函數的做用是返回該object自身。與toString()同樣,定義類時能夠實現新的valueOf()方法,從而返回須要的結果。閉包

valueOf():返回最適合該對象類型的原始值;app

toString(): 將該對象的原始值以字符串形式返回。函數

var abc={
    val:123,
    str:"zxc",
    valueOf:function(){
        console.log("valueOf");
        return this.val;
    },
    toString:function(){
        console.log("toString");
        return this.str;
    }
}

 

 

 從上可知:this

當對象運算時隱式調用valueOf,而爲顯示時調用toString轉化爲字符串展現。es5

 

函數柯里化spa

當函數不斷處於調用時valueOf與toString會在最後返回值時被調用,因此能夠使用在函數柯里化裏。

function ff(a,b,c,d){
    return a+b+c+d;
}

function ccc(fn){
    var fn1=function(){
        var args=Array.prototype.slice.call(arguments);
        var fn2=function(){
            var args2=Array.prototype.slice.call(arguments);
            return fn1.apply(null,args.concat(args2));
        }
        fn2.valueOf=function(){
            return fn.apply(null,args);
        }
        return fn2;
    }
    return fn1;
}

ccc(ff)(1)(2)(3)(4) //10

 

js坑點

var b={xx:1}
var a=b
b.z=b={cc:23}

在es5的規範裏賦值時從左到右的,先b.z={cc:23} 後 b={cc:23},因此b的引用變了,因此b.z不存在,而a還指向以前的地址,因此還可拿到地址裏值。

 

 

var obj=(function(){
    var pp={
        a:"cc",
        x:"cc"
    }
    return function(key){
        return pp[key];
    }
})();
    
Object.defineProperty(Object.prototype,"self",{
    get:function(){
        return this;
    }
})

var xx=obj("self");

以上爲當能夠獲取到對象屬性時要獲取閉包內目標對象方法。

 但若是對象設置了pp.__proto__=null;那麼就沒法獲取了。

相關文章
相關標籤/搜索