valueof toString
add(1)(2) // 3
add(1, 2, 3)(10) // 16
add(1)(2)(3)(4)(5) // 15
function add() {
var args = Array.prototype.slice.call(arguments);
return function() {
var arg2 = Array.prototype.slice.call(arguments);
return args.concat(arg2).reduce(function(a, b){
return a + b;
});
}
}
add(1)(2) // 3
add(1, 2)(3) // 6
add(1)(2)(3) // Uncaught TypeError: add(...)(...) is not a function(…)
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.valueOf = function () {
return args.reduce(function(a, b) {
return a + b;
})
}
return fn;
}
var a = {a : 1}
undefined
a + 1
"[object Object]1"
a = {
toString () {
return '1111'
}
}
Object {}
a + 1
"11111"
var aa = {
toString : function () {
return {}
},
valueOf : function () {
return '+1'
}
}
undefined
aa + 1
"+11"
function xdh () {
}
xdh.valueOf = () => {
console.log("valueof")
return {}
}
xdh.toString = () => {
console.log("toString")
return 'sadasda'
}
() => {
console.log("toString")
return 'sadasda'
}
xdh
VM3052:6 valueof
VM3052:11 toString
sadasda
object 一般情况下 先调用 valueOf 后调用toString