js中对象可以转化成 字符串、数字、布尔值

一、对象转化成字符串:

规则:

1、如果对象有toString方法,则调用该方法,并返回相应的结果;(代码通常会执行到这,因为在所有对象中都有toString方法)

2、如果对象有valueOf方法,则调用该方法,并返回相应的结果;

3、否则抛出异常。

通常,所有对象都有toString方法,且内置对象都有自己toString方法的实现

alert( {key: 'value'} ) // [object Object]
alert( [1,2] )          // "1,2" 
alert( new Date() )       // "Sat Sep 15 2018 15:58:01 GMT+0800 (中国标准时间)"

在界面输出中, 比如 alert() 和 document.write() ,将优先调用 toString,如果过得不到 标量 或 undefined、null ,再尝试 valueOf ,如果仍然返回对象则报错。
其实 parseInt()、 alert()、 document.write() 这些函数的调用中,参数所进行的类型转换,应当视为"被动的" , 是函数的实现方式使之优先调用 toString, 而非数据对象自动调用 toString。

可以自定义toString()

var obj = {
age:23,
toString:function(){
return this.age;
}
}
obj.toString();//

二、对象转化成数字

需要转化成数字的两种主要情况:
  1. 函数里边的参数需要是数字,如: Math.sin(obj) / isNaN(obj) 以及算术运算符: +obj ;
  2. 用于比较,如:obj == 'John'

PS:下面两种比较不会发生类型转换,

a)在严格比较(===)中,不会发生任何的类型转换,

      b)在非严格比较中,如果参数都是对象,不会发生类型转换,通常,如果两个对象引用统一对象,则返回true. 

转化成数字的规则:

1、如果对象有valueOf方法,则调用该方法,并返回相应的结果;

2、当调用valueOf返回的依然不是数字,则会调用对象的toString方法,并返回相应的结果;

3、否则抛出异常。

对象的valueOf方法返回的是对象本身,而不是字符串(比如数组、函数,它们的valueOf方法是从Object.prototype上继承下来的,默认行为是返回对象本身),所以才会采用toString

对于对象型参与 算术运算和 "==" 运算, 不等于比较元算(> 、<、>=、<=),自动发生数据类型转换,先调用 valueOf ,如果 valueOf 不能返回标量(number、string、boolean) 和 undefined、 null ,

将继续调用 toString, 如果仍然返回对象型数据,报错。

Date 类型的例外: 在 + 和 == 运算中,优先 toString ,这应该是规范对该数据类型的特殊对待。

补充:调用valueOf()的结果:

参数类型   返回结果
Undefined 抛出TypeError异常
Null 抛出TypeError异常
Number 创建一个Number对象,它内部的初始值为传入的参数值
String 创建一个String对象,它内部的初始值为传入的参数值
Boolean 创建一个Boolean对象,它内部的初始值为传入的参数值
Object 对象本身

可以重写对象的valueOf()方法(百度一道面试题,定义一个对象,使obj == '1' ,结果为true):

var obj = {
valueOf: function(){
return 1;
}
};
console.log(obj == '1');//true

三、对象转化成布尔值:

对象在JS中总是返回true

根据上述,对象在相等性判断中如何转变?

在布尔上下文中, atrue , bfalse,a == b这是可能的 。

 [] == ![] //true

内部的转化步骤:

1、右边是![],将会被转换成一个布尔值,[]为true,取非为false,此时表达式变成:

[]==false;

2、按照规则,右边是布尔值,将false转换成0,左边是数组,数组也将进行数字转换,先调用valueOf(),不能转化成原始值,再用toString(),转换为0

0 == 0

3、结果为true

补充 == 和!=判断规则(注意: ===!==  和 对象==对象 这三种情况不会进行类型转换):

  1. 如果有一个操作数是布尔值,则在比较相等性之前先将其转换为数值----false转化为0,true转化为1;
  2. 如果有一个数是字符串,另一个操作数是数值,将字符串转化成数值;
  3. 如果一个操作数是对象,另一个操作数不是对象,将对象转化为基本操作类型(先valueOf()再toString(),均不能得到基本类型的值则会报错),再比较。

所以,对象在相等性判断中:

  • 若两边都是对象,不会进行类型转换,为同一个引用才会返回true
  • 若只有一边为对象,则会先调用对象的valueOf()方法,不能返回基本类型,再调用对象的toString()方法,还是不能就会报错,否则用转化后的基本类型值继续进行判断

举例,感受下~:

[]==[]//false
[]==false//true
!![]//true
[]==![]//true

总结:


在JavaScript中,对象有三个转换,这取决于具体情况:

  1. 字符串输出,使用toString 。
  2. 数字:数学函数,操作符,使用valueOf 后使用 toString 。
  3. 布尔值:转化为true。

js中对象转化成字符串、数字或布尔值的转化规则的更多相关文章

  1. js将对象转成字符串-支持微信

    最近写一个微信项目时用到了 把对象转成字符串,因为我需要把它存在cookie中,碰到了一些问题,在这里分享一下. 要转换的就是这货~ var FBinf = { "workPlacesCod ...

  2. js把其他类型转化成字符串

    js把其他类型转化成字符串 一.总结 一句话总结:类型转换中的强制类型转换分为类型转换函数和类型名强制.js后一种和其它语言不同,是类型类的构造方法.String() 二.js把其他类型转化成字符串 ...

  3. js 将json对象转成字符串

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  4. [转]JS中对象与字符串的互相转换

    原文地址:http://www.cnblogs.com/luminji/p/3617160.html 在使用 JSON2.JS 文件的 JSON.parse(data) 方法时候,碰到了问题: thr ...

  5. JS中对象与字符串的互相转换

    在使用 JSON2.JS 文件的 JSON.parse(data) 方法时候,碰到了问题: throw new SyntaxError('JSON.parse'); 查询资料,大概意思如下: JSON ...

  6. json字符串转换成json对象,json对象转换成字符串,值转换成字符串,字符串转成值

    一.json相关概念 json,全称为javascript object notation,是一种轻量级的数据交互格式.采用完全独立于语言的文本格式,是一种理想的数据交换格式. 同时,json是jav ...

  7. 前台 JSON对象转换成字符串 相互转换 的几种方式

    在最近的工作中,使用到JSON进行数据的传递,特别是从前端传递到后台,前台可以直接采用ajax的data函数,按json格式传递,后台Request即可,但有的时候,需要传递多个参数,后台使用requ ...

  8. js中对象的一些特性,JSON,scroll家族

    一.js中对象的一些特性 对象的动态特性 1.当对象有这个属性时,会对属性的值重写 2.当对象没有这个属性时,会为对象创建一个新属性,并赋值 获得对象的属性的方式 为元素设置DOM0级事件 二.JSO ...

  9. 【转载】js中对象的使用

    原文链接:http://www.jb51.net/article/90256.htm[侵删] 简单记录javascript中对象的使用 一.创建对象 //创建一个空对象 var o={}; //创建一 ...

随机推荐

  1. Linux内存管理学习笔记——内存寻址

    最近开始想稍微深入一点地学习Linux内核,主要参考内容是<深入理解Linux内核>和<深入理解Linux内核架构>以及源码,经验有限,只能分析出有限的内容,看完这遍以后再更深 ...

  2. JDK(六)JDK1.8源码分析【集合】LinkedHashMap

    本文转载自joemsu,原文连接 [JDK1.8]JDK1.8集合源码阅读——LinkedHashMap LinkedHashMap的数据结构 可以从上图中看到,LinkedHashMap数据结构相比 ...

  3. background-position详解

    一.background-position:left top; 背景图片的左上角和容器(container)的左上角对齐,超出的部分隐藏.等同于 background-position:0,0;也等同 ...

  4. Mac 下 SVN 的使用

    在Windows环境中,我们一般使用TortoiseSVN来搭建svn环境.在Mac环境下,由于Mac自带了svn的服务器端和客户端功能,所以我们可以在不装任何第三方软件的前提下使用svn功能,不过还 ...

  5. haproxy原理理解

    1.haproxy使用最需要注意的点: 1.1连接数: 前端maxconn默认值为2000,非常有必要将其增加几倍. 1.2超时时间 timeout connect 60s # haproxy和服务端 ...

  6. 硬盘分区表知识——详解硬盘MBR

    这片文章说得很详细,原文:http://hi.baidu.com/waybq/blog/item/3b8db64bef3dc7f583025c66.html --------------------- ...

  7. 如何使用jquery.qrcode.js插件生成二维码

    1.首先需要准备 jquery.qrcode.js 和 jquery.js github地址:https://github.com/lrsjng/jquery-qrcode 官方文档地址:http:/ ...

  8. UGA,PGA

    tom认为UGA不包含 sort工作区,所以下面的图都是错误的 The UGA is, in effect, your session’s state. It is memory that your ...

  9. Oracle 数据库备份和恢复配置

    可能的失败及其解决方法 失败类型 我们坑你遇到的失败或错误分为两大类:物理和逻辑.物理错误一般是硬件错误或使用数据库的应用程序中的软件错误,而逻辑错误一般在终端用户级别(数据库用户和管理员). 按从轻 ...

  10. lrzsz Linux服务器Windows互传文件工具

    lrzsz是一款在linux里可代替ftp上传和下载的程序,但只限于较小的文件,如果是目录需要打包成单个文件在实现下载. 条件:需要使用SecureCRT或者Xshell等客户端工具连接Linux 下 ...