一、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;那麼就沒法獲取了。