- 1.JavaScript中valueOf函数方法是返回指定对象的原始值。
使用方法:
object.valueOf( )object是必选项参数是任意固有 JScript 对象。
每个JavaScript固有对象的 valueOf 方法定义不同。
对象 | 返回值 |
---|---|
Array | 数组的元素被转换为字符串,这些字符串由逗号分隔,连接在一起。其操作与 Array.toString 和 Array.join 方法相同。 |
Boolean | Boolean 值。 |
Date | 存储的时间是从 1970 年 1 月 1 日午夜开始计的毫秒数 UTC。 |
Function | 函数本身。 |
Number | 数字值。 |
Object | 对象本身。这是默认情况。 |
String | 字符串值。 |
Math 和 Error 对象没有 valueOf 方法。
基本上,所有JS数据类型都拥有valueOf和toString这两个方法,null除外。它们俩解决javascript值运算与显示的问题。
以上信息转载自脚本之家
2.JavaScript 的 toString() 方法
toString() 方法可把一个逻辑值转换为字符串,并返回结果。3.重写valueOf函数与toString方法
下面是在转载的基础加上一些自己的体会
var aaa = {
i: 10,
valueOf: function () {
console.log('valueOf');
return this.i + 30;
},
toString: function () {
console.log('toString');
return this.valueOf() + 10;
}
};
//给对象aaa定义valueOf()方法toString()方法
//alert(aaa > 20); // true valueOf
//alert(+aaa); // 40 valueOf
//alert(aaa); // 50 toString valueOf
//alert(aaa === '50'); // false
//alert('' + aaa); // 50 valueOf ===========?这个地方目前还不明白,按理说应该是字符串
//================同样被重写,在有操作符的情况下 优先调用valueOf。强等于,不进行隐式的运算,类型不相同就直接false
var aa = {
i: 10,
toString: function () {
console.log('toString');
return this.i;
}
};
//alert(aa);// 10 toString
//alert(+aa); // 10 toString
//alert('' + aa); // 10 toString
//alert(String(aa)); // 10 toString
//alert(Number(aa)); // 10 toString
//alert(aa == '10'); // true toString
//==============valueOf没有被重写,走的是被重写的toString。重写能提高优先级
//Object.prototype.valueOf = null;
//Object.prototype.toString = null;
var bb = {
i: 10,
valueOf: function () {
console.log('valueOf');
return this.i;
}
}
//alert(bb);// [object Object]
//通过赋空Object.prototype.toString方法说明刚才走的是Object.prototype.toString
//当只有重写valueOf时,没有运算符的情况下
//Object.prototype.toString的优先级最高其次是Object.prototype.valueOf,重写的toString,最后才是重写的valueOf
//console.info(bb);// Object { i=10, valueOf=function()}
//很明显,不管是哪个方法,最后输出的是一个对象,没有执行console.log('valueOf');。
//可能是console不进行隐式运算。
//alert(+bb); // 10 valueOf
//有运算符时还是重写的valueOf优先级最高
//alert('' + bb); // 10 valueOf
//alert(String(bb)); // [object Object]
//只有重写valueOf时,String()转换,优先级又有了变化
//先走的是Object.prototype.toString、重写的valueOf、Object.prototype.valueOf
//alert(Number(bb)); // 10 valueOf
//alert(bb == '10'); // true valueOf
综上所述:
重写能提高优先级,在有运算符的情况下,
重写的valueOf
要比重写的toString
优先级高。强运算不进行隐式转换。
但是, 当只有
重写valueOf
的时候 优先级有很大的变化:
1.没有运算符的情况下
优先级从最高到最低依次是:
Object.prototype.toString
、Object.prototype.valueOf
、最后才是重写的valueOf
2.有运算符时还是重写的
valueOf
优先级最高3.String()时
见上例alert(String(bb));
,
优先级依次是
Object.prototype.toString
、
重写的valueOf
、
Object.prototype.valueOf
以上部分信息参考司徒正美的博客-valueOf与toString方法研究
有关
date.toString()
,date.valueOf()
的问题
可以参考 valueOf与toString方法研究2
[] == ![] //答案为true,注意非[] !== []
[] ==> [].valueOf() ==> '';
![] ==> false
'' == false ==> true!!