当前位置: 首页 > 后端技术 > Node.js

数据类型的强制转换和隐式转换

时间:2023-04-03 14:55:45 Node.js

数据类型的分类数据类型的分类:基本数据类型和引用数据类型强制转换强制转换主要是指使用一些特定的函数将各种类型的值手动转换成它们的值相应的类型。Number()使用Number()函数将任何类型的值转换为数值。根据参数的数据类型,会有不同的结果。当参数为基本数据类型时1.Value:转换后的原值Number(36)//362。字符串中包含非数字字符串,返回NaN。比parseInt函数严格很多,只要有一个字符不能转成值,整个字符串都会转成NaN。仅包含数值,然后转换为相应的数值。空字符串被转换为0。字符串开头和结尾的空格被自动过滤。Number('\n36\t')//36Number('36abc')//NaNNumber('')//03.布尔值true转1false转0Number(true)//1Number(false)//04.undefined和nullundefined转NaNnull转0Number(undefined)//NaNNumber(null)//当0参数是引用类型时,当Number()方法的参数是对象时,如果对象是一个包含单个值的数组,然后返回数值;否则返回NaN。Number({a:1})//NaNNumber([1,2,3])//NaNNumber([5])//5条转换规则第一步:调用对象本身的valueOf()方法。如果返回原始类型的值,则直接对该值使用Number()函数,无需其他步骤。第2步:如果valueOf()方法返回一个对象,则改为调用该对象自己的toString()方法。如果返回原始类型的值,则直接对该值使用Number()函数,无需其他步骤。第三步:如果toString()方法返回一个对象,报错。默认情况下,对象的valueOf()方法返回的是对象本身,所以一般总是调用toString()方法,toString()方法返回的是对象的类型字符串,如[objectObject]。因此,对字符串使用Number()函数会返回NaN。让obj1={valueOf:function(){return3;}}letobj2={toString:function(){return6;}}letobj3={valueOf:function(){return3;},toString:函数(){返回6;}}Number(obj1)//3Number(obj2)//6Number(obj3)//3String()String()函数可以将任何类型的值转换为字符串。根据参数的数据类型,会有不同的结果。当参数为基本数据类型时,统一转换为对应的字符串形式。String(123)//"123"String('abc')//"abc"String(true)//"true"String(undefined)//"undefined"String(null)//"null"参数是一个reference当类型参数是对象时,返回类型字符串。当参数为数组时,将数组转换为字符串,以,逗号连接;[]一个空数组将被转换为''一个空字符串。当参数为其他引用类型(regular、Date、function等)时,返回对应的字符串形式。String({})//"[objectObject]"String([1,2,3])//"1,2,3"String([])//""String(/dora/)//"/dora/"String(newDate()))//"2019年11月22日星期五14:14:29GMT+0800(中国标准时间)"String(functiona(){})//"functiona(){}》转换规则转换规则与Number()方法基本相同,只是valueOf()方法和toString()方法的执行顺序调换了。第一步:首先调用对象本身的toString()方法。如果返回原始类型的值,请对值使用String()函数,而无需执行以下步骤。第二步:如果toString()方法返回一个对象,那么调用原对象的valueOf()方法。如果valueOf()方法返回原始类型的值,则无需执行以下步骤即可对该值使用String()函数。第三步:如果valueOf()方法返回一个对象,报错。String(obj1)//"[objectObject]"String(obj2)//"6"String(obj3)//"6"因此,由于规律性,Date、function等引用类型数据都有自己的toString()方法,因此返回对应的字符串类型。Boolean()Boolean()函数将任何类型的值转换为布尔值。它的转换规则比较简单:除了以下六个值的转换结果为false外,其他值均为true,包括[]空数组或{}空对象。falseundefinednull0(包含-0和+0)NaN''(空字符串)Boolean(0)//falseBoolean(NaN)//falseBoolean({})//trueBoolean([])//trueBoolean(newBoolean(false))//trueparseInt(string[,radix])和Number.parseInt(string[,radix])具有相同的功能。ES6添加了Number.parseInt()来模块化全局变量。将基数字符串转换为十进制整数。string:如果参数不是字符串类型,使用String()将其转换为字符串。radix:2-36之间的一个数,代表第一个参数字符串的基数。它的默认值会根据情况改变。如果以0x或0X开头,则默认为16;如果以0开头,则默认为8或10(视环境而定);其余默认为10。因此,始终明确指定基数参数的值。返回值:返回值为字符串的十进制整数值。如果字符串的第一个字符不能转换为数字类型,则返回NaN。parseInt("123",10);//123parseInt("11",2);//3位二进制数字字符串'11'转换为十进制3解析规则parseInt()是将stirng参数中的字符串字符一个一个解析,直到遇到的字符不是正号+、负号-、指数e或科学计数法中的E,不是基数规定的基数,则该字符及其后的所有字符将被忽略,返回解析到该位置的整数值。忽略字符串开头和结尾的空格;字符串开头的零也将被忽略。如果字符串的第一个字符无法转换为数字,parseInt()将返回NaN。parseInt("15px",10);//15parseInt("546",2);//NaN除了“0,1”,其他数都不是有效的二进制数parseFloat(string),Number.parseFloat(string)这两个方法功能相同。ES6添加了Number.parseFloat()来模块化全局变量。parseFloat()应该只用于解析十进制数字的字符串并返回一个浮点数。解析规则如果参数不是字符串类型,则使用String()将其转换为字符串。忽略前导和尾随空格。小数点前的额外零也将被忽略。如果parseFloat在解析过程中遇到正号+、负号-、数字0-9、小数点.,或科学计数法中除指数e或E以外的字符,则忽略该字符及其后的所有字符,返回当前解析的浮点数。第二个小数点的存在也会停止解析。如果无法将参数字符串的第一个字符解析为数字,则返回NaN。parseFloat也可以解析并返回Infinity。parseFloat("10.2abc")//10.2Object()Object()函数用于将任何值转换为对象。当参数是原始类型时,它会被转换为对应的包装器对象的实例。当参数为空或undefined或null时,将返回一个空对象。当参数是引用数据类型时,它总是返回自身而不进行转换。Object(null)//{}letnumObj=Object(1);numObjinstanceofObject//truenumObjinstanceofNumber//trueletarr=[];Object(arr)===arr;//true返回原始数组隐式转换隐式转换基于强制转换。==比较在进行==比较时,会根据两边数据类型的不同,进行不同的数据转换。参考JavaScript的相等比较,不同类型的数据互操作+方法操作和加法操作。当一个值是字符串而另一个值是非字符串时,调用String()将非字符串转换为字符串。'6'+1//'61''6'+true//"6true"'6'+false//"6false"'6'+{}//"6[objectObject]"'6'+[]//"6"'6'+function(){}//"6function(){}"'6'+undefined//"6undefined"'6'+null//"6null"除加法运算符外的其他运算符(+)可能会将运算符转换为字符串,其他运算符会通过调用Number()自动将运算符转换为值。'5'-'2'//3'5'*'2'//10true-1//0false-1//-1'1'-1//0'5'*[]//0false/'5'//0'abc'-1//NaNnull+1//1undefined+1//NaN一元运算符也会将运算符转换为值+'abc'//NaN-'abc'//NaN+true//1-false//-0取反值取反,将非布尔值类型的数据转换为布尔值Converttoboolean。系统会自动调用Boolean()函数。因此,除了undefined、null、0(包括-0和+0)、NaN、''(空字符串)五个值都是false,其他的都自动转为true。三元运算符和否定也将值转换为布尔值。它们还在内部调用Boolean()函数。//三元运算符Boolean({})({})?true:false//true//双重否定是一种将值转换为布尔值的便捷方式。等价于Boolean([])!![]//true