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();//23
复制代码

二、对象转化成数字

需要转化成数字的两种主要情况:
  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
关键字:
50000+
5万行代码练就真实本领
17年
创办于2008年老牌培训机构
1000+
合作企业
98%
就业率

联系我们

电话咨询

0532-85025005

扫码添加微信