js中的valueOf和toString函数

valueOf和toString两个函数 是number、string、boolean、object、symbol原型链上共有的函数(null和undefined两种数据类型没有)

这两个函数主要是用来干什么的呢?
答案是:值运算和显示问题,一般在隐式类型转换时会自动调用

  1. 对number、string、boolean、object、symbol数据类型调用valueOf方法,得到的都是数据本身。
    (null、undefined两种类型的原型上没有valueOf方法)
        var a = 1;
        var aa = a.valueOf();
        console.log(aa == a); //true
        
        var b = 'a';
        var bb = b.valueOf();
        console.log(bb === b); //true
        
        var c = true;
        var cc = c.valueOf();
        console.log(cc === c); //true
        
        var obj = {            
	     name: 'age'
	};
        var objobj = obj.valueOf();
        console.log(obj === objobj); //true
        
        var s = Symbol();
        var ss = s.valueOf();
        console.log(ss === s); //true
  1. 对number、string、boolean、symbol类型数据调用toString方法得到的是对应的字符串;
    对object类型数据调用toString的方法得到的是"[object Object]"。(null和undefined两种数据类型的原型链上没有toString方法)
        var a = 1;
        var aaa = a.toString(); // "1"
        
        var b = 'a';
        var bbb = b.toString(); // "a"
        
        var c = true;
        var ccc = c.toString(); // "true"
        
        var obj = {            
        	name: 'age',
        };
        var objobjobj = obj.toString(); //"[object Object]"        
        
        var s = Symbol();
        var sss = s.toString(); //"Symbol()"

重写valueOf和toString

  1. 只重写valueOf
        var a = {
                    i: 10,
	            valueOf: function() {
	             		console.log('valueOf')                
	            	    	return this.i + 30;
		      		}
        }        
        console.log(a > 20); // valueOf true
        alert(a); // [object Object]
        console.log(a == 20) //value false        
        console.log(String(a)) // [object Object]
        console.log('' + a); //  valueOf 40      
        console.log(++a); // valueOf 41                
        console.log(-a); //  valueOf -41 
        //如果把++a运算放在前面,a就变成number类型,
        //a.toString就不是[object Object],而是数字          

结论:只重写了valueOf方法的话,涉及到值运算优先调用valueOf方法,涉及到显示问题还是优先调用原型链上的toString方法。

  1. 只重写toString
        var aaa = {
                    i: 10,
	            toString: function() {
	                            console.log('toString')               
	                            return this.i + 10;            
	                            }
        }
        alert(aaa); // toString 20
        console.log('' + aaa); //  toString 20        
        console.log(String(aaa)) // toString 20        
        console.log(aaa == 20) //toString true        
        console.log(aaa > 20); // toString false          
        console.log(-aaa); //  toString -20
        console.log(++aaa); // toString 21
        //如果把++aaa运算放在前面,a就变成number类型

结论:只重写了toString方法的话,toString方法比原型链上的valueOf方法优先级高。

  1. 重写valueOf和toString
        var aaa = {
                    i: 10,
                    valueOf: function() {
                                 console.log('valueOf')                
                                 return this.i + 30;            
                                 },
                    toString: function() {
                                 console.log('toString')                
                                 return this.i + 10;
                                 }
        }
        alert(aaa); // toString 20
        console.log(String(aaa)) // toString 20        
        console.log('' + aaa); //  valueOf  40                
        console.log(aaa > 20); // valueOf  true                
        console.log(aaa == 40) //valueOf true        
        console.log(+aaa); //  valueOf  40                
        console.log(++aaa); // valueOf  41
        //如果把++aaa运算放在前面,a就变成number类型

结论:及到操作符的问题,valueOf的优先级比toString的优先级高,涉及到显示问题,toString方法优先级比valueOf方法高。

经典前端面试题
如何能够使得下列的表达式返回true

a == 1 && a == 2 && a == 3;

解法:

        var a = {
                    i: 0,
	            valueOf: function() {                	
			            console.log('valueOf')                
			            return ++this.i;            
			      },
        }
        console.log(a == 1 && a == 2 && a == 3); //true

总结:重写了valueOf方法的话,涉及到值运算优先调用valueOf方法,涉及到显示问题还是优先调用原型链上的toString方法。(重写toString也能起到同样效果)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值