文档章节

js toString valueOf 隐式调用

appleZ
 appleZ
发布于 2015/04/09 23:35
字数 624
阅读 20
收藏 1

    看了别人写的toString 和 valueOf 觉得写得有点乱,自己总结了一下:

    1.先测一下优先级

Object.prototype.valueOf = function(){
	console.log("valueOf");
	return this.i;
};
Object.prototype.toString = function(){
	console.log("toString");
	return this.i;
};

var aa = {i: 10};
alert(aa);// 10 toString
alert(+aa); // 10 valueOf
alert(''+aa); // 10 valueOf
alert(String(aa)); // 10 toString
alert(Number(aa)); // 10 valueOf
alert(aa == '10'); // true valueOf

    或者:

var aa = {
	i: 10,
	toString: function() {
		console.log('toString');
		return this.i;
	},
	valueOf: function() {
		console.log('valueOf');
		return this.i;
	}
}
alert(aa);// 10 toString
alert(+aa); // 10 valueOf
alert(''+aa); // 10 valueOf
alert(String(aa)); // 10 toString
alert(Number(aa)); // 10 valueOf
alert(aa == '10'); // true valueOf
alert(aa === '10'); // false

    结论:

    操作符情况下或者明显的数值调用情况下 如(Number) 优先调用 valueOf 

    其他情况下优先调用 toString 

    2.分开来看一下,

    2.1、本地对象中只有toString

var aa = {
	i: 10,
	toString: function() {
		console.log('toString');
		return this.i;
	}
}
alert(aa);// 10 toString
alert(+aa); // 10 toString
alert(''+aa); // 10 toString
alert(String(aa)); // 10 toString
alert(Number(aa)); // 10 toString
alert(aa == '10'); // true toString

    全部调用了toString

    也就是说需要调用valueOf的时候,先查找本地,如果没有就调用本地toString;

    2.2、本地对象中只有valueOf

var aa = {
 i: 10,
 valueOf: function() {
  console.log('valueOf');
  return this.i;
 }
}
alert(aa);// [object Object] 
alert(+aa); // 10 valueOf
alert(''+aa); // 10 valueOf
alert(String(aa)); // [object Object] 
alert(Number(aa)); // 10 valueOf
alert(aa == '10'); // true valueOf

   没有全部调用valueOf (过程是需要调用toString的时候,查找本地,没有就去原型中调用

   也就是说需要调用toString的时候,查找本地,如果没有不去本地调用valueOf,而是去原型中查找;

   那么弄哑toString

Object.prototype.toString = null;
var ccc = {
 i: 10,
 valueOf: function() {
  console.log('valueOf');
  return this.i;
 }
}
alert(ccc);// 10 valueOf
alert(+ccc); // 10 valueOf
alert(''+ccc); // 10 valueOf
alert(String(ccc)); // 10 valueOf
alert(Number(ccc)); // 10 valueOf
alert(ccc == '10'); // true valueOf
alert(ccc === '10'); // false

    如果弄哑原型中的toString、原型中也找不到toString,就去调用本地的valueOf(如果本地也没有valueOf,调用        toString时就报错);

    上面看调用valueOf的时候有点特别,那么重写原型valueOf看下

Object.prototype.valueOf = function(){
	console.log("valueOf");
	return this.i;
};
var aa = {
	i: 10,
	toString: function() {
		console.log('toString');
		return this.i;
	}
}
alert(aa);// 10 toString
alert(+aa); // 10 valueOf
alert(''+aa); // 10 valueOf
alert(String(aa)); // 10 toString
alert(Number(aa)); // 10 valueOf
alert(aa == '10'); // true valueOf

    可以看到,重写原型valueOf之后,本地没有valueOf也不会去调用本地的toString,而是会查找原型中的valueOf进行调用;

对于上面的现象猜测有可能调用原生原型valueOf的时候调用toString???暂时没精力研究了。。

ps : 加一小点, 比较操作的时候,任何操作数与NaN比较结果都是false。

© 著作权归作者所有

共有 人打赏支持
appleZ
粉丝 1
博文 38
码字总数 9774
作品 0
深圳
Node.js Interview ---- 类型判断

Node.js Interview ---- 类型判断 基本数据类型: Number,String,Boolean,Undefined,Null,Symbol 复杂数据类型: OBject console.log("aa" == true) // false const a = {i: 1,toString: funct......

Even
10/05
0
0
javascript 类型隐式转换

本文转自life的leanote博客: http://leanote.com/blog/view/5357c38e1a91087246000001 + 什么时候转成数字, 什么时候转成字符串? +单目 转成数字 +双目 转成字符串(除非是数字+数字=数字) 当...

lifephp
2014/04/30
0
0
javascript中对象方法

将对象转换成字符串时: 1.调用对象的toString()方法,将对象转换成返回的字符串,如果方法返回其它基本数据类型,则会自动转换成字符串; 2.如果对象没有toString()方法,或方法返回的不是基...

闵开慧
2013/02/17
0
0
关于 == 操作符里的隐式转换2018-08-18

前言 类型转换在各个语言中都存在,而在 JavaScript 中由于缺乏对其的了解而不慎在使用中经常造成bug被人诟病。为了避免某些场景下的意外,甚至推崇直接使用 Strict Equality( === )来代替 ...

littleyu
08/18
0
0
简单说 通过JS的隐式转换,关键时刻救你一命

说明 JavaScript在比较的时候,会进行隐式转换,你如果对隐式转换不是特别熟悉,结果往往出乎你的意料。 我们来看看这行代码 这行代码的结果可能出乎你的意料,看结果 结果居然是sos,这就是...

FEWY
2017/08/21
0
0

没有更多内容

加载失败,请刷新页面

加载更多

【大福利】极客时间专栏返现二维码大汇总

我已经购买了如下专栏,大家通过我的二维码你可以获得一定额度的返现! 然后,再给大家来个福利,只要你通过我的二维码购买,并且关注了【飞鱼说编程】公众号,可以加我微信或者私聊我,我再...

飞鱼说编程
今天
1
0
Spring5对比Spring3.2源码之容器的基本实现

最近看了《Spring源码深度解析》,该书是基于Spring3.2版本的,其中关于第二章容器的基本实现部分,目前spring5的实现方式已有较大改变。 Spring3.2的实现: public void testSimpleLoad(){...

Ilike_Java
今天
1
0
【王阳明心学语录】-001

1.“破山中贼易,破心中贼难。” 2.“夫万事万物之理不外于吾心。” 3.“心即理也。”“心外无理,心外无物,心外无事。” 4.“人心之得其正者即道心;道心之失其正者即人心。” 5.“无...

卯金刀GG
今天
2
0
OSChina 周三乱弹 —— 我们无法成为野兽

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @ _刚刚好: 霸王洗发水这波很骚 手机党少年们想听歌,请使劲儿戳(这里) hahahahahahh @嘻酱:居然忘了喝水。 让你喝可乐的话, 你准忘不了...

小小编辑
今天
10
0
vm GC 日志 配置及查看

-XX:+PrintGCDetails 打印 gc 日志 -XX:+PrintTenuringDistribution 监控晋升分布 -XX:+PrintGCTimeStamps 包含时间戳 -XX:+printGCDateStamps 包含时间 -Xloggc:<filename> 可以将数据保存为......

Canaan_
昨天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部