valueOf() 简介:
Object.prototype.valueOf(): 方法返回对象的原始值;
JavaScript调用valueOf()方法将对象转换为原始值。你很少需要自己调用valueOf()方法;当遇到要预期的原始值的对象时,JavaScript会自动调用它。
默认情况下,valueOf()方法由Object后面的每个对象继承。每个内置的核心对象都会覆盖此方法以返回适当的值。如果对象没用原始值,则 valueOf()返回对象本身。
不同类型对象的 valueOf 方法的返回值:
JavaScript的许多内置对象都重写了该函数,以实现更合适自身的功能需要。因此,不同类型对象的valueOf()方法的返回值和返回值类型均可能不同。
不同类型对象的valueOf()方法的返回值:
| 对象 | 返回值 |
|---|---|
| Array | 返回数组对象本身。 |
| Boolean | 布尔值。 |
| Date | 存储的时间是从 1970 年 1 月 1 日午夜开始计的毫秒数 UTC。 |
| Function | 函数本身。 |
| Number | 数字值。 |
| Object | 对象本身。这是默认情况。 |
| String | 字符串值。 |
| - | Math 和 Error 对象没有 valueOf 方法。 |
覆盖自定义对象的 valueOf() 方法:
valueOf() 转换 示例:
// Array 返回数组本身
var array = ["ABC", true, 12, -5]
console.log(array.valueOf() === array) // true 返回数组本身
// Date:当前时间距 1970 年 1 月 1 日 午夜的毫秒数
var date = new Date(2022,7,28,16,01,50,50)
console.log(date.valueOf()) // 1661673710050
console.log((new Date("2022-07-28 16:01:50:50")).valueOf()) // 1658995310050
// Number: 返回数值
var num = 15.85
console.log(num.valueOf()) // number 15.85
// 布尔:返回布尔值 true 或者 false
var bool = true
console.log(bool.valueOf()) // true
// new 一个 Boolean 对象
// 不全等,两个值的类型不相等,new Boolean(true)的类型是对象,后者是 基本类型
var newBool = new Boolean(true)
console.log(newBool.valueOf() == newBool) // true
console.log(newBool.valueOf() === newBool) // false false
// Function:返回函数本身
function foo() {}
console.log(foo.valueOf() === foo) // true
var foo2 = new Function("x", "y", "return x + y;");
console.log( foo2.valueOf() )
/*
ƒ anonymous(x,y
) {
return x + y;
}
*/
// Object: 返回对象本身
var obj = {name: "张三", age: 18}
console.log(obj.valueOf() === obj) // true
// String: 返回字符串
var str = "http://www.xxx.com"
console.log(str.valueOf() === str) // true
// new 一个字符串对象
var str2 = new String("http://www.xxx.com")
console.log(str2.valueOf() === str2) // false
valueOf() 和 toString():
对象在参与运算及比较的时候,js引擎会自动帮我们去调用这两个方法.
对象在参与运算及比较;会先调用 valueOf() 方法看看能不能转为 原始值,如果不能转换为 原始值,就会 调用 toString() ;
var array = ["ABC", true, -5];
console.log('["ABC", true, -5] + 1', ["ABC", true, -5] + 1); // 'ABC,true,-51'
// 运算过程
// array.valueOf() ====> 得到Array对象本身,不能转换为 原始值,
// array.toString() ====> 得到 'ABC,true,-5'
'ABC,true,-5' + 1 ====> 得到 'ABC,true,-51'
巧用 valueOf() 转换时间
(new Date('2022-07-28')).valueOf() // 1658966400000
(new Date("Thu Jul 28 2022 08:00:00 GMT+0800 (中国标准时间)")).valueOf() // 1658966400000