文档章节

js toString valueOf 隐式调用

appleZ
 appleZ
发布于 2015/04/09 23:35
字数 624
阅读 18
收藏 1
点赞 0
评论 0

    看了别人写的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
博文 25
码字总数 9774
作品 0
深圳
JavaScript_数据类型

JavaScript数据类型包括基本数据类型和引用数据类型 基本数据类型:null,undefined,string number,boolean; 引用数据类型:对象类型; 不支持创建自定义类型,所有的变量都是这6种数据类型之一...

2018_ieye ⋅ 01/14 ⋅ 0

怪异的JavaScript系列(三)

译者按: JavaScript有很多坑,经常一不小心就要写bug。 原文: What the f*ck JavaScript? 译者: Fundebug 为了保证可读性,本文采用意译而非直译。另外,本文版权归原作者所有,翻译仅用于学...

Fundebug ⋅ 04/26 ⋅ 0

由Object.prototype.toString.call( )引发关于toString( )方法的思考

引言 前端面试中有这么一道经典的问题,如何判断一个对象是否为数组? ES5提供了一个确定对象是否为数组的函数 其中,object是必须的,表示要测试的对象 但是,当我们考虑到浏览器兼容性问题...

wangpf ⋅ 05/11 ⋅ 0

JavaScript 五种基本数据类型(下)

上篇文章 JavaScript 五种基本数据类型(上)的子妹篇。 如未作出特殊说明,本文例子均在Chrome控制台进行测试。 三、类型转换 显式(强制)类型转换 定义:主要指使用Number、Boolean、Str...

城市中的游牧民族 ⋅ 05/09 ⋅ 0

这一次,我们换种姿势学习 javascript

前言 《你不知道的 javascript》是一个前端学习必读的系列,让不求甚解的JavaScript开发者迎难而上,深入语言内部,弄清楚JavaScript每一个零部件的用途。本书介绍了该系列的两个主题:“作用...

程序员解决师 ⋅ 05/29 ⋅ 0

Javascript数值转换(string,int,json)

数值: 在JavaScript中,数值转换一般有三种方式: 一、Number(param)函数:param可以用于任何数据类型 1.1 param是Boolean值,true和false分别转换为1和0; 1.2 param是数值,只是简单的传入...

easonjim ⋅ 2016/12/27 ⋅ 0

[]==false为什么为true分析,扩展null==0是什么结果

还是时间啊,这个问题3年前,甚至更早,就有人分析过了,现在我只是在追赶别人。。。转行晚啊,少壮不努力,老大徒伤悲啊,真是深有感触 现在把自己弄懂得,记录下来,放在这里,网站不倒,至...

liuchao1987330 ⋅ 2017/12/13 ⋅ 0

JavaScript当中的this究竟是个啥?

对于JS的初学者而言,JS当中的this指向很难让人摸准其脉络,经常会给你一种模糊美、朦胧美的感脚!因为this并不是固定不变的,它会根据自身所执行的环境的不同而不同。而且在开发的过程中,经...

张培跃 ⋅ 06/18 ⋅ 0

【译】为什么需要在 React 类组件中为事件处理程序绑定 this

原文地址:This is why we need to bind event handlers in Class Components in React 原文作者:Saurabh Misra 译文出自:掘金翻译计划 本文永久链接:github.com/xitu/gold-m… 译者:whu...

whuzxq ⋅ 05/15 ⋅ 0

JavaScript 原型及原型链简易理解

1.1 原型。 prototype: 每个函数对象都有自己的prototype属性,这个属性是一个指针,指向对象的原型对象,包含所有实例共享的属性和方法。 通过给原型添加属性和方法来可以给对象添加属性或...

piada ⋅ 05/18 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

前台对中文编码,后台解码

前台:encodeURI(sbzt) 后台:String param = URLDecoder.decode(sbzt,"UTF-8");

west_coast ⋅ 15分钟前 ⋅ 0

VS2015配置并运行汇编(一步一步照图做)【vs2017的链接在最后】

前言 我是上学期学的汇编,因为有vs又不想用课上教的麻烦的dosbox以及masm32,但是一直没找到高亮插件和能调试的(难在运行不了而找不到答案上,出现的错误在最后放出,还请先达们不吝指点)...

simpower ⋅ 25分钟前 ⋅ 0

一起读书《深入浅出nodejs》-node模块机制

node 模块机制 前言 说到node,就不免得提到JavaScript。JavaScript自诞生以来,经历了工具类库、组件库、前端框架、前端应用的变迁。通过无数开发人员的努力,JavaScript不断被类聚和抽象,...

小草先森 ⋅ 28分钟前 ⋅ 0

Java桌球小游戏

其实算不上一个游戏,就是两张图片,不停的重画,改变ball图片的位置。一个左右直线碰撞的,一个有角度碰撞的。 左右直线碰撞 package com.bjsxt.test;import javax.swing.*;import j...

森林之下 ⋅ 35分钟前 ⋅ 0

你真的明白RPC 吗?一起来探究 RPC 的实质

你真的明白RPC 吗?一起来探究 RPC 的实质 不论你是科班出身还是半路转行,这么优秀的你一定上过小学语文,那么对扩句和缩句你一定不陌生。缩句就是去除各种修饰提炼出一句话的核心,而不失基...

AI9o後 ⋅ 36分钟前 ⋅ 0

z-index设置失效?

今天碰到了一个问题,就是在给li设置提示框的时候,有用到遮罩效果,本来想把对应的出现在最顶层,可是不管将li设置的z-index值设为多大,li都没有出现在遮罩层之上。 我在网上查了z-index设...

IrisHunag ⋅ 44分钟前 ⋅ 0

CyclicBarrier、CountDownLatch以及Semaphore使用及其原理分析

CyclicBarrier、CountDownLatch以及Semaphore是Java并发包中几个常用的并发组件,这几个组件特点是功能相识很容易混淆。首先我们分别介绍这几个组件的功能然后再通过实例分析和源码分析其中设...

申文波 ⋅ 47分钟前 ⋅ 0

Java对象的序列化与反序列化

Java对象的序列化与反序列化

Cobbage ⋅ 今天 ⋅ 0

Sqoop

1.Sqoop: 《=》 SQL to Hadoop 背景 1)场景:数据在RDBMS中,我们如何使用Hive或者Hadoop来进行数据分析呢? 1) RDBMS ==> Hadoop(广义) 2) Hadoop ==> RDBMS 2)原来可以通过MapReduce I...

GordonNemo ⋅ 今天 ⋅ 0

全量构建和增量构建的区别

1.全量构建每次更新时都需要更新整个数据集,增量构建只对需要更新的时间范围进行更新,所以计算量会较小。 2.全量构建查询时不需要合并不同Segment,增量构建查询时需要合并不同Segment的结...

无精疯 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部