JS隐式转换与类型比较

news/2024/11/30 9:30:43/

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

至此,是不是理解的更深了,领悟了以后面对各种类型判断都无需紧张了!


http://www.ppmy.cn/news/179110.html

相关文章

starram内存条怎么样_starram内存牌子_星存内存条

我的电脑是星存(StarRam)内存条,512 DDR400 可看网上说有散热片的是假的? 请问是这样的吗? 假的和真的性能差别大不大??前天加了条内存,是黑金刚521 DDR400的, 可是安电脑里就不对了,倒是比以前快了,可是IE总出错,下载东西用迅雷一直自动关闭,重装系统干脆连硬盘都找不到了…

数据结构与算法 -- 再论递归

之前在总结函数的时候,有介绍过递归。参看:C语言再学习 -- 函数 正在看数据结构与算法分析,开篇就讲到递归,那现在就详细讲解下它吧。 参看:递归函数理解 一、什么是递归函数 (1)递归函数即自…

为什么 VS Code 会这么牛逼?

点击上方“码农突围”,马上关注,每天早上8:50准时推送 真爱,请置顶或星标 来自公众号码农翻身 | 作者:李少侠 链接 : zhuanlan.zhihu.com/p/35303567 Visual Studio Code(VS Code)近年来获得了…

数据库之战 | 寻找你心中的数据库漫威英雄

戳蓝字“CSDN云计算”关注我们哦! 技术头条:干货、简洁、多维全面。更多云计算精华知识尽在眼前,get要点、solve难题,统统不在话下! 作者:S.L.Cloud 转自:京东云开发者社区 《复仇者联盟4-终局之…

Google黑科技:USB Accelerator —— EDGE TPU CORROCESSOR

最近玩了玩google的一个“黑科技”,名字叫:Edge TPU Accelerator(边缘TPU加速器)。一个支持TensorFlow Lite,有USB Type-C连接器的神经网络协处理器。其目标是让更多人能学习、探索并体验人工智能,感受AI带…

LeetCode 2559 统计范围内的元音字符串数

LeetCode 2559 统计范围内的元音字符串数 来源:力扣(LeetCode) 链接:https://leetcode.cn/problems/count-vowel-strings-in-ranges/description/ 博主Github:https://github.com/GDUT-Rp/LeetCode 题目:…

使用vscode搭建Linux开发编辑环境

目录 使用vscode搭建Linux内核源码阅读环境使用vscode编写Linux驱动程序 使用vscode搭建Linux内核源码阅读环境 主要按照使用VSCode进行linux内核代码阅读和开发这篇教程搭建环境,主要步骤如下: vscode连接远程服务器,教程可参考利用VScode连接远程服务…

表情识别(从原理到代码安装)

1. 项目介绍 面青识别(face_classification )是一个基于深度学习的面部表情识别项目,它使用 Keras 和 TensorFlow 框架来实现模型的训练和预测。该项目的主要目标是在图像或视频中检测并识别人脸表情,并将其分类为七种不同的情绪类别:生气、厌恶、害怕、高兴、平静、伤心…