JS隐式转换与类型比较

这篇具有很好参考价值的文章主要介绍了JS隐式转换与类型比较。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

JS隐式转换与类型比较

隐式转换

隐式转换(Implicit Conversion)是指在表达式求值或操作中自动发生的类型转换。当使用不同的数据类型进行操作时,JavaScript 会自动进行类型转换以满足操作的要求。

隐式转换在编写逻辑时经常会出现,特别是在需要进行判断的逻辑场景中。举个例子:

// 字符串和数字
var num = 42;
var str = "The answer is " + num; // 字符串拼接
console.log(str); // 输出 "The answer is 42"
var result = "3" - "1"; // 数字运算
console.log(result); // 输出 2

// 布尔值
if (1) {
console.log("条件为真"); // 1 被隐式转换为 true
}
var bool = !0; // 数字 0 被隐式转换为 false
console.log(bool); // 输出 false

需要注意的是,隐式转换虽然可以简化代码编写,但有时也可能导致意外的行为和错误。因此,当涉及类型转换时,建议使用显式转换(如 Number()、String()、parseInt() 等)来明确表达意图,使代码更加可读和可维护。

类型比较

一、基本数据类型的比较(String/Number/Boolean/undefined/null)

  • 第一步,将当前的变量值转换为Number类型的值
  • 第二步,将转换后的变量值进行比较
'23' == 23; // -> 23 == 23 -> true
'0' == false; // -> 0 == 0 -> true
'0' == undefined; // -> 0 == NaN -> false
'asd' == null; // -> NaN == NaN -> false

需要注意的是,不能转换为数字的值 / undefined / null最终都会变成NaN,而NaN是不等于任何值的,包括它自己。

二、引用数据类型的比较(Object/Array)

此类数据类型的比较通常是判断指针的地址是否指向同一片内存空间,如果是的话则会返回true。

const arr = [1, [2, 3], 4];
const copy1 = arr[1];
const copy2 = arr[1];
const copy3 = [2, 3];

copy1 == copy2; // true
copy1 == copy3; // false

三、基本数据类型和引用数据类型之间的比较

  • 第一步:将引用数据类型的数据转换
  • 第二步:将转换后的数据与基本数据类型进行比较

在第一步中,会先调用引用数据类型变量的valueOf方法,期待返回一个标量,如果没有返回标量,则继续执行数据的toString方法。将执行toString方法后得到的返回值与基本数据类型变量进行比较。

const arr = [1];
arr == 1; // 猜测一下返回什么
// 调用valueOf方法,期待返回标量
arr.valueOf(); // [1]
// 返回的不是标量,继续执行toString方法,获取返回值
arr.toString(); // '1'

// 最后的比较就变成了如下
// 相当于变成了基本数据类型的比较
'1' == 1; // -> 1 == 1 -> true

再来深入理解一下

const arr = [0];
arr == false;

arr.valueOf(); // [0]
arr.toString(); // '0'

'0' == false; // -> 0 == 0 -> true 

再使用对象试试

const obj = { a: 1 };
obj == true;

obj.valueOf(); // { a: 1 }
obj.toString(); // '[object Object]'

// 最后的比较变成了如下代码
'[object Object]' == true; // -> NaN == 1 -> false

当然,如果对象返回了标量,结局就不同了。

const obj = {
  a: 1,
  valueOf: () => 32
};
obj == '32';

// 返回了标量32,不再执行toString方法
obj.valueOf(); // 32

// 最后的比较变成了如下代码
32 == '32'; // -> 32 == 32 -> true

至此,是不是理解的更深了,领悟了以后面对各种类型判断都无需紧张了!文章来源地址https://www.toymoban.com/news/detail-469346.html

到了这里,关于JS隐式转换与类型比较的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【C语言】你不知道的隐式类型转换规则

    🎈个人主页:库库的里昂 🎐CSDN新晋作者 🎉欢迎 👍点赞✍评论⭐收藏 ✨系列专栏C语言初阶、代码小游戏 🤝希望作者的文章能对你有所帮助,有不足的地方请在评论区留言指正,大家一起学习交流!🤗 【前言】 本文接着C语言中的操作符(万字详解)讲解隐式类型转换规

    2024年02月14日
    浏览(39)
  • 【c++】类和对象(六)深入了解隐式类型转换

    🔥个人主页 : Quitecoder 🔥 专栏 : c++笔记仓 朋友们大家好,本篇文章我们来到 初始化列表,隐式类型转换以及explicit的内容 在创建对象时,编译器通过调用构造函数,给对象中各个成员变量一个合适的初始值 虽然上述构造函数调用之后,对象中已经有了一个初始值,但是

    2024年04月13日
    浏览(47)
  • Java核心知识点1-java和c++区别、隐式和显示类型转换

    java和c++区别 java通过虚拟机实现跨平台特性,但c++依赖于特定的平台。 java没有指针,它的引用可以理解为安全指针,而c++和c一样具有指针。 java支持自动垃圾回收,而c++需要手动回收。 java不支持多重继承,只能通过实现多个接口来达到相同目的,而c++支持多继承。  隐式(

    2024年02月03日
    浏览(46)
  • c++中static静态成员变量和静态成员函数、explcit和隐式类型转换、友元函数()详解

    声明为 static 的类成员 称为 类的静态成员 ,用 static 修饰的 成员变量 ,称之为 静态成员变量 ;用 static 修饰 的 成员函数 ,称之为 静态成员函数 。 静态成员变量一定要在类外进行初始化   静态成员 为 所有类对象所共享 ,不属于某个具体的对象,存放在静态区   静态成

    2024年02月04日
    浏览(49)
  • 【C语言】表达式求值相关问题汇总—>隐式类型转换(整型提升)、算数转换与操作符优先级汇总(收藏查阅)

     👀 樊梓慕: 个人主页   🎥 个人专栏: 《C语言》《数据结构》《蓝桥杯试题》 🌝 每一个不曾起舞的日子,都是对生命的辜负。 目录 前言: 一、隐式类型转换 (一)整型提升的意义 (二)如何进行整型提升呢? 二、算数转换 三、操作符的属性 (一)操作符优先级汇

    2024年02月16日
    浏览(42)
  • 【C++】类和对象④(类的默认成员函数:取地址及const取地址重载 | 再谈构造函数:初始化列表,隐式类型转换,缺省值)

    🔥 个人主页: Forcible Bug Maker 🔥 专栏: C++ 目录 前言 取地址及const取地址操作符重载 再谈构造函数 初始化列表 隐式类型转换 explicit 成员变量缺省值 结语 本篇主要内容:类的六个默认成员函数中的 取地址 及 const取地址重载 , 构造函数 初始化列表 , 隐式类型转换

    2024年04月26日
    浏览(47)
  • JS类型转换

    JS中的类型转换方式一般分为三类:转为String型,转为数字型,转为布尔型。 一.转为String型 1.toString() 通过变量.toString()可以将其他类型的变量转换为字符串型(null和undefined没有toString()方法) 2.String() 这种方法为强制转换(null和undefined通过这个方法可以成功转换为字符串类

    2024年02月07日
    浏览(30)
  • JS基础-数据类型转换

    JS存在不同的数据类型, 这就需要一些方法将不同的数据类型做转换。 其他类型的值转换成数字, 这在工作中很常见。 有以下几种转换方式 Number 函数 parseInt 函数 parseFloat 函数 Number 函数可以将 其他类型转成 数字类型,具体示例如下 字符串转数字 布尔转数字 undefined 和 nu

    2024年02月09日
    浏览(42)
  • JavaScript基础:js介绍、变量、数据类型以及类型转换

      目录 介绍 引入方式 内部方式 外部形式 注释和结束符 单行注释 多行注释 结束符 输入和输出 输出 输入 变量 声明 赋值 变量名命名规则 常量 数据类型 数值类型 字符串类型 布尔类型 undefined 类型转换 隐式转换 显式转换 Number 📖引入方式 JavaScript 程序不能独立运行

    2024年04月27日
    浏览(43)
  • Scala 如何调试隐式转换--隐式转换代码的显示展示

    在需要隐式转换的地方,把需要的参数显示的写出。 在terminal中 利用 scalac -Xprint:typer xxx.scala 方法打印添加了隐式值的代码示例。 对于复杂的工程来说,直接跑到terminal执行 scalac -Xprint:typer xxx.scala 会报很多库不存在的错误。 可在idea的设置中,找到如下配置,写入 -Xprint:ty

    2024年02月12日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包