广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >JavaScript隐式类型转换例子总结
  • 168
分享到

JavaScript隐式类型转换例子总结

JavaScript隐式类型转换JavaScript隐式类换 2022-11-13 14:11:12 168人浏览 八月长安
摘要

目录前言ToStringToNumberToBooleanToPrimitive运算符 +逻辑判断相关== 宽松对等规则1. 字符串和数字之间的相等比较2. 其他类型和布尔类型的相等

前言

熟练掌握类型转换,理解其中的规律。可以让你的代码更简洁更安全

在编写代码的时候,我们通常会有意无意的写出一些,存在类型转换的代码。这些代码有时的返回值总让人迷惑,比如下列式子都是我们工作中常见的:

var a = 1;
var b = '2';
var c = a + b; // '12';

var d = 43;
d == '43';  // true
d === '43'; // false

上面都是比较常见的,让我们再看几个例子:

// 例子1
const obj = {
    toString() {
        return : 'xxx';
    }
}
const obj2 = {};

obj.toString();   // "xxx" 当然,我们还是可以使用Object.prototype.toString.call(obj)的,因为这是调用了Object对象,但是如果改写了Object的toString方法,那情况就不一样了。
obj2.toString();  // "[object Object]"

// 例子2
const a = [1,2,3];
const b = [4,5];
a + b;               // "1,2,34,5"

// 例子3
false == [];         // true
false == "";         // true
false == null;       // false
false == undefined;  // false
[] == ![];           // true

看到上面的结果,是否你也感觉头疼。现在让我们开始探索,看看这中间都发生了怎样的类型转换。

在讲强制类型转换是我们先思考一个问题,不同的数据类型值都会发生什么类型转换?在什么情况下会发生类型转换?具体是怎么转换的?

发生了类型转换通常都是操作值做了【抽象操作】(ES5规范第9节中定义了一些“仅供内部使用的操作”)。这里我们简单介绍一下ToStringToNumberToBoolean同时还有一个ToPrimitive

ToString

ToString是对非字符串进行强制类型转换。

  • 对于基本数据类型,ToString则是进行字符串化,null转化为"null",undefined转化为"undefined",true转化为"true"。对于数字的ToString,需要注意的是,数字的极大值跟极小值会转为指数形式表示。
var a = 1.07 * 1000 * 1000 * 1000 * 1000 * 1000 * 1000 * 1000;
a.toString();  // "1.07e21";
  • 对于引用数据类型的ToString,通常会调用引用对象中的 toString()进行转化,如果对象没有这个方法则会发生报错。(注意:从ES5开始,使用Objest.create(null)创建的对象,因为创建对象的[[Prototype]]为null,所以不会有toString()和valueOf()这两个方法)。
var a = [1,2,3,4];
a.toString(); // "1,2,3,4"

var b = {
    a: 42,
    foo: 'foo'
}
b.toString(); // "[object Object]"

ToNumber

  • 对基本数据类型,ToNumber跟调用Number转数字一样。
Number(true);      // 1
Number(false);     // 0
Number(null);      // 0
Number(undefined); // NaN
Number("");        // 0
Number("123");     // 123
Number("123aaa");  // NaN
  • 对于引用数据类型,会先判断对象是否有valueOf(),如果有则将返回的值进行类型转换。如果没有,则判断是否有toSrting(),并将其返回值做类型转换。如果这两个方法都没有则报错TypeError。
var a = { valueOf() { return "42"} };
var b = { toString() { return "42"} };

var c = [1,2];
c.toString = function() { return this.join(""); }

Number(a);  // 42
Number(b);  // 42
Number(c);  // 12
Number([]); // 0
Number([1,2]); // NaN

ToBoolean

对于抽象操作ToBoolean,ES5规范9.2中列出一些假值,既对这些值进行布尔强制类型转换时,会转为false的值。除了这些值以外,所有值进行强制类型转换时,都会得到true

undefined
null
"" // 空字符串
+0, -0, NaN
false

ToPrimitive

抽象操作ToPrimitive,其实在ToStingToNumberToBoolean获取对象原始值的时候,就是通过ToPrimitive来获取的,获取完原始值之后,再进行toString(),Number(),Boolean()等类型转换。

总结,在对值进行类型转换时,如果是基本数据类型,则直接对使用该值进行类型转换;如果是引用类型,会先通过ToPrimitive获取原始值,然后使用获取的原始值进行类型转换。

而之前说的【先检查对象是否包含valueOf(),如果没有在检查toString()】这个过程就是 ToPrimitive

现在我们分析完类型转换的过程都具体做了什么操作了,现在我们看下,在那些操作下会发生类型转换。

运算符 +

如果操作数中存在字符串,则进行字符串拼接;如果操作数是对象,则会对对象进行 ToPrimitive抽象操作以获取原始值,通常这操作都会获取到字符串。最后进行 + 操作。

var a = [1,2];
var b = [3,4];
a + b;  // "1,23,4"

逻辑判断相关

  • if(..)
  • while(..)和do..while(..)
  • 三元表达式 ?:
  • for(..; ..; ..){}
  • 逻辑或|| 和 逻辑与&& 左边的操作数

上面的语句中所包含的判断表达式,都会将非布尔值通过抽象操作ToBoolean,将值转为boolean。

== 宽松对等规则

1. 字符串和数字之间的相等比较

  • 如果Type(x)是数字,Type(y)是字符串,则返回 x === ToNumber(y)的结果。
  • 如果Type(x)是字符串,Type(y)是数字,则返回 ToNumber(x) === y的结果。
var x = 42;
var y = '42';
x === y;  // false
x == y;   // true   这里转换为: 42 == ToNumber('42') => true

2. 其他类型和布尔类型的相等比较

  • 如果Type(x)是布尔类型,则返回 ToNumber(x) === y 的结果。
  • 如果Type(y)是布尔类型,则返回 x === ToNumber(y)的结果。
var x = true;
var y = '42'
x === y; // false
x == y; // false
// false 这里转换为:toNumber(true) == toNumber('42') => 1 == 42  =>  false

3. null 和 undefined 之间的相等比较

  • 如果x为null,y为undefined,则结果为true。
  • 如果x为undefined,y为true,则结果为true。

注意: 在 == 中null和undefined相等(也与自身相等),除此之外其他值都不和他们相等 所以可以使用一特性,对值进行判断是否等于null或undefined

var x = null;
var y;
x === y; // false
x == y; //true

4. 对象和非对象之间的相等比较

  • 如果Type(x)是字符串或数字,Type(y)是对象,则返回 x == ToPrimitive(y)的结果。
  • 如果Type(y)是字符串或数字,Type(x)是对象,则返回 ToPrimitive(x) == y的结果。
var a = 42
var b = [42]

a == b; // true
// [42]调用ToPrimitive,返回"42",变成 "42" == 42,然后又变成 42 == 42,最后两者相等。

var a = "abc";
var b = Object(a); // new String( a )一样
a === b; // false
a == b; // true

这里有些值不一样

var a = null;
var b = Object(a); // 和Object()一样
a == b; // false

var c = undefined;
var d = Object(c); // 和Object()一样
c == d; // false

var e = NaN;
var f = Object(e); // 和new Number(e) 一样
e == f;  // NaN == NaN => false

因为js中,没有undefined 和 null 对应的封装对象。所以对他们进行Object封装跟调用Object()一样,返回一个常规对象。

而NaN是因为,NaN本身就不等于自己。

总结

总的来说:在宽松对比中,对比的值具有这样的转换优先级,对象 > 非对象(非对象中:字符串,布尔都会ToNumber转为数字,进行比较)。同时需要注意 NaN(唯一不等于自己的值),undefined和null这几个值的转换。

当然,宽松对等中不同值对比,才会进行类型转换。如果是相同类型的比较,不会进行类型转换。"0" == "" 返回false。因为这是字符串"0"""的对比,不会进行抽象操作ToNumber

理解了对象的类型转换都是ToPrimitive操作,那么我们需要注意,任何情况下都不要重写对象的 valueOf()toString() 方法。

到此这篇关于javascript隐式类型转换例子总结的文章就介绍到这了,更多相关JS隐式转换内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: JavaScript隐式类型转换例子总结

本文链接: https://www.lsjlt.com/news/172024.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • JavaScript隐式类型转换例子总结
    目录前言ToStringToNumberToBooleanToPrimitive运算符 +逻辑判断相关== 宽松对等规则1. 字符串和数字之间的相等比较2. 其他类型和布尔类型的相等...
    99+
    2022-11-13
    JavaScript隐式类型转换 JavaScript隐式类换
  • ORACLE隐式类型转换
      隐式类型转换简介   通常ORACLE数据库存在显式类型转换(Explicit Datatype Conversion)和隐式类型转换(Implicit Datatype Conversion)两种类型转换方式。如果进行比较或...
    99+
    2020-03-25
    ORACLE隐式类型转换
  • JavaScript隐式类型转换规则详解
    目录前言数学运算符中的类型转换减、乘、除加逻辑语句中的类型转换单个变量使用 == 比较ToPrimitive前言 在 JavaScript 中,在进行运算操作时,如果两边数据不统一,...
    99+
    2023-05-18
    JavaScript 隐式类型转换 JavaScript 类型转换规则
  • 浅析JavaScript中的隐式类型转换
    目录为什么会出现隐式类型转换隐式类型转换的内部转换机制何时会触发ToPrimitive或ToNumber具体案例分析总结为什么会出现隐式类型转换 这个问题的本质原因是因为JavaSc...
    99+
    2023-03-08
    JavaScript隐式类型转换 JavaScript隐式类型
  • JavaScript中的隐式类型如何转换
    这篇文章主要介绍“JavaScript中的隐式类型如何转换”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“JavaScript中的隐式类型如何转换”文章能帮助大家解决问题。为什么会出现隐式类型转换这个...
    99+
    2023-07-05
  • JavaScript中类型的强制转换与隐式转换详解
    目录一、隐式转换双等号里的转换 Boolean 类型转换 "+" 与 "-" 二、强制类型转换 new String 与 ' ' 总结一、隐式转换 以下语句的执行结果是什么? A...
    99+
    2022-11-12
  • golang类型推断与隐式类型转换
    目录前言一、常量的隐式类型转换1.常量的声明2.常量的类型转换3.隐式转换的原理二、变量的类型推断1.类型推断的原理三、类型推断示例分析总结前言 golang类型推断可以省略类型,像...
    99+
    2022-11-13
  • MySQL-数据类型隐式转换
    MySQL-数据类型隐式转换 关键字问题描述解决问题思路问题总结 关键字 数据类型不同导致隐式转换 问题描述 SQL 一: select id,sku,weight,image_...
    99+
    2023-09-08
    mysql sql
  • C语言基础隐式类型转换与强制类型转换示例解析
    目录类型转换隐式类型转换强制类型转换类型转换 数据有不同的类型,不同类型数据之间进行混合运算时必然涉及到类型的转换问题。 转换包括隐式类型转换和强制类型转换。 类型转换的原则:占用内...
    99+
    2022-11-12
  • JavaScript中==隐藏下类型转换的示例分析
    这篇文章给大家分享的是有关JavaScript中==隐藏下类型转换的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。抛砖引玉按照正常的逻辑来说,我们判断两个值是否相等会遵循...
    99+
    2022-10-19
  • C#数据类型转换(显式转型、隐式转型、强制转型)
    C# 的类型转换有显式转型 和 隐式转型 两种方式。 显式转型:有可能引发异常、精确度丢失及其他问题的转换方式。需要使用手段进行转换操作。隐式转型:不会改变原有数据精确度、引发异常,...
    99+
    2022-11-12
  • C#类型转换之自定义隐式转换和显式转换
    目录前言基础知识示例代码实际应用问题答案报错其他应用和设计读音前言 有时我们会遇到这么一种情况:在json数据里,数组里的数据类型不一致,导致我们不能直接反序列化为目标类型。最终我们...
    99+
    2022-11-13
  • JavaScript运算符规则与隐式类型的转换
    本篇内容介绍了“JavaScript运算符规则与隐式类型的转换”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成...
    99+
    2022-10-19
  • mysql存在哪些隐式类型转换
    mysql存在的隐式类型转换有字符串到数值类型、日期和时间类型、浮点数和整数类型、NULL值等。详细介绍:1、字符串到数值类型的隐式类型转换,当一个字符串和一个数值类型的值进行比较或计算时,MySQL会将字符串转换为数值类型;2、日期和时间...
    99+
    2023-11-14
    mysql 隐式类型转换
  • JavaScript中类型转换的示例
    小编给大家分享一下JavaScript中类型转换的示例,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一、类型转换是什么?我们都知道变量的类型由它存储的值的类型来决...
    99+
    2023-06-08
  • 深入探讨PHP类型的隐式转换
    PHP是一种广泛使用的服务器端编程语言,它支持多种数据类型。PHP的数据类型有两种:基本数据类型和复合数据类型。在PHP中,数据类型的转换通常是隐式的,这是由PHP的动态类型语言特性所决定的。但是,隐式类型转换可能会引起一些问题和错误,这篇...
    99+
    2023-05-14
    php
  • PHP类型的隐式转换怎么实现
    本篇内容主要讲解“PHP类型的隐式转换怎么实现”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“PHP类型的隐式转换怎么实现”吧!一、基本数据类型在PHP中,基本数据类型有四种,分别是整型(int)...
    99+
    2023-07-05
  • MySQL显式类型转换实例
    小编给大家分享一下MySQL显式类型转换实例,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!undefined在之前的文章中,我们...
    99+
    2022-10-18
  • C语言隐式类型转换与强制类型转换的方法是什么
    本篇内容主要讲解“C语言隐式类型转换与强制类型转换的方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C语言隐式类型转换与强制类型转换的方法是什么”吧!类型转换数据有不同的类型,不同类型数...
    99+
    2023-06-25
  • go为什么不支持隐式类型转换
    go不支持隐式类型转换是因为它会降低代码可读性和可维护性、增加潜在的错误风险、破坏语言的一致性和简洁性、鼓励明确的类型转换和显式的编程风格等。详细介绍:1、降低代码可读性和可维护性,隐式类型转换在代码中往往不清晰,难以阅读和理解,当程序员在...
    99+
    2023-11-10
    隐式类型转换 Go
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作