Javascript中的隐式强制转换只是指Javascript试图将一个意想不到的值类型强制转换为预期的类型。因此,您可以在期望数字的位置传递字符串,在期望字符串的位置传递对象等,它会尝试将其转换为正确的类型。这是最好避免的Javascript特性。3*"3"//91+"2"+1//121true+true//210-true//9constfoo={valueOf:()=>2}3+foo//54*foo//8constbar={toString:()=>"promiseisaboy:)"}1+bar//"1promiseisaboy:)"4*[]//04*[2]//84+[2]//"42"4+[1,2]//"41,2"4*[1,2]//NaN"string"?4:1//4未定义?4:1//1inanumericexpressionNon-numericvaluestring每当您在涉及以下任何运算符的数值表达式中将字符串作为操作数传递时:-、*、/、%,数字的转换过程类似于对值调用内置的Number函数。这很简单,任何只包含数字字符的字符串都将被转换为其等效的数字,但包含非数字字符的字符串将返回NaN。如下所示,3*"3"//3*33*Number("3")//3*3Number("5")//5Number("1.")//1Number("1.34")//1.34Number("0")//0Number("012")//12Number("1,")//NaNNumber("1+1")//NaNNumber("1a")//NaNNumber("one")//NaNNumber("text")//CaseoperatorforNaN+operator与其他数学运算符不同,执行两个功能:数学加法字符串连接当字符串是+运算符的操作数时,Javascript不是将字符串转换为数字,而是将数字转换为字符串.//concatenation1+"2"//"12"1+"js"//"1js"//addition1+2//31+2+1//4//加法,然后concatenation1+2+"1"//"31"(1+2)+"1"//"31"//通过1+"2"+1//"121"(1+"2")+1//"121"对象是big大多数Javascript对象转换通常会导致[objectObject],例如"name"+{}//"name[objectObject]每个javascript对象都继承一个toString方法,每当对象转换为字符串方法时都会调用该方法。toString方法的返回值用于字符串拼接、数学表达式等操作constfoo={}foo.toString()//[objectObject]constbaz={toString:()=>"I'mobjectbaz"}baz+"!"//"I'mobjectbaz!"当它是一个数学表达式时,Javascript会尝试将返回值转换为数字,如果不是。constfoo={toString:()=>4}2*foo//82/foo//0.52+foo//6"four"+foo//"four4"constbaz={toString:()=>"four"}2*baz//NaN2+baz//2fourconstbar={toString:()=>"2"}2+bar//"22"2*bar//4个数组对象toStringArrays的继承方式有点不同的是,它的工作方式类似于不带任何参数调用数组的join方法。[1,2,3].toString()//"1,2,3"[1,2,3].join()//"1,2,3"[].toString()//""[].join()//"""me"+[1,2,3]//"me1,2,3"4+[1,2,3]//"41,2,3"4*[1,2,3]//NaN所以当你传递一个需要字符串的数组时,Javascript会将toString方法的返回值与第二个操作数连接起来。如果它需要一个数字,它会尝试将返回值转换为一个数字。4*[]//04/[2]//2//类似于4*Number([].toString())4*Number("")4*0//4/Number([2].toString())4/Number("2")4/2true,falseand""Number(true)//1Number(false)//0Number("")//04+true//53*false//03*""//03+""//"3"参考视频讲解:进入学习valueOf方法也可以定义一个valueOf方法,当你传递一个需要字符串或数字值的对象时,Javascript会使用该方法.constfoo={valueOf:()=>3}3+foo//63*foo//9当toString和valueOf方法都定义在对象上时,Javascript将使用valueOf方法。constbar={toString:()=>2,valueOf:()=>5}"sa"+bar//"sa5"3*bar//152+bar//7valueOf方法用于应该表示数字的对象值。consttwo=newNumber(2)two.valueOf()//2falseandtrue我真的希望它是false和true每个Javascript值都可以强制为true或false。转换为布尔值true意味着该值为true。转换为布尔值false意味着该值为false。Javascript中有一些值返回假值,它们是:false0nullvalueambiguous""NaN-0everythingelseistrueif(-1)//truthyif("0")//truthyif({})//truthy上面的代码片段没问题,但是在尝试确定一个值的真实性时最好是明确的。基本上,不要依赖Javascript的隐式强制转换,即使您认为自己很了解它们。代替下面的代码片段,constcounter=2if(counter)下面的任何一个都是更好的做法,具体取决于您的要求if(counter===2)//orif(typeofcounter==="number")这是因为对于例如,您定义了一个应该处理数字的函数constadd=(number)=>{if(!number)newError("Onlyacceptsargumentsoftype:number")//yourcode}所以如果我使用0调用add函数,我总是得到一个意想不到的错误add(0)//Error:Onlyacceptsargumentsoftype:number//bettercheckconstadd=(number)=>{if(typeofnumber!=="number")newError("Only接受类型的参数:number")//yourcode}add(0)//noerrorNaNNaN是一个不等于自身的特殊数字。NaN===NaN//falseconstnotANumber=3*"a"//NaNnotANumber==notANumber//falsenotANumber===notANumber//falseNaN是唯一不等于自身的Javascript值。因此,您可以通过将其与自身进行比较来检查NaN。if(notANumber!==notANumber)//trueECMAScript6引入了一种检查NaN的方法,Number.isNaNNumber.isNaN(NaN)//trueNumber.isNaN("name")//false注意全局isNaN函数,它将在检查是否为NaN。例如,isNaN("name")//trueisNaN("1")//falseisNaN应避免使用全局函数,它的工作方式类似于以下函数constcoerceThenCheckNaN=(val)=>{constcoercedVal=Number(val)returncoercedVal!==强制值?true:false}coerceThenCheckNaN("1a")//truecoerceThenCheckNaN("1")//falsecoerceThenCheckNaN("as")//truecoerceThenCheckNaN(NaN)//truecoerceThenCheckNaN(10)//false这主要是隐式强制转换。如果我遗漏了什么,请在下面的评论中补充,感谢您一路阅读。
