首页 > 试题广场 >

下面代码执行结果是 const a = { valueOf(

[单选题]
下面代码执行结果是
const a = {
valueOf() {
return 'valueOf'
},
toString() {
return 'toString'
},
get() {
return 'get'
}
}
alert(a)
  • valueOf
  • toString
  • get
  • [object, Object]

这题考查valueOf()与toString()的区别。

在不重写这两个方法时:

  • toString()方法:返回对象的字符串表示
  • valueOf()方法:返回指定对象的原始值。
默认情况,会调用toString()方法。例如:
var cc = {};
alert(cc);// [object Object]
var fun = function() {} ; 
alert(fun);//  function() {}
var arr = [1];
alert(arr); // 1

从上面的代码来看,默认情况会调用对象的toString()方法,返回对象的字符串表示。

下面看看重写对象的toString()与valueOf()方法,并且同时存在时会发生什么:

var bbb = {
i: 10,
toString: function() {
console.log('toString');
return this.i;
},
valueOf: function() {
console.log('valueOf');
return this.i;
}
}
 alert(bbb);// 10 toString
 alert(+bbb); // 10 valueOf
 alert(''+bbb); // 10 valueOf
 alert(String(bbb)); // 10 toString
 alert(Number(bbb)); // 10 valueOf
 alert(bbb == '10'); // true valueOf
二者并存的情况下,在数值运算中,优先调用了valueOf,字符串运算中,优先调用了toString。而’ '+bbb是字符串操作,为啥也是调用valueOf,那是因为,存在操作符,valueOf的优先级高于toString。

回到本题: alert(obj)不存在数值运算,和其他操作符,所以默认调用toString方法。
结果为:toString。

 


编辑于 2019-12-02 18:17:53 回复(0)
想起了尤大为了不污染array方法,深克隆后自己重写。。。
发表于 2019-12-04 13:17:04 回复(2)