toString()和valueOf()和柯里化

从名称上判断,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
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值