JavaScript中的toString()和valueOf()

2020-04-02  本文已影响0人  hjwang1024

两者的关系

var arr = [1,2,3];  
alert(Array.isArray(arr.valueOf()));  
alert(Array.isArray(arr.toString()));  

结果是第一个是true而第二个是false,原因是valueOf()调用完以后还是返回一个数组,这个数组被alert的时候会调用toString()函数;所以不是valueOf()和toString()函数相同,而是alert时间接调用了toString()函数!

对象向基本数据类型的转换的规则

1.vauleOf优先于toString()被调用---------当对象作为操作数的时候(Date类型的除外)
var x="10";
var a=+x;
console.log(typeof a);     //number
var b=a+x;
console.log(typeof b);    //string
var object={};
object[a]=10000;
console.log(object[10]);  //10000
var x = {
  toString: function () {
    return '0';
  },
  valueOf: function () {
    return 1;
  }
}
var a = + x;  //到底调用的是toString()还是valueOf()呢?,在 + 号作为二元运算符的部分,会给出解释
console.log(a);
//伪代码,
a + b运算转换规则:
var Pa = toPrimitive(a);
var pb = toPrimitive(b);
if ((Pa is String) || (Pb is String)) {
  return contact(a, b)
}
if ((Pa is Number) && (Pb is Number)) {
  return a+b;
}
 throw error;
 //注: toPrimitive 是将操作数转化为基本数据类型,优先调用valueOf,若得到基本数据类型,则结束,否则继续掉用toString()。(也就是说valueOf的优先级高于toString())
var test = {
   valueOf: function () {
     return 1;
    },
   toString: function () {
     return '0';
    }
}
console.log( + test);   //1
var result = test + test;
console.log(result);  //2
var date=new Date();
console.log(+date);  //仍然优先调用valueOf  
console.log(date+"toString优先被调用");
//输出结果:
// 1421293488713
//Thu Jan 15 2015 11:44:48 GMT+0800toString优先被调用

toString()优先于valueOf()被调用 ------当你想要输出结果是字符串的时候

 1   var test = {
 2   toString: function () {
 3     return '0'
 4   },
 5   valueOf: function () {
 6     return 1;
 7   }
 8 };
 9 
10 var object={};
11 object[test]=1000;
12 console.log(object);  // 输出结果:Object { 0=1000}


[a]以这种形式访问的时候:
var Pa=toPrimitive(a);
  if(Pa is prmitive){
    var str=String(Pa);
    }else{
        throw error;//cannot convert to string
    }
[str]//str为字符串的形式
//注: toPrimitive()此时优先调用toString()函数,若结果为基本类型,返回,否则继续调用valueOf(); 

备注: toLocaleString()这个函数是实现字符串的本地化的输出,一般和toString()输出的结果相同,没什么特殊的,就是一个普通的函数。在Date类型中,这个函数被重写了

转自:https://blog.csdn.net/shaofei63/article/details/42743245

上一篇 下一篇

猜你喜欢

热点阅读