众所周知,JS是一种弱类型的语言,在比较大小的时候对于比较值的类型的类型十分宽松,所以如果对于概念不是深入理解的话,经常会出现一些匪夷所思的错误。比如说:
> 1 < 2
\< ture
这是数的比较,十分容易理解,再比如数与字符串的比较:
> 1 < “2”
\< ture
因为JS会在比较的时候把判断符两端的值转换为相同的类型后在判断,再看一下以下示例:
> “1” < “2”
\< ture
也许你会说,1 > 2 这还用你说吗?这肯定是对的啊!到底有没有干货啊!那么请再看一下以下示例:
> “5” < “10”
\< false
什么?返回的不是ture吗?是的,你没有看错,5的确大于10了,JS没有按照基本法来。或者说JS没有按照大家印象里的基本法来。
JS :"5"为什么要小于"10"? 小明: 5当然小于10 。我小学体育老师都知道! JS :但这是字符串 "5" 和 "10" 啊! 小明:字符串了不起啊,JS会自动转类型啊! JS :字符串在什么条件下自动转类型? 小明:纳尼?等等。。
是啊,JS会在比较的时候把判断符两端的值转换为相同的类型后再判断。但如果类型已经相同呢?那还转个毛啊!!所以( “5”<”10” ) 比较的不是数值,而是字符串!
小明:字符串怎么比?请问还按基本法吗? JS : 拿头比! 小明:黑人问号???
拿头比怎么比?以( “5”<”10” )为例,从左往右开始,5小于1?肯定不啊,好,左边比右边大,值为false,答问收工。纳尼??恩,基本法就是这样。再来:(“ABCD”<”ACAA”),好,从左往右,A等于A,嗯下一个,B小于C,恩,右边大,值为true,答完收工。所以说,”9”比”8999999999”都大?是滴,就是这样。
小明:。。。JS好恶心。。。 JS : 这锅我不背。 小明:嘿嘿嘿 JS : 好诡异的笑容,你想干哈? 小明:数字1和字符串"a"怎么比啊? 1 < "a" ? JS : 你试试啊! 小明:试试就试试,我擦,怎么全是false;true被你吃了啊? JS : 因为字符串"a"转不成数字啊 小明:转不成数字你倒是转ascii码啊? JS :但是1是数字不是字符串啊,不能转ascii码,我要一视同仁! JS : 我反问一句,这要是可以,1<"abc" 怎么比?"abc"转ascii码是多少? 小明:转就转,97,算的是头一个字符,想唬我,没那么容易!想想JS还真是不靠谱! JS : 不按基本法来,臣妾真的做不到啊!
好了,是时候总结一波了。JS在做比较的时候,会先尝试把两边转为相同类型,如果不行就怎么比都是错,如果都是字符串,就从左到右按字符的ascii码,只要不同就是整个表达式的值。恩,简单无脑暴力一波带走。。。。
文章有错还请不吝指教!