文档章节

js toString valueOf 隐式调用

appleZ
 appleZ
发布于 2015/04/09 23:35
字数 624
阅读 21
收藏 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 的怪癖 1:隐式类型转换

零:提要 [此贴子是 javascript 的 12 个怪癖(quirks) 系列的第一篇。] JavaScript 是非常宽容的,「来者不拒」,不在乎什么类型。 例如,它如果想要接受数字,它并不拒绝其他类型的值,而...

justjavac
2013/04/18
219
0
javascript 类型隐式转换

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

lifephp
2014/04/30
0
0
关于 == 操作符里的隐式转换2018-08-18

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

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

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

FEWY
2017/08/21
0
0

没有更多内容

加载失败,请刷新页面

加载更多

关于MySQL 通用查询日志和慢查询日志分析

MySQL中的日志包括:错误日志、二进制日志、通用查询日志、慢查询日志等等。这里主要介绍下比较常用的两个功能:通用查询日志和慢查询日志。 1)通用查询日志:记录建立的客户端连接和执行的...

瑞查德-Jack
12分钟前
0
0
Vue组件封装 参数传递和事件传递

参数传递 子组件先定义好接收的参数和事件 <div > {{title}} <div class="row"> <Button icon="md-refresh" @click="refresh()" >刷新</Button> </div>......

Carbenson
17分钟前
0
0
如何在10分钟内设置EOS钱包和帐户?

由于SuperNode超级节点社区建立在EOS之上,我们希望引导我们的社区成员设置EOS钱包和帐户,以便充分参与我们的生态系统。 虽然设置过程可能不如其他区块链系统那么简单,但不要担心。本指南旨...

笔阁
21分钟前
2
0
8.04-Win10非U盘重装系统

注意:最好准备一个你所需版本的秘钥(不能是数字0开头的) 【所需:Win10的ISO镜像、能够解压ISO格式的解压缩工具、最好准备你所需版本的秘钥(不能是数字0开头的)】 1、创建新的文件系统为...

静以修身2025
22分钟前
1
0
Docker的架构与自制镜像的发布

一. docker 是什么 大家都知道虚拟机吧,windows 上装个 linux 虚拟机是大部分程序员的常用方案。公司生产环境大多也是虚拟机,虚拟机将物理硬件资源虚拟化,按需分配和使用,虚拟机使用起来...

程序猿拿Q
38分钟前
12
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部