找回密码
 立即注册
首页 资源区 代码 js中== 的隐式转化问题

js中== 的隐式转化问题

懵诬哇 2025-6-12 13:12:11

  • 如果是数据类型相同,相当于===
  • 如果比较的值类型不同,则会按照下面的规则进行转换后再进行比较。

    • 如果比较的一方是null或者undefined,只有在另一方是null或者undefined的情况下才返回“true”,否则返回“false”。
    • 如果比较的是字符串和数值类型数据,则会将字符串转换为数值后再进行比较,如果转换后的数值相等则返回“true”,否则返回“false”。
    • 如果其中一个值是对象类型,另一个值是基本数据类型或者对象类型,则会调用对象的valueOf()函数或者toString()函数,将其转换成基本数据类型后再作比较,

vlaueOf()以及toString():

  • toString()函数:toString()函数的作用是把一个逻辑值转换为字符串,并返回结果。Object类型数据的toString()函数默认的返回结果是"[object Object]",当我们自定义新的类时,可以重写toString()函数,返回可读性更高的结果。在JavaScript中,Array,Function,Date等类型都实现了自定义的toString()函数。· Array的toString()函数返回值为以逗号分隔构成的数组成员字符串,例如[1,2,3].toString()结果为字符串'1,2,3'。· Function的toString()函数返回值为函数的文本定义,例如(function(x){return x*2;}).toString()的结果为字符串"function(x){return x * 2;}"。· Date的toString()函数返回值为具有可读性的时间字符串,例如,newDate().toString()的结果为字符串"Sun Nov 25 2018 15:00:16 GMT+0800 (中国标准时间)"。
  • valueOf()函数:valueOf()函数的作用是返回最适合引用类型的原始值,如果没有原始值,则会返回引用类型自身。Object类型数据的valueOf()函数默认的返回结果是"{}",即一个空的对象字面量。对于Array、Function、Date等类型,valueOf()函数的返回值是什么呢?· Array的valueOf()函数返回的是数组本身,例如[1, 2, 3].valueOf()返回的结果为“[1,2,3]”。· function的valueOf()函数返回的是函数本身,例如(function(x){return x *2;}).valueOf()返回的结果为函数本身“function(x){return x * 2;}”。· Date的valueOf()函数返回的是指定日期的时间戳,例如new Date().valueOf()返 回的结果为“1543130166771”。如果一个引用类型的值既存在toString()函数又存在valueOf()函数,那么在做隐式转换时,会调用哪个函数呢?这里我们可以概括成两种场景,分别是引用类型转换为String类型,以及引用类型转换为Number类型。
1. 引用类型转换为String类型

一个引用类型的数据在转换为String类型时,一般是用于数据展示,转换时遵循以下规则。· 如果对象具有toString()函数,则会优先调用toString()函数。如果它返回的是一个原始值,则会直接将这个原始值转换为字符串表示,并返回该字符串。· 如果对象没有toString()函数,或者toString()函数返回的不是一个原始值,则会再去调用valueOf()函数,如果valueOf()函数返回的结果是一个原始值,则会将这个结果转换为字符串表示,并返回该字符串。· 如果通过toString()函数或者valueOf()函数都无法获得一个原始值,则会直接抛出类型转换异常。
  1. var arr = [];
  2. arr.toString = function () {
  3. console.log('执行了toString()函数');
  4. return [];
  5. };
  6. arr.valueOf = function () {
  7. console.log('执行了valueOf()函数');
  8. return [];
  9. };
  10. console.log(String(arr));
  11. 执行结果:
  12. 执行了toString()函数
  13. 执行了valueOf()函数
  14. TypeError: Cannot convert Object to primitive value
复制代码
执行String(arr)代码时,需要将arr转换为字符串,则会优先执行toString()函数,但是其返回值为空数组[],并不能转换为原生数据;然后调用valueOf()函数,其返回值同样为空数组[];那么在调用完toString()函数和valueOf()函数后,均无法获取到原生数据类型表示,则抛出异常TypeError,表示无法将对象类型转换为原生数据类型
2. 引用类型转换为Number类型

一个引用类型的数据在转换为Number类型时,一般是用于数据运算,转换时遵循以下规则。· 如果对象具有valueOf()函数,则会优先调用valueOf()函数,如果valueOf()函数返回一个原始值,则会直接将这个原始值转换为数字表示,并返回该数字。· 如果对象没有valueOf()函数,或者valueOf()函数返回的不是原生数据类型,则会再去调用toString()函数,如果toString()函数返回的结果是一个原始值,则会将这个结果转换为数字表示,并返回该数字。· 如果通过toString()函数或者valueOf()函数都无法获得一个原始值,则会直接抛出类型转换异常。我们通过以下代码进行测试。
  1. var arr = [];
  2. arr.toString = function () {
  3.    console.log('执行了toString()函数');
  4.    return [];
  5. };
  6. arr.valueOf = function () {
  7.    console.log('执行了valueOf()函数');
  8.    return [];
  9. };
  10. console.log(Number(arr));
  11. 执行结果:
  12. 执行了valueOf()函数
  13. 执行了toString()函数
  14. TypeError: Cannot convert Object to primitive value
复制代码
执行Number(arr)代码时,需要将arr转换为数字,则会优先执行valueOf()函数,但是其返回值为空数组[],并不能转换为原生数据;然后调用toString()函数,其返回值同样为空数组[];那么在调用完valueOf()函数和toString()函数后,均无法获取到原生数据表示,则抛出异常TypeError,表示无法将对象类型转换为原生数据类型。事实上,对除了Date类型以外的引用类型数据转换为原生数据类型时,如果是用于数据运算,则会优先调用valueOf()函数,在valueOf()函数无法满足条件时,则会继续调用toString()函数,如果toString()函数也无法满足条件,则会抛出类型转换异常。如果是用于数据展示,则会优先调用toString()函数,在toString()函数无法满足条件时,则会继续调用valueOf()函数,如果valueOf()函数也无法满足条件,则会抛出类型转换异常。
备注:摘自于书籍:《Javasript 重难点实例精讲》

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册