先上https://jsisweird.com/看看你能答对多少道题。写下我不知道的。当数字、无穷大和0互操作时会发生什么?2/0//Infinity0/0//NaN-1/0//-InfinityInfinity*0//NaNprimitivetype(basictype)primitivetype(basicvalue,primitivedatatype)既不是对象也不是对象的类型方法数据。在JavaScript中,有7种基本类型:string、number、bigint、boolean、null、undefined、symbol(ECMAScript2016新)。注意:虽然typeofnull==='object',但null也是原始类型。typeofNaN==='number',其中NaN是原始类型。ECMAScript语言规范将NaN解释为一个数字值,即IEEE754“非数字”值。这可能看起来很奇怪,但这是一个常见的计算机科学原理。然而,在JavaScript中围绕NaN存在一些奇怪的问题。例如,这是Object.is函数与三重相等不一致的极少数情况之一。NaN===NaN;//->falseObject.is(NaN,NaN);//->trueAnothersuchrareinstancecanbeseeninquestion24.这个遗留问题后来用isNaN函数解决了。是NaN(NaN);//->true加法和减法运算符的转换到底返回什么?两边都是toString()吗?或者它是Number()?请参阅ECMAScript语言规范中的这段话:总结。对于+运算符,当一侧为字符串时,识别为字符串拼接,另一侧会先转换为字符串类型进行拼接。当一边是引用类型时,两边都转成字符串进行拼接。当一侧是数字而另一侧是基本类型时,另一侧被转换为数字。如果双方都是非数字和非字符串原始类型,请尝试先强制一侧为数字。123+'123'//123123(规则1)123+null//123(规则3)123+true//124(规则3)123+{}//123[objectObject](规则2)for-,*,/运算符在各种非数字类型上使用数学运算符(-*/)时,它们会先将非数字类型转换为数字。1-true//0,先把true转成数字1,再执行1-11-null//1,先把null转成数字0,再执行1-01*undefined//NaN,undefined转成数字NaN2*['5']//10,['5']会先变成'5'--拆箱操作,然后变成数字5truthyvalue看这个:在JavaScript中,truthyvalue是一个被认为是的值在布尔上下文中遇到时为真。所有值都是真值,除非它们被定义为假值。也就是说,除了false、0、-0、0n、""、null、undefined和NaN之外的所有值都是truthy。以下两者都是真值:if(true)if({})if([])if(42)if("0")if("false")if(newDate())if(-42)if(12n)if(3.14)if(-3.14)if(Infinity)if(-Infinity)如果运算符左侧的操作数为真值,&&运算符返回运算符右侧的操作数:true&&"dog"//returns"dog"[]&&"dog"//returns"dog"==运算符的规则看ecma262第11版AbstractEqualityComparison的介绍。我记下了每条规则对应的场景:/*同类型,同余运算判断的执行**/1==2//false1==1//true/*一边是undefined,另一边是null,returntrue**/undefined==null//truenull==undefined//true/*一边是字符串,一边是数字,先把字符串转成数字**/1=='1'//true1=='1a'//false,'1a'调用Number()会被转为NaN/*一边是string一边是bigint,先把string转成bigint**/1n=='1'//true1n=='1a'//false,'1a'调用Number()会被转换为NaN/*只要有一边是boolean,先强制boolean为number**/1==true//truefalse==1///*一边是string,number,symbol或者bigint,一边是Object引用类型,先把Object转原始值**/'1,2,[objectObject]'==['1',2,{}]//true/*一侧是bigint,另一侧是number**//*如果一侧是NaN,+Infinity,-Infinity,returnfalse,o然后比较数学值的大小**/+Infinity==999999999999999999999999999n//false1==1n//True发现:除了和引用类型比较,和其他类型比较时,其他类型先转为number。将NaN与任何其他类型进行比较总是返回false(包括它本身)。这两个值将false与除undefined==null之外的任何其他类型进行比较。只要有一边是boolean,先把boolean转成number以外的原始类型再和引用类型比较,先把引用类型转成原始类型。二进制、八进制、十进制、十六进制及其相互运算参考:MDNWebDocsNumbersanddates。二进制(binary)以0b或0B开头,如:0b01111111100000000000000000000000;//2139095040octal(八进制)如果前导0之后的数字在$0\sim7$范围内,则被解释为八进制;//888解析为decimalconsta=0o10;//ES2015:8constb=00777;//510,即8^07+8^17+8^27以0o开头。十六进制以0x或0X开头。以10为底的指数$n$e$m$或$n$E$m$表示$n\times10^m$。1E3//10002e6//20000000.1e2//10个互运算先转为十进制再运算。逻辑&&运算符逻辑AND运算符通常在if语句中与布尔值一起使用,但它实际上返回其中一个操作数的值。如果第一个表达式可以转换为true,则它返回第二个。否则,它返回第一个。只要第一个表达式为假,就返回第一个表达式的值;如果第一个为真,则返回第二个表达式的值。""&&-0;//->""-0&&"";//->-05&&3;//->30&&3;//->0Exercise1.[]==![]右边先转换为布尔值。因为[]是真值,所以![]是假的。[]==false,一边是引用类型,一边是布尔类型。只要有一边是Boolean,就先把Boolean类型转成number。[]==0,一边是数字类型(非布尔原始类型),一边是引用类型。然后先将引用类型转换为原始类型。''==0。一边是字符串类型,一边是数字类型。然后先将字符串转换为数字。0==0。那么最后一个为真。2.true=="true"1=="true"->1==NaN,那么最后就是false。3.010-03010;//->803;//->38-3;//->5所以答案是5.4.1/0>10**1000JavaScript把这两个值都当作无穷大,infinity等于infinity。了解有关infinities.1/0的更多信息;//->Infinity10**1000;//->InfinityInfinity>Infinity;//->false所以答案是错误的。5.true++输出stytaxError。您只能记住以下值:true++;//->SyntaxError1++;//->语法错误"x"++;//->SyntaxErrornull++;//->SyntaxErrorundefined++;//->NaN$++;//->NaNconsole.log++;//->NaNNaN++;//->NaNlet_true=true;_true++;_true;//->26.undefined+false虽然false可以转换为数字,但undefined不能。数字(未定义);//->NaN数(false);//->0南+0;//->NaN7.""&&-0检查&&运算符的逻辑。第一个表达式为假,直接返回第一个表达式的值。如果第一个表达式为真,则返回第二个表达式的值。如果本题第一个表达式为假,则返回第一个,即“”。参考JavaScript隐式类型转换,一篇就够了!
