?????????????????????????? test ?????????′??????飬????????????е?????????? valueOf ??????

?????????д??? test ?????? valueOf ??????
????test.valueOf = function() {
????console.log('???? valueOf ????');
????return 2;
????}
????test;
????// ??????£?
????// ???? valueOf ????
????// 2
?????? Number ????????????????? valueOf ?????????????????????????????????? toString ??????
????test.valueOf = function() {
????console.log('???? valueOf ????');
????return {};
????}
????test.toString= function() {
????console.log('???? toString ????');
????return 3;
????}
????test;
????// ??????£?
????// ???? valueOf ????
????// ???? toString ????
????// 3
????????
???????????????????????????????????????????е??? valueOf ????????????????д??÷???????????????????????£?
functionadd(){
console.log('????add');
varargs=Array.prototype.slice.call(arguments);
varfn=function(){
vararg_fn=Array.prototype.slice.call(arguments);
console.log('????fn');
returnadd.apply(null??args.concat(arg_fn));
}
fn.valueOf=function(){
console.log('????valueOf');
returnargs.reduce(function(a??b){
returna+b;
})
}
returnfn;
}
????????????? add ??????????????? fn ??? function????????????? fn.valueOf();
????add(1);
????// ??????£?
????// ????add
????// ????valueOf
????// 1
???????????????
????[1].reduce(function(a?? b) {
????return a + b;
????})
????// 1
????????????????ε????
????add(1)(2);
????// ??????£?
????// ????add
????// ????fn
????// ????add
????// ????valueOf
????// 3
????????????????ε????
????add(1)(2)(3);
????// ??????£?
????// ????add
????// ????fn
????// ????add
????// ????fn
????// ????add
????// ????valueOf
????// 6
????????????????????????????????к???ε??ò?????????? valueOf????????????????????????????????????????ε??÷????????? fn ?????????????????????? fn.valueOf???????????? reduce ?????????в???????
?????????д valueOf ????????????д toString ???????????????????????????????????
function add () {
var args = Array.prototype.slice.call(arguments);
var fn = function () {
var arg_fn = Array.prototype.slice.call(arguments);
return add.apply(null?? args.concat(arg_fn));
}
fn.toString = function() {
return args.reduce(function(a?? b) {
return a + b;
})
}
return fn;
}
?????????и????????????д valueOf() ???? toString() ?????????????????????д?????????????????????д??????? Number ?????????????????????? valueOf() ???????? valueOf() ???????????????????????????? toString() ??????
???????
????????????????????“?????????????д????????????????”??????????????????????????????????????????????????????????????????????????????????£????????????????????????????????????????????
????????????????????????? ECMAScript ?淶?????????????????????????????????к???????????????????????????
???????