????????????????????????
?????????????????????????????????????????
????add(1)(2) // 3
????add(1?? 2?? 3)(10) // 16
????add(1)(2)(3)(4)(5) // 15
?????????????????????????????????????????£??????????????????????????????? Array.prototype.reduce()??
??????????(Higher-order function)????????????????????????????????????????? javascript ?У????????????????????????????????????????
????????????????????
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(…)
????????????????? add()() ??????????????????????????????????????????????????????????????????
????????????????????????????add()???????μ????????????????????????????????????
????????????????????????д?????? 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.valueOf = function () {
return args.reduce(function(a?? b) {
return a + b;
})
}
return fn;
}
??????????????????????????????±????????о? fn.valueOf() ?????β????б????ù??????????????????
????add(1) // 1
????add(1??2)(3) //6
????add(1)(2)(3)(4)(5) // 15
???????????????????????????????? fn.valueOf = function() {} ???????λ?????????????????????????????????е????????????????????
????valueOf ?? toString
???????????????????????????
????Object.prototype.valueOf()
?????? MDN ????????valueOf() ?????????????????????
????JavaScript ???? valueOf() ???????????????????????????????????????????????????????????????????????????valueOf ????????? JavaScript ??????á?
?????????????仰???????????????ν??????????????????
????Object.prototype.toString()
????toString() ???????????????????????????
???????????????? toString() ????????????????????????????????????????????????????÷???????????á?
??????????????valueOf() ?? toString() ????????????????е??á?
??????????
????????????£???????? javascript ??????????????? Object ?? Symbol??????????????????
????· Number
????· String
????· Boolean
????· Undefined
????· Null
?????? JavaScript ???ж????????????????????????????Щ???????????к??????????????????????
????String ???????
????????????????????????????????????????????????????????????? String ???????????????????????????? String ??????????????????? toString ??????????????
????var obj = {name: 'Coco'};
????var str = '123' + obj;
????console.log(str);  // 123[object Object]
???????????
????1????? toString ????????????????????????? toString ??????
????2????? toString ??????????????????????????????? valueOf ????????? valueOf ??????????????????????????????? valueOf ??????
????3??????????????????
?????????????????????
????var obj = {name: 'Coco'};
????var str = '123' + obj.toString();
???????У?obj.toString() ???? "[object Object]"??
?????????????飺
????var arr = [1?? 2];
????var str = '123' + arr;
????console.log(str); // 1231??2
???????? + arr ?????????????????????????????? arr ?????????????????????????????????? + arr.toString() ??
?????????????????????д????? toString??valueOf ????:
var obj = {
toString: function() {
console.log('?????? obj.toString');
return {};
}??
valueOf: function() {
console.log('?????? obj.valueOf')
return '110';
}
}
alert(obj);
// ?????? obj.toString
// ?????? obj.valueOf
// 110
???????? alert(obj + '1') ??obj ?????????????? obj.toString() ?????????????????????????д???? toString ??????????? [object Object]1 ????????????д?? toString ????????????????????????? 111 ???????? alert ???? 1111??
????????????????д???toString ??????????????????????????????????????????????????????????????? valueOf ??????
???????????????????????????????????????????????У???? toString() ??????????????????????
????????????????????? valueOf() ???????????????д????? toString ?? valueOf??
var obj = {
toString: function() {
console.log('?????? obj.toString');
return {};
}??
valueOf: function() {
console.log('?????? obj.valueOf')
return '110';
}
}
alert(obj);
// ?????? obj.toString
// ?????? obj.valueOf
// 110
??????????????????? toString ??????????????????? valueOf ????????? valueOf ???????????????????????String??Number??Boolean???????????valueOf??????
????????????toString ?? valueOf ?????????????????????????????????
var obj = {
toString: function() {
console.log('?????? obj.toString');
return {};
}??
valueOf: function() {
console.log('?????? obj.valueOf')
return {};
}
}
alert(obj);
// ?????? obj.toString
// ?????? obj.valueOf
// Uncaught TypeError: Cannot convert object to primitive value
??????????????? toString ?? valueOf ?????????????????£??????????????????
????????? 2017-03-07???????? ECMAScript5 ??????????????????????????????Object ???????? String ??????????????????渴?????????????1.?????????? ToPrimitive ??????2.???? ToString(???) ?????? ToPrimitive ?? ToString ???????????????????ECMAScript5 — ToString
????Number ???????
???????????????? String ????????????????????? Number ??????????
????· ???? Number() ???????????? Number ???????
????· ???? Math.sqrt() ?????????? Number ????????
????· obj == 1 ?????ж??????
????· obj + 1 ?? ????????????
?????? String ???????????????? Number ?????÷???????????????? valueOf ????????????? toString ??????
????1????? valueOf ????????????????????????? valueOf ??????
????2????? toString ????????????????????????? toString ??????
????3??????????????????
???????????????裬???????£?
var obj = {
valueOf: function() {
console.log('???? valueOf');
return 5;
}
}
console.log(obj + 1);
// ???? valueOf
// 6
var obj = {
valueOf: function() {
console.log('???? valueOf');
return {};
}??
toString: function() {
console.log('???? toString');
return 10;
}
}
console.log(obj + 1);
// ???? valueOf
// ???? toString
// 11
var obj = {
valueOf: function() {
console.log('???? valueOf');
return {};
}??
toString: function() {
console.log('???? toString');
return {};
}
}
console.log(obj + 1);
// ???? valueOf
// ???? toString
// Uncaught TypeError: Cannot convert object to primitive value
????Boolean ???
????????????в?????????
????· ????????
????· if(obj) ?? while(obj) ???ж??
??????????????????? 6 ?????????? false?????????? true??
????· undefined
????· null
????· -0
????· 0??+0
????· NaN
????· ”???????????
????Boolean(undefined) // false
????Boolean(null) // false
????Boolean(0) // false
????Boolean(NaN) // false
????Boolean('') // false
????Function ???
???????????????????????????????????????????
?????????????????????£?
????function test() {
????var a = 1;
????console.log(1);
????}
??????????????????? test ?????? test() ??????????????