2017.3.27 toString() toValue() 好的知识点

对象的原始值为字符串,数字,布尔,undefined,null五类,不包括原始类型的另外两类object 与symbol

Object.prototype.valueOf()

用 MDN 的话来说,valueOf() 方法返回指定对象的原始值。
JavaScript 调用 valueOf() 方法用来把对象转换成原始类型的值(数值、字符串和布尔值)。但是我们很少需要自己调用此函数,valueOf 方法一般都会被 JavaScript 自动调用。

Object.prototype.toString()
toString() 方法返回一个表示该对象的字符串。
每个对象都有一个 toString() 方法,当对象被表示为文本值时或者当以期望字符串的方式引用对象时,该方法被自动调用。

当Object.prototype.valueOf() 与Object.prototype.toString() 返回值不是上述三类(字符串,数字,布尔)的话,可能要报错Cannot convert object to primitive value(因为会把返回值调用ToPrimitive方法。但是因为返回值不为原始类型,不能转换,所以报错)
举个栗子:
var obj = {
   toString: function() {
         console.log('调用了 obj.toString');
           return {};
      },
     valueOf: function() {
         console.log('调用了 obj.valueOf')
         return '110';
     }
  }  
alert(obj+1)
// alert(obj+'1')
当对象参与运算时,
如果valueOf能返回原始类型的值,会调用 valueOf方法,不调用toString方法,用valueOf的返回值参与运算;
如果valueOf不能返回上述三类(字符串,数字,布尔原始值的话,valueOf 与toString 都会调用。此时会看toString 的返回值。如果toString能返回三类(字符串,数字,布尔原始值,会利用toString的返回值。
如果toString 与 valueOf都不能返回上述三类(字符串,数字,布尔原始类型的话,toString 与 valueOf 都会调用,但是对应的返回值不用调用。同时会报错Cannot convert object to primitive value

另外函数的栗子:
function test(){
  alert(“hello world”
}
test; // 此时会返回 function test(){
                             alert("hello world")
                           }
是因为执行test,此时调用的是test.valueOf()。
执行test.valueOf() ,返回function test(){
              alert(“hello world”
             }


posted @ 2017-03-27 18:18  a fine day  阅读(210)  评论(0)    收藏  举报