从名称上判断,toString()将对象转换为字符串,valueOf将对象转化为值,这两个函数是Object类的对象生来就拥有的,而且他们还可以允许我们重写,那么,这两个函数到底有什么用呢?
toString和valueOf这两个函数,是解释器用来帮我们自动完成类型之间的转换(一般是对象到基本类型的转换
- 请用javascript语言实现, var a= add(1)(2)(3)(4)(5);
第一步:首先, 我们要了解一个知识点: 函数的 toString()方法当我们直接alert() 一个函数的时候会被调用。
第二步:我们现在对函数 s 定义一个 toSting() 方法
第三步:好的,现在我们来给这个 s 函数包裹上一层"外套"
包裹了一层后,返回值为一个函数,这样就形成了一个闭包。 这样,我们在调用 add(3) 的时候,返回值其实是一个函数, 里面的 s 这个函数。
但是,当我们 alert(s(3)) 的时候, 会弹出 3
function add(a){
var sum = a;
function s(b){
sum = sum +b;
return s;
}
s.toString = function(){return sum ;}
return s;
}
console.log(add(1)(2)(3)(4)); //10
//执行add(1)(2);
这里面相当于 把 2 传递给 s()函数里面的 b
让作用域(原型链)里面的 a = a+b ,此时 a = 3, 继续保存在作用域中了
然后还是返回 s 函数。
s函数是闭包函数,如果不去销毁,其内存一直保留
什么时候调用 valueOf 和 toString?
对象在作为操作数时,解释器总是优先调用valueOf()–(Date类型的对象在二元“+”运算时例外),而其他情况,解释器总是认为我们想要的是字符串,所以会优先调用toString()。
注:Date类型的对象之所以会在二元+运算时优先调用toString(),也是因为我们大多数情况下, 时间总是和字符串连接使用,而时间和一个数字相加的情况好少,所以Date类型中,toString()优先级才比较 高
var x="10";
var a=+x;
console.log(typeof a); //number "+"号作为一元运算符
var b=a+x;
console.log(typeof b); //string "+"号作为二元运算符
柯里化
是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数而且返回结果的新函数的技术
add(1)(1,2,3)(2)=9 这样的形式
function add(){
var args = [...arguments];
var fn=function(){
args.push(...arguments);
return fn
};
fn.toString=function(){
return _args.reduce(function (a, b) {
return a + b;
});
};
return fn
}
consolo.log(add(1)(1,2,3)(2)) // 9