作者:077是个好姑娘 | 来源:互联网 | 2024-11-01 12:22
在JavaScript中,对象可以被转换为字符串、数字或布尔值。具体而言,对象转换为字符串时,若对象定义了`toString`方法,则会调用该方法并返回相应结果。大多数情况下,这一过程会自动执行,因为所有对象都继承了`toString`方法。此外,对象转换为数字时,会先尝试将其转换为字符串,再进行数值解析。对于布尔值的转换,非空对象通常会被视为`true`,而空对象则被视为`false`。这些转换规则在实际开发中非常有用,能够帮助开发者更好地处理不同类型的数据。
js中对象可以转化成 字符串、数字、布尔值
一、对象转化成字符串:
规则:
1、如果对象有toString方法,则调用该方法,并返回相应的结果;(代码通常会执行到这,因为在所有对象中都有toString方法)
2、如果对象有valueOf方法,则调用该方法,并返回相应的结果;
3、否则抛出异常。
通常,所有对象toString方法,内置对象都有自己toString
实现
alert( {key: 'value'} ) // toString for Objects outputs: [object Object]
alert( [1,2] ) // toString for Arrays lists elements "1,2"
alert( new Date ) // toString for Dates outputs the date as a string
在界面输出中, 比如 alert() 和 document.write() ,将优先调用 toString,如果过得不到 标量 或 undefined、null ,再尝试 valueOf ,如果仍然返回对象则报错。
其实 parseInt()、 alert()、 document.write() 这些函数的调用中,参数所进行的类型转换,应当视为"被动的" , 是函数的实现方式使之优先调用 toString, 而非数据对象自动调用 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 |
创建一个Boolean对象,它内部的初始值为传入的参数值 |
Object |
对象本身 |
可以重写对象的valueOf()方法:
var obj = {
valueOf: function(){
return 1;
}
};
console.log(obj == '1');//true
三、对象转化成布尔值:
对象在JS中总是返回true
但是, a == b
,但在布尔上下文中, a
是true
, b
是false,这是可能的
。
[] == ![] //true
内部的转化步骤:
1、右边是![],将会被转换成一个布尔值,[]为true,取非为false,此时表达式变成:
[]==false;
2、左边是数组,右边是布尔值,按照规则,将false转换成0,数组也将进行数字转换,转换为0
0 == 0
3、结果为true
补充:== 和!=判断规则(注意===和!==不会进行类型转换)
- 如果有一个操作数是布尔值,则在比较相等性之前先将其转换为数值----false转化为0,true转化为1;
- 如果有一个数是字符串,另一个操作数是数值,将字符串转化成数值;
- 如果一个操作数是对象,另一个操作数不是对象,将对象转化为基本操作类型(先valueOf()再toString(),均不能得到基本类型的值则会报错),再比较。
在Javascript中有三个转换,这取决于具体情况:
- 字符串输出,使用
toString
。
- 数字:数学函数,操作符,使用
valueOf
后使用 toString
。
- 布尔值:根据下表转换。
原始类型和对象类型转换成String:转换成Number转换成Boolean转换成Objectundefined"undefined"NaNfalsethrows TypeErrornull"null"0falsethrows TypeErrortrue"true"1 new Boolean(true)false"false"0 new Boolean(false)"" (empty string) 0falsenew String("");Object("")"1.2" (nonempty, numeric) 1.2truenew String("1.2");Object("1.2")"one" (nonempty, non-numeric) NaNtruenew String("one");Object("one")0"0" falsenew Number(0);Object(0)-0"0" falsenew Number(-0);Object(-0)NaN"undefined" falsenew Number(NaN);Object(NaN)Infinity"Infinity" truenew Number(Infinity);Object(Infinity)-Infinity"-Infinity" truenew Number(-Infinity);Object(-Infinity)1 (finite, non-zero)"1" truenew Number(1);Object(1){} (any object) NaNtrue [] (empty array)""0true [9] (1 numeric elt)"9"9true ['a'] (any other array)use join() methodNaNtrue function(){} (any function"undefined"NaNtrue