首页 > 其他分享 >toString()和valueOf的区别

toString()和valueOf的区别

时间:2022-10-23 21:00:08浏览次数:96  
标签:object console log 区别 valueOf toString call

说明

  • toString()
  • valueOf()

这两个方法几乎出现在js中所有类型对应的内置对象的原型上(null和undefined除外),它们的出现解决了值运算的问题,但也出现了隐式转换这个让人头疼的问题。

toString()

返回一个表示当前值的特殊字符串,当对象表示为文本或以期望字符串被调用时,toString()方法会自动调用,比如用console.log()或者alert()方法输出值时,就会自动调用该方法,在进行值比较时,也可能触发该方法,也有可能触发valueOf方法,关于何时触发这两个方法,下文会进行介绍。

<script>
       <script>
        var str = "1";
        var num = 1;
        var boolean = true;
        var obj = {};
        var func = function() {}
        console.log(str.toString()); //1
        console.log(num.toString()); //1
        console.log(boolean.toString()); //true
        console.log(obj.toString()); //["object Object"]
        console.log(func.toString()); //function(){}
    </script>

js中许多的类型对象上都重写了Object原型上的toString方法,我们还发现,当对象调用toString()时,它会返回一个表示当前值类型的字符串,它直接调用了Object原型上的toString。

比较对象
typeof 可以用来判断基本类型变量的类型(null除外,null会返回object,这是js历史遗留问题),当我们用typeof来比较对象时,发现并行不通,因为它都会返回一个object,比如当我们运用深拷贝copy对象时,就不能准确地判断出数组和对象,并做出相应的处理,因为它们都会返回一个object。
object原型上的toString方法,可以返回一个表示值类型的一个字符串,那么我们就可以使用object原型上的toString方法来判断对象。

  <script>
        var toString = Object.prototype.toString

        toString.call(1) // '[object Number]'
        toString.call('1') // '[object String]'
        toString.call(false) // '[object Boolean]'
        toString.call(() => {}) // '[object Function]'
        toString.call([]) // '[object Array]'
        toString.call({}) // '[object Object]'
        toString.call(null) // '[object Null]'
        toString.call(undefined) // '[object Undefined]'
        toString.call(new Date()) // '[object Date]'
        toString.call(window) // '[object Window]'
        toString.call(Math) // '[object Math]'
    </script>

运算操作时带来的隐式转换问题

var c = [1, 2, 3]
var d = {a:2}
console.log(2 + 1)  // 3
console.log('s')    // 's'
console.log('s' + 2)  // 's2'
console.log(c < 2)  // false        (一次 => 'Array')
console.log(c + c)  // "1,2,31,2,3" (两次 => 'Array')
console.log(d > d)  // false        (两次 => 'Object')

数组原型上重写了toString方法,它会把数组用join(",")方法分割,输出字符串。
toString()重写

    <script>
        String.prototype.toString = function() {
            var num = 1;
            return `myString${num}`;
        }
        var str = "2"
        console.log(str.toString()); //myString1
    </script>

valueOf()

返回当前包装对象的原始值。
这个 API 通常是由 JavaScript 引擎内部调用,开发者一般情况下不会使用,其功能和 toString 大同小异。
二者区别
共同点:两者都是在值运算的时候会自动调用,从而触发隐式转换
不同点:默认返回值不同,并且存在调用优先级关系
在二者并存的情况下,数值运算时优先使用 valueOf ,字符运算时优先使用 toString 。

class A {
  construtor(num) {
  this.num = num
  }
  
  valueOf() {
    return this.num
  }
  
  toString() {
    return `我好有钱:${this.num}`
  }
}

const a = new A(100)

console.log(String(a)) // '我好有钱:100'             -> toString
console.log(Number(a)) // 100                       -> valueOf
console.log(a + '22') // '10022'          -> valueOf
console.log(a == 100) // true            -> valueOf
console.log(a === 100) // false,全等不触发隐式转换

总结
总结可以发现,valueOf 更加偏向于运算,toString 更加偏向于调用。
在进行对象运算时,将优先调用 toString 方法,如若没有重写 toString 方法,则会调用 valueOf 方法;如果两个方法都没有重写,则会调用 Object 上面的 toString
当进行强制类型转换时,如果转换成字符串则会调用 toString ,转换成数字则会调用 valueOf
使用运算符进行运算时,valueOf 的优先级高于 toString。
原文链接

标签:object,console,log,区别,valueOf,toString,call
From: https://www.cnblogs.com/zx529/p/16819510.html

相关文章

  • 进程与线程的区别
    什么是进程呢?    操作系统为正在运行的程序提供的抽象,就是所谓的进程(process)。一个进程只是一个正在运行的程序。在任何时刻,我们都可以清点它在执行过程中访问或影响......
  • 进程与线程的区别
    进程:每个进程都有独立的代码和数据空间(进程上下文),进程间的切换会有较大的开销,一个进程包含1--n个线程。(进程是资源分配的最小单位)线程:同一类线程共享代码和数据空间,每个线......
  • 线程和进程的区别
     1.进程和线程的概念 进程计算机的核心是CPU,它承担了所有的计算任务;而操作系统是计算机的管理者,它负责任务的调度、资源的分配和管理,统领整个计算机硬件;应用程序侧是具......
  • 1:进程与线程有什么区别?
    1、线程的基本概念概念:线程是进程中执行运算的最小单位,是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点在运行中必不可少的资源,......
  • 进程与线程的区别
     两者定义不一样,进程是执行中的一段程序,而一个进程中执行中的每个任务即为一个线程,一个线程只可以属于一个线程,但一个进程能包含多个线程。并且线程无地址空间,它包括在进......
  • 进程和线程的区别(超详细)
    进程和线程进程一个在内存中运行的应用程序。每个进程都有自己独立的一块内存空间,一个进程可以有多个线程,比如在Windows系统中,一个运行的xx.exe就是一个进程。线程进......
  • 进程和线程的区别
    进程一个在内存中运行的应用程序。每个进程都有自己独立的一块内存空间,一个进程可以有多个线程。线程进程中的一个执行任务(控制单元),负责当前进程中程序的执行。一个进程......
  • 进程与线程的区别
    线程的基本概念概念:线程是进程中执行运算的最小单位,是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点在运行中必不可少的资源,但它可......
  • 进程与线程的区别
    1、线程的基本概念概念:线程是进程中执行运算的最小单位,是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点在运行中必不可少的资源,但......
  • 进程与线程的区别
    首先来说进程和线程两个全是基本单元,完全是为了操作系统运行程序而存在的。该类系统为了要实现应用程序的并发性处理,就必须要运用该基本单元。因此它们之间有相似处也有区......