1.javaScript会自动跟据期望将值进行转换,比如

2.下面表列出了一些javaScript的自动转换,其中粗体字表示了出乎意料的转换情况

3.显示的类型转换

尽管类型可以自动进行一些转换,但是有时候为了代码的可读性,我们还是需要显示的转换

1.转数字

2.转字符串

注意:除了null和undefined之外,都有toString()方法,和String()效果一样

3.转布尔值

4.转换为对象

除此之外,还有如下转换方式

5.将数值转换为其他进制字符串

6.toFixed()根据小数点后面的指定位数将数字转换为字符串

7.toExponential()使用指数计数法将数字转换为指数形式的字符串,其中小数点只有一位,

小数点后的位数则由参数指定,也就是说有效数字位数比指定位数要多一位

8.toPrecision()根据指定的有效数字位数将数字转成字符串。如果有效数字的位数少于数字的整数部分的位数,则转换成指数形式。

 

9.parseInt()和parseFloat()

其中parseInt()可以接受第二个参数,用于将其他进制的数字转换为十进制

10.对象转化为原始值的两种方法   toString()和valueOf()

关于toString()和valueOf()还要做如下说明,请看如下例子

在浏览器上运行如上的代码,运行结果看起来都是一样的,如下图

那么我们就有一个疑问,这两个方法的区别究竟是什么呢?我们再来看看下面的例子

这个例子印证了我们本节一开始所举得例子,valueOf()方法返回对象本身,日期类除外。

所以为什么我们alert这两种方法的时候得到的结果相同呢?那是因为在alert由valueOf()转换后所返回的数组时间接的调用了tostring()方法而已。

不信请看下面的例子

对于数值,我们可以调用valueOf的时候直接可以获得数字进行计算,不必转化成字符串,所以不会调用toString

反言之,如果我们需要获得操作对象的字符串形式的时候就会调用其toString函数

举个例子

他的文章讲的不是很清楚,为什么在我们重写了代码以后就会出现这样的情况

在这里我说一下我的理解

valueOf的意思是返回最适合该对象类型的原始值,而toString则是将在该对象类型的原始值以字符串形式返回。

第一个:

alert(bbb);// 10 toString

这里我们的alert函数需要是的字符串,所以获取的是字符串,而不是原始值,故而调用了toString

第二个:

  1. <span style="font-family: Arial, Helvetica, sans-serif;">alert(+bbb); // 10 valueOf</span>

同理,alert要的是字符串不是原始值,其实是+bbb这个东西被调用了toString,而bbb被调用了valueOf

为了验证我们这样写

  1. var a = {
  2. i: 1,
  3. valueOf: function () {
  4. alert("你调用了a的valueOf函数");
  5. return this.i;
  6. },
  7. toString: function () {
  8. alert("你调用了a的toString函数");
  9. return this.i;
  10. }
  11. };
  12. var c = {
  13. i: +a,
  14. valueOf: function () {
  15. alert("你调用了c的valueOf函数");
  16. return this.i;
  17. },
  18. toString: function () {
  19. alert("你调用了c的toString函数");
  20. return this.i;
  21. }
  22. };
  23. alert(c);

其中让c=+a,那么即可知道结果,果然如此,调用了a的valueOf和c的toString

第三个:

alert(''+bbb); // 10 valueOf

同理,我们可以把上一段我写的程序里面的c:+a改成c:'’+a

第四个:

  1. alert(String(bbb)); // 10 toString

String这个强制转换其实在其内部是调用了传入参数的toString函数……

第五个:

  1. alert(Number(bbb)); // 10 valueOf

这个是有区别的,因为bbb的i属性是数值类型的,如果i为11111xxxxx这样的字符串,我们就可以看到调用了bbb的toString了

呐,代码例子

  1. var c = {
  2. i: "11111xxxx",
  3. valueOf: function () {
  4. alert("你调用了c的valueOf函数");
  5. return this.i;
  6. },
  7. toString: function () {
  8. alert("你调用了c的toString函数");
  9. return this.i;
  10. }
  11. };
  12. alert(c);

第六个:

alert(bbb == '10'); // true valueOf

这个里面的判等的顺序是,获取原始值,然后判断两边的原始值是否相等,所以调用valueOf

第七个也就是最后一个

alert(bbb === '10'); // false

这个里面的判全等的第一个步骤是判断类型,因为类型都不一样了,所以后面什么都不会调用

在这里我说一下我的理解

valueOf的意思是返回最适合该对象类型的原始值,而toString则是将在该对象类型的原始值以字符串形式返回。

第六个

[javascript] view plain copy

 
  1. alert(bbb == '10'); // true valueOf

这个里面的判等的顺序是,获取原始值,然后判断两边的原始值是否相等,所以调用valueOf

第七个也就是最后一个

[javascript] view plain copy

 
  1. alert(bbb === '10'); // false

这个里面的判全等的第一个步骤是判断类型,因为类型都不一样了,所以后面什么都不会调用

讨论

另外,对于原文的这句话“ 在进行对象转换时(例如:alert(a)),将优先调用toString方法,如若没有重写toString将调用valueOf方法,如果两方法都不没有重写,但按Object的toString输出。”我不是很认同

原文例子

[javascript] view plain copy

 
  1. var aa = {
  2. i: 10,
  3. toString: function() {
  4. console.log('toString');
  5. return this.i;
  6. }
  7. }
  8. alert(aa);// 10 toString
  9. alert(+aa); // 10 toString
  10. alert(''+aa); // 10 toString
  11. alert(String(aa)); // 10 toString
  12. alert(Number(aa)); // 10 toString
  13. alert(aa == '10'); // true toString

我的观点有些不同,重写了的toString会被未重写的其prototype的valueOf隐式调用,而不是优先调用toString。虽然结果不同,但是其实没有优先级的变化。(但是我只能证明重写了的toString会被未重写的其prototype的valueOf隐式调用,却不能证明未重写和重写后的优先级变化读者如果完成了验证请教教我,我的js上周一才开始学。以下是例子)

[javascript] view plain copy

 
  1. var a = {
  2. i: 1,
  3. valueOf: function () {
  4. alert("你调用了a的valueOf函数");
  5. return Object.prototype.valueOf();
  6. },
  7. toString: function () {
  8. alert("你调用了a的toString函数");
  9. return this.i;
  10. }
  11. };
  12. alert(+a);
  13. alert(''+a);

结果的确调用了a的toString和a的valueOf,而我们可以很轻易的从最初的原文例子看到,这两个alert是没有调用国toString的,那么我们即可证明重写了的toString会被未重写的其prototype的valueOf隐式调用。

另一个原文的例子

[javascript] view plain copy

 
  1. var bb = {
  2. i: 10,
  3. valueOf: function() {
  4. console.log('valueOf');
  5. return this.i;
  6. }
  7. }
  8. alert(bb);// [object Object]
  9. alert(+bb); // 10 valueOf
  10. alert(''+bb); // 10 valueOf
  11. alert(String(bb)); // [object Object]
  12. alert(Number(bb)); // 10 valueOf
  13. alert(bb == '10'); // true valueOf

而valueOf被重写以后,这个bb的对象没有toString,自然就会调用其prototype的toString,而那个toString的内容必然是

[javascript] view plain copy

 
  1. function toString() {
  2. return '[object Object]';
  3. }

,所以其实这个验证并没有什么意义。无论重写哪个函数最终的优先级都没变。

 

 

总结

所以那篇的结论并不是最根本的问题,最根本的问题是到底操作对象所处的环境是什么样的。

如果要求的是原始值那么就会调用valueOf,如果要求的是字符串那么就会调用toString。

撒花,完结

javaScript的类型转换的更多相关文章

  1. JavaScript数据类型转换

    原文转自:http://javascript.ruanyifeng.com/grammar/conversion.html#rd JavaScript是一种动态类型语言,变量是没有类型的,可以随时赋予 ...

  2. javascript之类型转换

    JavaScript是一种无类型语言,但同时JavaScript提供了一种灵活的自动类型转换的处理方式.基本规则是,如果某个类型的值用于需要其他类型的值的环境中,JavaScript就自动将这个值转换 ...

  3. JavaScript数据类型转换汇总

    ECMAScirpt中的数据类型:undefined.Null.Boolean.Number.String.Object 对一个值使用typeof操作符可能返回下列某个字符串: number(数字). ...

  4. (五)JavaScript之[类型转换]

    /** * 类型转换 * * JavaScript 数据类型 * 1.不同的数据类型 * string * number * object * boolean * function * * 2.对象类 ...

  5. JavaScript 数据类型转换表

    下表显示了将不同的JavaScript值转换为Number,String和Boolean的结果: 原始值 转换为Number 转换为String 转换为Boolean false 0 "fa ...

  6. JavaScript原始类型转换和进制转换

    1.JavaScript转换包括:强制转换和基本转换 如: var  str = 'A',num=10,nu=null,t=true,und=undefined,x; //注意:定义的x未被初始化:默 ...

  7. JavaScript: 自动类型转换-续

    在上一篇文章中,我们详细讲解了JavaScript中的自动类型转换,由于篇幅限制,没能覆盖到所有的转换规则,这次准备详细讲解一下. 上次我们提到了对象类型参与运算时转换规则: 1). 在逻辑环境中执行 ...

  8. JavaScript: 自动类型转换

    我们都知道,JavaScript是类型松散型语言,在声明一个变量时,我们是无法明确声明其类型的,变量的类型是根据其实际值来决定的,而且在运行期间,我们可以随时改变这个变量的值和类型,另外,变量在运行期 ...

  9. javascript当中类型转换,typeof的用法

    1)类型转换,typeof的用法 例 3.1.1 <HTML><head>    <meta http-equiv="content-type" co ...

随机推荐

  1. .net发布网站步骤

    本文章分为三个部分: web网站发布.IIS6 安装方法.ASP.NET v4.0 安装方法 一.web网站发布 1.打开 Visual Studio 2013 编译环境 2.在其解决方案上右击弹出重 ...

  2. ASP.NET MVC深入浅出系列(持续更新) ORM系列之Entity FrameWork详解(持续更新) 第十六节:语法总结(3)(C#6.0和C#7.0新语法) 第三节:深度剖析各类数据结构(Array、List、Queue、Stack)及线程安全问题和yeild关键字 各种通讯连接方式 设计模式篇 第十二节: 总结Quartz.Net几种部署模式(IIS、Exe、服务部署【借

    ASP.NET MVC深入浅出系列(持续更新)   一. ASP.NET体系 从事.Net开发以来,最先接触的Web开发框架是Asp.Net WebForm,该框架高度封装,为了隐藏Http的无状态模 ...

  3. 30:根据排序标识flag给数组排序

    题目描述:输入整型数组和排序标识,对其元素按照升序或降序进行排序 接口说明 原型: void sortIntegerArray(Integer[] pIntegerArray, int iSortFl ...

  4. 基于RedHat发行的Apache Tomcat本地提权漏洞

    描述 Tomcat最近总想搞一些大新闻,一个月都没到,Tomcat又爆出漏洞.2016年10月11日,网上爆出Tomcat本地提权漏洞,漏洞编号为CVE-2016-5425.此次受到影响的主要是基于R ...

  5. 深入Asyncio(八)异步迭代器

    Async Iterators: async for 除了async def和await语法外,还有一些其它的语法,本章学习异步版的for循环与迭代器,不难理解,普通迭代器是通过__iter__和__ ...

  6. shader学习之一:Properties语义块支持的数据类型

    _Int ("Int",Int)=2为:变量名("面板显示的名称",数据类型) 对于Int,Float,Range这些数字类型的属性,默认值为单独的数字.对于贴 ...

  7. ScrollView分析

    本文转载至 http://blog.sina.com.cn/s/blog_a843a8850101dsg5.html   Properties alwaysBounceHorizontal       ...

  8. UITableView使用指南

    本文转载至 http://blog.csdn.net/yu0089/article/details/8227402 一.概述 UITableView是iOS开发比不可少也是最重要的一个控件类.可以说任 ...

  9. iOS改变UIAlertView、UIActionSheet、UIAlertController系统字体颜色

    废话不多说,直接上代码,效果是最好的说服力 1.改变UIAlertView字体颜色 [UIView appearance].tintColor = [UIColor greenColor]; 个人还是 ...

  10. 性能测试--测试流程、APDEX、linux性能知识

    测试流程.APDEX.linux性能知识 一.性能测试流程: 整体流程:收集需求-->搭建测试环境-->设计性能测试场景-->开发测试脚本-->执行测试-->收集数据-- ...