文档章节

js toString valueOf 隐式调用

appleZ
 appleZ
发布于 2015/04/09 23:35
字数 624
阅读 18
收藏 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
深圳
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
【JavaScript基础系列】决定你的人生能走多远的,是基础。

前言    javaScript门槛非常低,一点语法,一个dom,一个bom就可以使用它开发大部分js应用,再加上现在层出不穷的框架极大的简化抽象了javaScript的使用方式,但是我们始终不能忘记的一点...

grootzhang
2017/09/12
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Ubuntu18.04 显卡GF-940MX安装NVIDIA-390.77

解决办法: 下面就给大家一个正确的姿势在Ubuntu上安装Nvidia驱动: (a)首先去N卡官网下载自己显卡对应的驱动:www.geforce.cn/drivers (b)下载后好放在英文路径的目录下,怎么简单怎么来...

AI_SKI
今天
0
0
深夜胡思乱想

魔兽世界 最近魔兽世界出了新版本, 周末两天升到了满级,比之前的版本体验好很多,做任务不用抢怪了,不用组队打怪也是共享拾取的。技能简化了很多,哪个亮按哪个。 运维 服务器 产品 之间的...

Firxiao
今天
0
0
MySQL 8 在 Windows 下安装及使用

MySQL 8 带来了全新的体验,比如支持 NoSQL、JSON 等,拥有比 MySQL 5.7 两倍以上的性能提升。本文讲解如何在 Windows 下安装 MySQL 8,以及基本的 MySQL 用法。 下载 下载地址 https://dev....

waylau
今天
0
0
微信第三方平台 access_token is invalid or not latest

微信第三方开发平台code换session_key说的特别容易,但是我一使用就带来无穷无尽的烦恼,搞了一整天也无济于事. 现在记录一下解决问题的过程,方便后来人参考. 我遇到的这个问题搜索了整个网络也...

自由的开源
今天
2
0
openJDK之sun.misc.Unsafe类CAS底层实现

注:这篇文章参考了https://www.cnblogs.com/snowater/p/8303698.html 1.sun.misc.Unsafe中CAS方法 在sun.misc.Unsafe中CAS方法如下: compareAndSwapObject(java.lang.Object arg0, long a......

汉斯-冯-拉特
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部