JavaScript中的强制类型转换的方法介绍

本篇文章给大家带来的内容是关于JavaScript中的强制类型转换的方法介绍,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

JavaScript 原语

javascript 建立在一系列基本单元之上。你应该对其中的一些已经很熟悉了,比如字符串和数字:

var greet = "Hello";var year = 89;

登录后复制登录后复制

字符串和数字是该语言所谓“原语”的一部分。完整清单是:

StringNumberBooleanNullUndefinedObjectSymbol (ES6中添加,此处不予介绍)

布尔值用来表示可能是真或假的值。 null 是故意不去赋值,它通常被分配给一个变量,用于表示绑定完毕,稍后将填充有意义的内容。

var maybe = null;

登录后复制

然后才是 undefined,这意味着变量仍然没有被附加上:

var name;console.log(name)undefined

登录后复制

null 和 undefined 看起来非常相似,但它们是两个截然不同的实体,很多开发人员仍然不确定应该使用哪个。

立即学习“Java免费学习笔记(深入)”;

如果要判断 JavaScript 实例的类型,可以用 typeof 运算符。让我们用字符串尝试一下:

typeof "alex"> "string"

登录后复制

还有数字:

typeof 9> "number"

登录后复制

用于布尔值:

typeof false> "boolean"

登录后复制

undefined:

typeof undefined> "undefined"

登录后复制

还有 null:

typeof null> "object"

登录后复制

结果令人惊讶! null 看起来像一个对象,但实际上它是 JavaScript 中的一个历史性错误,自语言诞生就躺在那里了。 由于这些问题,JavaScript 一直声名狼借。但这仅仅是个开始。

陌生的事情

在 JavaScript 中,在两种类型之间进行转换时有一些奇怪的规则。让我给你一些背景信息。先用 Python 举一个例子。 在 Python 中执行以下指令:

'hello' + 89

登录后复制登录后复制登录后复制

会给你一个明确的错误:

TypeError: can only concatenate str (**not** "int") to str

登录后复制

而在 JavaScript 中,只有天空才是你的极限:

'hello' + 89

登录后复制登录后复制登录后复制

事实上给出:

"hello89"

登录后复制登录后复制

如果我们尝试向字符串添加数组,看起来会更加奇怪:

'hello' + []

登录后复制

将会得到

1. 'hello'

登录后复制

还有

1. 'hello' + [89]

登录后复制

会给你一个惊喜:

1. "hello89"

登录后复制

看起来这种转换背后存在某种逻辑。它甚至适用于存在更多元素的 array :

1. 'hello' + [89, 150.156, 'mike']

登录后复制

得到:

1. "hello89,150.156,mike"

登录后复制

这两行 JavaScript 足以让 Java 程序员逃离。但是这种行为在 JavaScript 中 100% 是又意义的。因此这种隐式转换,也称为强制类型转换是非常值得探索的。

当一个数字变成一个字符串

一些编程语言有一个叫做类型转换的概念,这意味着:如果我想把一个数字或实例转换为另一种类型,那么我必须使显式转换。它也适用于 JavaScript。请看以下示例:

var greet = "Hello";var year = 89;

登录后复制登录后复制

如果我想明确的进行转换,可以在代码中表明意图:

var greet = "Hello";var year = 89;var yearString = year.toString()

登录后复制

要么这样做:

var greet = "Hello";var year = 89;var yearString = String(year)

登录后复制

然后我可以连接两个变量:

greet + yearString;

登录后复制

但是在 JavaScript 中有一种被称为隐式转换的微妙机制,由 JavaScript 引擎提供。该语言不会阻止我们对数字和字符串进行加法操作:

'hello' + 89

登录后复制登录后复制登录后复制

会得到:

"hello89"

登录后复制登录后复制

但是这种转换背后的逻辑是什么?你可能会惊讶地发现 JavaScript 中的加法运算符 + 会自动将两个操作数中的任何一个都转换为字符串,如果其中至少有一个是字符串的话

你会发现更令人惊讶的是,这条规则在ECMAScript规范中一脉相承。 第11.6.1节 定义了加法运算符的行为,我在这里为你做了总结:

如果 x 是 String 或 y 是String,则返回 ToString(x),然后返回ToString(y)

这个花招只适用于数字吗?并不是。 数组和对象也会受到相同的转换

'hello' + [89, 150.156, 'mike']

登录后复制

会得到:

"hello89,150.156,mike"

登录后复制

那么下面的代码会得到怎样的结果:

'hello' + { name: "Jacopo" }

登录后复制

要找到答案,你可以通过将对象转换为字符串来进行快速测试:

String({ name: "Jacopo" })

登录后复制

将会得到:

"[object Object]"

登录后复制

所以我有一种感觉:

1. 'hello' + { name: "Jacopo" }

登录后复制

会得到:

1. "hello[object Object]"

登录后复制

打住!这又是什么?

JavaScript 中 [object Object] 的含义是什么?

“[object Object]” 是最常见的 JavaScript “怪癖”之一。

几乎每个 JavaScript 实例都有一个名为 toString() 的方法,有些方法是由 Object.prototype.toString 提供的。
某些类型(如数组)实现了 toString() 的自定义版本,以便在调用方法时将值转换为字符串。例如 Array.prototype.toString 会覆盖 Object.toString()(也称为 method shadowing)。

但是当你在普通的 JavaScript 对象上调用 toString() 时,引擎会给出“[object Object]”,因为 Object.toString() 的默认行为是由实体类型(在这种情况下为Object)返回字符串 object

现在让我们把注意力集中在 JavaScript 比较运算符上,它们与算术运算符一样奇怪。

等于还是不等于?

JavaScript 中有两个主要的比较运算符。

第一个我们称之为“弱比较”。这是抽象比较运算符(双等号):==。

另一个是“强比较”,可以通过三等号进行识别:=== 也称为严格比较运算符。它们两者的行为方式完全不同。

来看一些例子。首先,如果我们将两个字符串与两个运算符进行比较,我们得到相同的结果

"hello" == "hello"> true"hello" === "hello"> true

登录后复制

看上去一切都还好。

现在尝试比较两种不同的类型,数字和字符串。首先是“强比较”:

1. "1" === 12. false

登录后复制

这说得通!字符串“1”与数字1是不同的。但是“弱比较”会发生什么?

1. "1" == 12. true

登录后复制

居然是true!它没有任何意义,除非这种行为与我们之前看到的隐式转换有关。

如果适用相同的规则怎么办?没错! ECMAScript spec 再次罢工。结果抽象比较运算符在比较它们之前在类型之间进行自动转换。这是规范的摘要:

比较 x == y 执行如下:

如果 x 是 String 且 y 是Number,则返回比较结果 ToNumber(x)== y

规范说:如果第一个操作数是一个字符串,第二个操作数是一个数字,那么将第一个操作数转换为数字。有趣。

JavaScript 规范充满了这个疯狂的规则,我强烈鼓励大家对它深入挖掘。

在此期间除非你有充分的理由否则在 JavaScript 代码中避免使用抽象比较运算符。你以后会感谢自己的。

那么“强势比较”怎么样?规范中的说 严格相等比较在把值与三等 === 进行比较之前没有进行自动转换。在代码中使用严格相等比较可以避免愚蠢的 bug。

总结

JavaScript 中有七个构建块,即 StringNumberBooleanNullUndefinedObjectSymbol。这些类型被称为基元

JavaScript 开发人员可以使用算术和比较运算符来操作这些类型。但是我们要特别注意加法运算符 + 和抽象比较运算符 ==,它本质上倾向于在类型之间进行转换。

JavaScript 中的隐式转换称为强制类型转换,并在 ECMAScript 规范中定义。无论什么时候你的代码都要使用严格的比较运算符 === 而不是 ==。

作为最佳实践,当你打算在两种类型之间进行转换时,请务必明确操作。JavaScript 有一堆内置对象,它们反映了原始类型:String,Number,Boolean。这些内置类型可用于在不同类型之间进行显式转换。

以上就是JavaScript中的强制类型转换的方法介绍的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2731453.html

(0)
上一篇 2025年3月8日 00:28:17
下一篇 2025年3月8日 00:28:23

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • JavaScript实现双向链表(代码示例)

    在本篇文章中,我们将给大家介绍如何在javascript中实现双向链表,希望对需要的朋友有所帮助! 什么是双向链表? 在双向链表中,每个节点都有对前一个节点和下一个节点的引用。上一个和下一个的开始和结束节点应该指向null。 双向链表的实现…

    2025年3月8日
    000
  • 使用webpack构建多页应用的代码示例

    本篇文章给大家带来的内容是关于使用webpack构建多页应用的代码示例,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 背景:随着react, vue, angular 三大前端框架在前端领域地位的稳固,SPA应用正在被应用…

    编程技术 2025年3月8日
    200
  • JavaScript异步加载的详细介绍(附代码)

    本篇文章给大家带来的内容是关于javascript异步加载的详细介绍(附代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 讲这个问题之前, 我们从另一个面试高频问题来切入, 我们的web页面从开始解析到页面渲染完成都经…

    2025年3月8日
    200
  • new操作符的详细用法介绍

    本篇文章给大家带来的内容是关于new操作符的详细用法介绍,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 相信很多才接触前端的小伙伴甚至工作几年的前端小伙伴对new这个操作符的了解还停留在一知半解的地步,比较模糊。 就比如前…

    2025年3月8日
    200
  • JavaScript常用数组的操作方法总结(代码)

    本篇文章给大家带来的内容是关于javascript常用数组的操作方法总结(代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 一、concat() concat() 方法用于连接两个或多个数组。该方法不会改变现有的数组,…

    编程技术 2025年3月8日
    200
  • 节流阀和去抖动的基本实现方法介绍

    本篇文章给大家带来的内容是关于节流阀和去抖动的基本实现方法介绍,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 节流阀throttle 触发的事件以周期的形式去执行,而非实时。如滴水的水龙头。 function thrott…

    编程技术 2025年3月8日
    200
  • 如何理解JavaScript中的原型链

    javascript中的原型链指的是原型对象链接到另一个原型对象并且依此类推,它的作用就是当请求对象不包含属性时,js就会一直向下查看原型链直到找到所要请求的属性或者到链的末尾 JavaScript是一种基于原型的语言,也就是说JavaSc…

    2025年3月8日
    200
  • javascript异步编程方法有哪些

    javascript实现异步编程的方法有:易于理解和实现但是代码不好维护的回调方法,发布/订阅方法,易于理解并且可绑定多个事件但是工作流程混乱的事件监听方法,promises方法 异步模式是非常重要,在浏览器端长时间运行的操作应该异步执行,…

    2025年3月8日
    200
  • 如何理解JavaScript中的变量提升

    javascript中的变量提升就是变量和函数的声明会跑到代码的最前面,但是实际上变量和函数声明的位置并不会动,只是在编译过程中放入了内存之中。 JavaScript虽然是一种解释型语言,但是在Web开发中在执行之前有一个重要的步骤就是解释…

    2025年3月8日
    200
  • JavaScript中Object.is()方法如何使用?(代码示例)

    在javascript中,object.is()方法可以用于确定两个值是否相同。下面本篇文章就来给大家介绍一下javascript object.is()方法怎么用,了解object.is()方法和==运算符之间的区别,希望对大家有所帮助。…

    2025年3月8日 编程技术
    200

发表回复

登录后才能评论