js中valueOf()小知识

783 阅读2分钟

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