资讯专栏INFORMATION COLUMN

javascript由“5” >= "10"返回true引起的思考

nevermind / 1188人阅读

摘要:众所周知,是弱类型的语言。因此在一些不注意的地方容易犯错误。通过得到这两个值,是字符串类型的数字,很显然返回之前已经了。反思虽然写的是弱类型的,但是在有明确类型的情况下,最好还是转换成对应的类型进行比较。

众所周知,js是弱类型的语言。因此在一些不注意的地方容易犯错误。在此记录一下前几天写代码的时候,判断两个值相比较的结果来进行下一步的操作。通过ajax得到这两个值,是字符串类型的数字,很显然返回之前已经toString()了。当时做比较的时候我也没有多想,我以为这两个值会自动转换成number类型来比较,结果就悲剧了。
代码如下

if(a>=b){
    ....
}
//实际执行结果是

if("5">="10"){
    ....
}
//结果值是 true

发现这个bug后,我马上更新了代码进行了to number操作,其实也很简单,对于明确的由number to string的值,只要进行 a = a*1;这样的操作就可以了。

疑问来了

虽然bug很快就被解决了,但是我却陷入了思考,为什么"5">"10"呢?

开始实验、猜测

我又测试了"5">"6","5">"11"等等,然后发现了规律,这两个值比较是依赖于字符串的第一个值的大小。
接下来我又验证了英文字母、汉字之间的相互比较,很快就有了猜测方向,很可能是根据ASCII值来进行比较的。然后就下班溜了。。。

证实

今天查了一下资料,讲的很清楚小议js下字符串比较大小

一句话概括就是按照字典序进行对比。

反思

虽然写的是弱类型的js,但是在有明确类型的情况下,最好还是转换成对应的类型进行比较。

早点上TypeScript的车吧

谁有TypeScript + React 相关资料麻烦分享一下,谢谢啦

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/105398.html

相关文章

  • 解析ES6变量赋值和基本数据类型

      let和const  let和const两者并不存在变量提升  这里要说明的是变量一定要在声明后使用,否则报错。  vara=[];   for(vari=0;i<10;i++){   a[i]=function(){   console.log(i);   };   }   a[6]();//10  变量i是var声明的,我们要知道这里在全局范围内都有效。我们要知道在每一次循环中,新的...

    3403771864 评论0 收藏0
  • Django中celery使用项目实例

      小编写这篇文章的主要目的,主要是给大家去进行讲解Django项目实例情况,包括celery的一些具体使用情况介绍,学习这些的话,对我们的工作和生活帮助还是很大的,但是怎么样才能够更快的进行上手呢?下面就一个具体实例给大家进行解答。  1、django应用Celery  django框架请求/响应的过程是同步的,框架本身无法实现异步响应。  但是我们在项目过程中会经常会遇到一些耗时的任务,比如:...

    89542767 评论0 收藏0
  • 汇总有关JS对象创建与继承

      之前也有和大家讲过有关JS的对象创建和对象继承,本篇文章主要为大家做个汇总和梳理。  JS中其实就是原型链继承和构造函数继承的毛病,还有就是工厂、构造、原型设计模式与JS继承。 JS高级程序设计4:class继承的重点,不只是简简单单的语法而已。  对象创建  不难发现,每一篇都离不开工厂、构造、原型这3种设计模式中的至少其一!  那JS为什么非要用到这种3种设计模式了呢??  我们先从对...

    3403771864 评论0 收藏0
  • JavaScript进阶之函数和对象知识点详解

      在过往学习的JavaScript都是在基础,现在为大家介绍更为深入的JavaScript知识。  JavaScript函数  JavaScript函数和Java函数是有一部分相似的,所以学习起来也会相对简单  基本构造  1.直接构造  //function代表函数标志,name为函数名称,参数可有可无   functionname(参数){   //...   return;   }  2....

    3403771864 评论0 收藏0

发表评论

0条评论

nevermind

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<