接着旅行:js类型转换与操作符的奥秘
续篇:JavaScript的魔法变形记——类型转换与操作符的奥秘
欢迎回到JavaScript的奥秘之旅,在上一站,我们了解了原始值与对象间显式与隐式转换的秘密。这一次,我们将继续启程,亲自见证每一步转化的奇迹,一起领略这趟旅程的奇妙。希望大家都可以有所收获。✌️
第一站:原始值的华丽转身 —— 显式类型转换的实操
我们可以利用显式转换函数,直接操控原始值的形态,显示类型转换有三类,转布尔、转数字、转字符串。现在,让我们在实践中加深理解。
-
转布尔:将其他基本类型转换为布尔类型,
Boolean()
就是手段。let n = 123 let f = false console.log(Boolean(n),Boolean(f)); // true false
这里,使用
Boolean
方法,将数字类型和布尔类型转换为布尔类型,体现了从原始值到布尔型的直接转变。 -
转数字:在财务计算中,或许我们需要将用户输入的任何形式的数字字符串转换为数值处理,就可以使用
Number()
。let num = "99.99"; console.log(Number(num);) // 99.99
通过
Number
,轻松实现从字符串到数字的跨越。 -
转字符串:在构建动态UI时,需要使用
String()
,来确保所有数据都能以文本形式展示。let userAge = 28; document.getElementById("age").innerText = String(userAge); // "28"
使用
String
,任何原始值都能被赋予文本的意义。💡其实有各种各样的情况可能出现,这些内容大家有个大概的思路就行,实在是不知道就去看一眼。这里随意给一个链接,忘了看一下就好了。www.cnblogs.com/jc2182/p/11…
补给站:toString
的多样化应用
-
普通对象:通过
Object.prototype.toString.call({})
,得到"[object Object]"
,这是对象类型的通用标签。 -
数组实例:利用
Array.prototype.toString()
,数组内容被巧妙串联,返回一个由数组内部的元素以逗号拼接的字符串。console.log([1, 2, 3].toString()); // 输出 "1,2,3"
数组元素被逗号分隔,形成简洁的字符串表示。
-
其他对象:其他数据类型的
toString
方法,统统都是返回一个字符串字面量,随意举个例子看看就清楚了。let num = 123 console.log(num.toString()); // "123"
不只是数字,除去上面的两大类之外其他任何数据类型的
toString
方法都是简单在外边加个引号表示为字符串。
第二站:对象的隐秘转变 —— 隐式类型转换的实践
在深入理解对象如何通过隐式类型转换变为数字、字符串或在布尔上下文中被解释时,我们首先回顾一下上一站的显式转换,然后细致剖析对象转换的核心机制——ToPrimitive()
函数的运作步骤。从显式转换的直接操控,我们转向更微妙的隐式转换,看看对象是如何在不经意间“变身”的🤔。
-
对象转数字:当一个对象需要在数学运算或比较中被视为数字时,v8引擎会遵循以下步骤:
-
调用
ToNumber()
:首先,引擎会尝试调用ToNumber()
抽象操作来处理对象。但这并不是直接对对象操作,而是间接通过ToPrimitive()
。 -
ToPrimitive()
的介入:-
步骤一:简单判断 :判断接收的值是不是原始类型,是则返回。
-
步骤二:寻找
valueOf()
:否则,调用valueof方法,如果得到了原始值,则返回。 -
步骤三:尝试
toString()
:否则,调用toString方法,如果得到了原始值,则返回。 -
步骤四:失败处理:否则,抛出错误。
-
-
原始值到数字的转换:一旦
ToPrimitive()
成功返回了一个原始值,这个值会被传递给ToNumber()
进行最终转换。
-
-
对象转字符串:基本与对象转数字一样,只有些许差别。
-
调用
ToString()
-
ToPrimitive()
的介入- 步骤一:简单判断
- 步骤二:尝试
toString()
- 步骤三:寻找
valueOf()
- 步骤四:失败处理
这里的步骤二和步骤三与上面的相反,因为如果连功能强大的
toString()
方法都不行的话,就更别提valueOf()
了,这样做也是为了提高效率。 -
原始值到数字的转换:一旦
ToPrimitive()
成功返回了一个原始值,这个值会被传递给ToString()
进行最终转换。
-
-
对象转布尔:在三种转换中,这是最简单最容易记住的了,任何对象转布尔都是true,包括空函数、空数组、空对象。
let arr = [] console.log(Boolean(arr)) // true
第四站:操作符的特殊魔力
操作符,特别是+
,既是数字运算的桥梁,也是字符串连接的纽带,它的双重身份展示了隐式转换的精髓。
-
一元
+
:无论何种原始值,都会触发隐式类型转换,往number转。console.log(+true); // 1 console.log(+"3.14"); // 3.14
简单一加,就可以做到改变数据形态。
-
二元
+
:在数字与字符串间自由切换。console.log(2 + "3"); // "23" console.log("hello, " + "world"); // "hello world" console.log(1 + []); // '1' console.log({} + []); // [object Object]
根据操作数类型,
+
展现不同的特殊效果。
第五站:等号的辩论 —— ==
与===
等号的世界里,==
与===
之争,是对等的细致思考,也是数据类型区别的体现。
-
双等号
==
:考虑的是值的等价,不惜进行类型转换。console.log("0" == 0); // true 值相同就行
-
三等号
===
:坚持严格的等同,要求值与类型都一致。console.log("0" === 0); // false 因为类型不同
在比较严谨的比较场景中,它是不可替代的存在。
思考: [] == ![]
,请认真思考最后的结果。
根据上面的学习,我们要做到一步步细致分析。首先,右边!的优先级更大,空数组会被转换为true,也就是对象转布尔,![]
得到了false。第二步,将false转换为数字,也就是布尔转数字,就得到了0
。第三步,将左边的空数组转换为数字,也就是对象转数字,会先经过toString()
得到空字符串,最后使用Number()
得到数字0
,代表两边相等。
结语
通过这一系列的实例解析,我们不仅深入体验了JavaScript类型转换的精妙,也见识了操作符和等号背后的惊艳。这次的旅行到此结束,希望这些内容对你起到帮助,让我下次一起继续启程!🎉
转载自:https://juejin.cn/post/7377589884189474826