一、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;那么就没法获取了。