当前位置: 首页 > 面试题库 >

为什么字符串与数字比较在Javascript中有效

谷奕
2023-03-14
问题内容

我正在尝试将来自HTML文本字段的值与整数进行比较。它按预期工作。条件是-

x >= 1 && x <= 999;

x文本字段的值在哪里。true只要值介于1-999(含)之间,条件就会返回,否则返回false。问题是,来自文本字段的值是字符串类型,我正在将其与整数类型进行比较。可以进行这种比较,还是应该使用parseInt()转换x为整数?


问题答案:

因为JavaScript 以允许它们将操作数强制转换为不同类型的方式定义>=<=(以及其他几个运算符)。它只是运算符定义的一部分。

在的情况下<><=,和>=,山的详细信息在布局[规范的§11.8.5。简短的版本是:如果两个操作数都是字符串(从对象强制转换后,如果需要的话),它将进行字符串比较。否则,它将操作数强制转换为数字并进行数字比较。

因此,您会得到有趣的结果,就像这样"90" > "100"(都是字符串,这是字符串比较),但是"90" < 100(其中一个是数字,是数字比较)。:-)

可以进行这样的比较,还是应该使用parseInt()将x转换为整数?

这是一个见解。有人认为依靠隐性强制是完全可以的。其他人则认为不是。有一些客观的论点。例如,假设您依赖于隐式转换,这很好,因为您拥有这些数字常量,但后来您将其x与从输入字段中获得的另一个值进行比较。现在,您正在比较字符串,但是代码看起来相同。但同样,这是一个见解,您应该自行选择。

如果你决定明确转换为数字第一,parseInt可能是也可能不是你想要什么,它 不会 做同样的事情,隐式转换。以下是选项的摘要:

  • parseInt(str[, radix])-将字符串的开头尽可能多地转换为整数(整数), 而忽略结尾的多余字符 。所以parseInt("10x")10; 该x被忽略。支持可选的基数(基数)参数,因此parseInt("15", 16)2115十六进制)。如果没有基数,则假定为十进制,除非字符串以0x(或0X)开头,在这种情况下,它将跳过这些并假定为十六进制。难道 不是 寻找新的0b(二进制)或0o(新款八进制)前缀; 两者都解析为0。 _(使用的一些浏览器,以开始治疗的字符串0为八进制;从未指定该行为,并且是[具体不允许] [2]在ES5规范。)_返回NaN 如果找不到可解析的数字。

  • Number.parseInt(str[, radix])-与parseInt上述功能完全相同。(从字面上看Number.parseInt === parseInttrue。)

  • parseFloat(str)-和一样parseInt,但是浮点数并且仅支持十进制。再串上多余的字符被忽略,所以parseFloat("10.5x")10.5(将x被忽略)。由于仅支持十进制,因此parseFloat("0x15")0(因为解析在处结束x)。NaN如果找不到可解析的数字,则返回。

  • Number.parseFloat(str)-与parseFloat上述功能完全相同。

  • 一元+,例如+str- (例如,隐式转换) 使用浮点数和JavaScript的标准数字符号将 整个 字符串转换为数字(仅数字和小数点=十进制;0x前缀=十六进制;0b=二进制[ES2015 +];0o前缀=八进制[ES2015 + ]; 一些 实现将其扩展为将前导0视作八进制,但不是严格模式)。+"10x"NaN因为x 忽略。+"10"10+"10.5"10.5+"0x15"21+"0o10"8[ES2015 +],+"0b101"5[ES2015 +]。有一个陷阱:+""0,不是NaN 如您所料。

  • Number(str)-就像隐式转换一样(例如,像+上面的一元转换一样),但是在某些实现上速度较慢。 (这并不重要。)

  • 按位或与零个,例如str|0-隐式转换,例如+str,但随后又转换成一个32位的整数(转换和数字NaN0如果字符串不能被转换为有效的数)。

因此,如果可以,则可以忽略字符串上多余的位,parseInt或者parseFloat可以。parseInt用于指定基数非常方便。一元+对于确保考虑
整个 字符串很有用。由您选择。:-)

最后,如果您要转换为数字并想知道结果是否为NaN,则可能会想这样做if (convertedValue === NaN)。但这 是行不通的



 类似资料:
  • 问题内容: 我从书中看到以下代码: 但没有提到为什么“一个”大于“四个”。我试过了,它小于a和b。我想知道JavaScript如何比较这些字符串。 问题答案: 因为和许多编程语言一样,字符串是按字典顺序进行比较的。 你可以认为这是一个空想家版本的字母顺序,区别在于字母排序仅覆盖了26个字符通过。

  • 问题内容: 我有一个Android应用程序,我想检查安装的应用程序名称是否与传递给包含此代码的函数的字符串匹配。代码和示例如下: 假设您打过电话,并且手机上的应用程序名称与返回的名称相同。但是,它永远不会。我记录了结果,它应该匹配,但事实并非如此。任何人都可以请问我为什么这行不通吗? 问题答案: 使用String的equals()方法代替==运算符来比较字符串: 在Java中,新手遇到的最常见错误

  • 我在客户端将一些参数存储在HTML中,然后需要将它们作为整数进行比较。不幸的是,我遇到了一个我无法解释的严重错误。bug似乎是我的JS将参数作为字符串而不是整数读取,导致我的整数比较失败。 我生成了一个错误的小例子,我也无法解释。运行时,以下返回“true”:

  • 我已经声明了一个实现可比较接口和compareTo方法的类,使用employee ID比较两个员工。创建的类对象插入数组列表。现在,当我使用collections.sort(arrayList对象)时,它工作得很好。我对collective和comparator接口之间的比较有何不同感到困惑。我想知道如何在纯粹由数字组成的employee id字符串和其他字符串employee id之间进行比较,

  • 问题内容: 我听说散列(即将字符串或对象转换为数字)用于字符串等,因为比较数字比字符串更容易。如果为真,这是什么原因? 问题答案: 不一定是这种情况,但大多数时候可能是这样。 请考虑以下情况: 我想比较字符串“ apples”和“ oranges”。如果我只想确定“ apples” ==“ oranges”,我只需要比较每个字符串的第一个字符:’a’!=’o’=>“ apples”!=“ oran

  • 问题内容: 我试图通过python摸索,并学习做事的最佳方法。我有一个字符串要与另一个字符串进行比较,看是否有匹配项: 如果’d’是一个数组,那么查看pay [j]中包含的字符串是否与’d’中的任何值匹配的最有效方法是什么? 问题答案: 如果您只想知道中是否包含的 任何 项,就像您直白地说: 如果您还想知道中包含 哪些 项目: 会如果没有的项目一个空的列表中包含的。 如果您想要的是另一种选择,那么