视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
js中对象转化成字符串、数字和布尔值方法介绍(示例)
2020-11-27 19:30:33 责编:小采
文档

本篇文章给大家带来的内容是关于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

二、对象转化成数字

需要转化成数字的两种主要情况:

函数里边的参数需要是数字,如: Math.sin(obj) / isNaN(obj) 以及算术运算符: +obj ;

用于比较,如: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

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

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

[] == ![] //true

内部的转化步骤:

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

[]==false;

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

0 == 0

3、结果为true

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

如果有一个操作数是布尔值,则在比较相等性之前先将其转换为数值----false转化为0,true转化为1;

如果有一个数是字符串,另一个操作数是数值,将字符串转化成数值;

如果一个操作数是对象,另一个操作数不是对象,将对象转化为基本操作类型(先valueOf()再toString(),均不能得到基本类型的值则会报错),再比较。

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

若两边都是对象,不会进行类型转换,为同一个引用才会返回true

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

举例,感受下~:
[]==[]//false
[]==false//true
!![]//true
[]==![]//true

总结:

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

字符串输出,使用toString 。

数字:数学函数,操作符,使用valueOf 后使用 toString 。

布尔值:转化为true。

相关推荐:

js中json字符串和json对象互相转化的方法实现

js中json对象和字符串相互转化操作实例

下载本文
显示全文
专题