目录
对象的隐式转换
首页 web前端 js教程 什么是隐式类型转换?js隐式类型转换的介绍

什么是隐式类型转换?js隐式类型转换的介绍

Aug 11, 2018 pm 04:32 PM
隐式类型转换

本篇文章给大家带来的内容是关于什么是隐式类型转换?js隐式类型转换的介绍,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

JavaScript的数据类型非常弱,在使用算术运算符时,运算符两边的数据类型可以是任意的,比如,一个字符串可以和数字相加。之所以不同的数据类型之间可以做运算,是因为JavaScript引擎在运算之前会悄悄的把他们进行了隐式类型转换的,如下是数值类型和布尔类型的相加:

3 + true; 
// 结果:4
登录后复制

结果是一个数值型!如果是在C或者Java环境的话,上面的运算会因为运算符两边的数据类型不一致而导致报错,但是,在JavaScript中,只有少数情况下,错误类型才会导致出错,比如调用非函数,或者读取null或者undefined的属性时,如下:

"hello"(1); 
//结果: error: not a function
null.x; 
// 结果:error: cannot read property 'x' of null
登录后复制

多数情况下,JavaScript都不会出错的,而是自动的进行相应的类型转换。比如-, *, /,和%等算术运算符都会把操作数转换成数字的,但是“+”号就有点不一样了,有些情况下,它是算术加号,有些情况下,是字符串连接符号,具体的要看它的操作数,如下:

2 + 3; 
//结果: 5
"hello" + " world"; 
// 结果:"hello world"
登录后复制

但是,如果字符串和数字相加,JavaScript会自动把数字转换成字符的,不管数字在前还是字符串在前,如下:

"2" + 3; 
// 结果:"23"
2 + "3";
 //结果: "23"
登录后复制

字符串和数字相加结果是字符串!

需要注意的是,“+”的运算方向是从左到右的,如下:

1 + 2 + "3"; 
// "33"
登录后复制

这与下面是等价的:

(1 + 2) + "3"; 
// "33"
登录后复制

相比之下,下面的结果是不一样的:

1 + "2" + 3; 
// "123"
登录后复制

但是,隐式类型转换,有时候,会隐藏一些错误的,比如,null会转换成0,undefined会转换成NaN。需要注意的是,NaN和NaN是不相等的(这是由于浮点数的精度决定的),如下:

var x = NaN;
x === NaN; // false
登录后复制

虽然,JavaScript提供了isNaN来检测某个值是否为NaN,但是,这是不太精确的,因为在调用isNaN函数之前,本身就存在了一个隐式转换的过程,它会把那些原本不是NaN的值转换成NaN的,如下:

isNaN("foo"); // true
isNaN(undefined); // true
isNaN({}); // true
isNaN({ valueOf: "foo" }); // true
登录后复制

上面代码,我们使用isNaN来测试后,发现字符串,undefined,甚至对象,结果都返回真!!!但是他们不是NaN。

总而言之:isNaN检测NaN并不可靠!!!

有一种可靠的并且准确的方法可以检测NaN。

我们都知道,只有NaN是自己不等自己的,可以使用不等于号(!==)来判断一个数是否等于自身,从而,可以检测到NaN了,如下:

var a = NaN;
a !== a; // true
var b = "foo";
b !== b; // false
var c = undefined;
c !== c; // false
var d = {};
d !== d; // false
var e = { valueOf: "foo" };
e !== e; // false
登录后复制

我们也可以把这种模式定义成一个函数,如下:

function isReallyNaN(x) {
    return x !== x;
}
登录后复制

对象的隐式转换

对象是可以转换成原始值的,最常见的方法就是把它转换成字符串,如下:

"the Math object: " + Math; // "the Math object: [object Math]"
"the JSON object: " + JSON; // "the JSON object: [object JSON]"
登录后复制

对象转换成字符串是调用了他的toSting函数的,你可以手动的调用它来检测一下:

Math.toString(); // "[object Math]"
JSON.toString(); // "[object JSON]"
登录后复制

类似的,对象也是可以转换成数字的,他是通过value Of函数的,当然,你也可以自定义这个value Of函数,如下:

"J" + { toString: function() { return "S"; } }; // "JS"
2 * { valueOf: function() { return 3; } }; // 6
登录后复制

如果,一个对象同时存在valueOf方法和toString方法,那么,value Of方法总是会被优先调用的,如下:

var obj = {
    toString: function() {
        return "[object MyObject]";
    },
    valueOf: function() {
        return 17;
    }
};
"object: " + obj; // "object: 17"
登录后复制

一般的,尽可能使value Of和toString表示的值相同(尽管类型可以不同)。

最后一种强制类型转换,我们常常称之为“真值运算”,比如,if, ||, &&,他们的操作数不一定是布尔型的额。JavaScript会通过简单的转换规则,将一些非布尔类型的值转换成布尔型的。大多数的值都会转换成true,只有少数的是false,他们分别是:false, 0, -0, "", NaN, null, undefined,因为存在数字和字符串以及对象的值为false,所以,直接用真值转换来判断一个函数的参数是否传进来了,这是不不太安全的。比如,有一个可以具有默认值得可选参数的函数,如下:

function point(x, y) {
if (!x) {
    x = 320;
}
if (!y) {
    y = 240;
}
    return { x: x, y: y };
}
登录后复制

这个函数会忽略任何的真值为假的参数的,包括0,-0;

point(0, 0); // { x: 320, y: 240 }
登录后复制

检测undefined的更加准确的方法是用typeof操作:

function point(x, y) {
if (typeof x === "undefined") {
    x = 320;
}
if (typeof y === "undefined") {
    y = 240;
}
    return { x: x, y: y };
}
登录后复制

这种写法,可以区分开0和undefined的:

point(); // { x: 320, y: 240 }
point(0, 0); // { x: 0, y: 0 }
登录后复制

另外一种方法是利用参数跟undefined作比较,如下:

if (x === undefined) { ... }
登录后复制

总结:

1. 类型错误有可能会被类型转换所隐藏。

2. “+”既可以表示字符串连接,又可以表示算术加,这取决于它的操作数,如果有一个为字符串的,那么,就是字符串连接了。

3. 对象通过value Of方法,把自己转换成数字,通过toString方法,把自己转换成字符串。

4.具有value Of方法的对象,应该定义一个相应的toString方法,用来返回相等的数字的字符串形式。

5.检测一些未定义的变量时,应该使用type Of或者与undefined作比较,而不应该直接用真值运算。

相关推荐:

JS隐式类型转换总结

隐式转换如何使用?总结隐式转换实例用法

简单介绍JavaScript数据类型之隐式类型转换_javascript技巧

以上是什么是隐式类型转换?js隐式类型转换的介绍的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

C语言中的隐式类型转换和显式类型转换是什么? C语言中的隐式类型转换和显式类型转换是什么? Sep 08, 2023 pm 10:13 PM

将一种数据类型转换为另一种数据类型称为类型转换。隐式类型转换显式类型转换隐式类型转换当操作数具有不同数据类型时,编译器提供隐式类型转换。它是由编译器通过将较小的数据类型转换为较大的数据类型自动完成的。inti,x;floatf;doubled;longintl;这里,上面的表达式最终计算结果为“double”值。示例以下是隐式类型转换的示例-intx;for(x=97;x<=122;x++){  printf("%c",x);/*Im

mysql存在哪些隐式类型转换 mysql存在哪些隐式类型转换 Nov 14, 2023 am 11:28 AM

mysql存在的隐式类型转换有字符串到数值类型、日期和时间类型、浮点数和整数类型、NULL值等。详细介绍:1、字符串到数值类型的隐式类型转换,当一个字符串和一个数值类型的值进行比较或计算时,MySQL会将字符串转换为数值类型;2、日期和时间类型的隐式类型转换,在MySQL中,日期和时间类型也可以与其他数据类型进行隐式类型转换;3、浮点数和整数类型的隐式类型转换等等。

golang函数的类型转换 golang函数的类型转换 Apr 19, 2024 pm 05:33 PM

函数中类型转换允许将一种类型的数据转换为另一种类型,从而扩展函数的功能。使用语法:type_name:=variable.(type)。例如,可使用strconv.Atoi函数将字符串转换为数字,并处理转换失败的错误。

C++ 函数默认参数与可变参数的优缺点比较 C++ 函数默认参数与可变参数的优缺点比较 Apr 21, 2024 am 10:21 AM

C++函数中默认参数的优点包括简化调用、增强可读性、避免错误。缺点是限制灵活性、命名限制。可变参数的优点包括无限灵活性、动态绑定。缺点包括复杂性更高、隐式类型转换、调试困难。

隐式类型转换:类型的不同变体及其在编程中的应用探究 隐式类型转换:类型的不同变体及其在编程中的应用探究 Jan 13, 2024 pm 02:54 PM

探索隐式类型转换的不同类型及其在编程中的作用引言:在编程中,我们经常需要处理不同类型的数据。有时候,我们需要将一种数据类型转换为另一种类型以便进行特定操作或满足特定要求。在这个过程中,隐式类型转换是一个非常重要的概念。隐式类型转换指的是在不需要显式指定转换类型的情况下,编程语言会自动进行数据类型转换的过程。本文将探索隐式类型转换的不同类型及其在编程中的作用,

mysql索引失效的几种情况 mysql索引失效的几种情况 Feb 21, 2024 pm 04:23 PM

常见情况:1、使用函数或运算;2、隐式类型转换;3、使用不等于(!=或<>);4、使用LIKE操作符,并以通配符开头;5、OR条件;6、NULL值;7、索引选择性低;8、复合索引的最左前缀原则;9、优化器决策;10、FORCE INDEX和IGNORE INDEX。

c语言中int和float有什么区别 c语言中int和float有什么区别 Apr 29, 2024 pm 10:12 PM

C 语言中 int 和 float 变量的差别在于:类型不同:int 用于存储整数,而 float 用于存储小数。存储大小:int 通常占用 4 个字节,而 float 也占用 4 个字节。精度:int 表示精确的整数,而 float 的精度有限。范围:int 的范围通常为 -2^31 到 2^31-1,而 float 的范围更宽。运算:int 和 float 可以进行算术运算和比较,但结果可能受到精度限制的影响。类型转换:int 和 float 之间可以进行显式或隐式类型转换。

c#和c语言什么关系 c#和c语言什么关系 Apr 04, 2024 pm 12:03 PM

C# 和 C 语言之间存在密切关系,包括语法相似性、面向对象编程支持、垃圾回收、类型安全和平台差异。C# 继承了 C 语言的语法和面向对象编程的基础,并对其进行了扩展,包括垃圾回收、类型安全和平台特定性等特性。

See all articles