【问题标题】:type checking in javascriptjavascript中的类型检查
【发布时间】:2011-05-29 17:07:58
【问题描述】:

如何检查变量当前是否为整数类型?我为此寻找了某种资源,我认为 === 运算符很重要,但我不确定如何检查变量是否为整数(或数组)

【问题讨论】:

  • == 检查值是否相等,=== 检查值和类型是否相等。 "1" == 1 为真,"1" === 1 为假
  • 你可以考虑使用一个非常小的库,比如Not。解决所有问题。

标签: javascript types


【解决方案1】:

JavaScript 中的变量永远不会是整数类型——它不区分不同类型的数字。

您可以测试变量是否包含数字,以及该数字是否为整数。

(typeof foo === "number") && Math.floor(foo) === foo

如果变量可能是一个包含整数的字符串,你想看看是不是这样:

foo == parseInt(foo, 10)

【讨论】:

  • 你也可以使用 isNaN(foo) w3schools.com/jsref/jsref_NaN.asp 代替 typeof
  • “它不区分不同类型的Number” 那是因为没有不同类型的Number。 所有 JS中的数值都是64位浮点数。
  • @NullUserException — 我就是这么说的。
  • 如果你使用 jQuery,你可以使用它的 $.type() 函数。前任。 $.type("1") # => "字符串"
  • 这个答案应该更新,因为它与 ECMAScript 2015 Number.isInteger 函数不一致。它应该为 Infinity 返回 false,而不是 true。
【解决方案2】:

试试这个代码:

 alert(typeof(1) == "number");

【讨论】:

    【解决方案3】:

    一个数字是一个整数,如果它的模 %1 是 0-

    function isInt(n){
        return (typeof n== 'number' && n%1== 0);
    }
    

    这仅与 javascript 一样好 - 说 +- 10 到 15。

    isInt(Math.pow(2,50)+.1) 返回true,同样如此 Math.pow(2,50)+.1 == Math.pow(2,50)

    【讨论】:

      【解决方案4】:

      我知道你对整数感兴趣,所以我不会回答这个问题,但如果你想检查浮点数,你可以这样做。

      function isFloat( x )
      {
          return ( typeof x === "number" && Math.abs( x % 1 ) > 0);
      }
      

      注意:这可能会将以.0 结尾的数字(或任何逻辑上等效的0 数字)视为整数。在这种情况下,它实际上需要发生浮点精度错误来检测浮点值。

      例如

      alert(isFloat(5.2));   //returns true
      alert(isFloat(5));     //returns false
      alert(isFloat(5.0));   //return could be either true or false
      

      【讨论】:

        【解决方案5】:

        如今,ECMAScript 6 (ECMA-262) 已经“在家”。使用Number.isInteger(x) 就x 的类型提出您想提出的问题:

        js> var x = 3
        js> Number.isInteger(x)
        true
        js> var y = 3.1
        js> Number.isInteger(y)
        false
        

        【讨论】:

          【解决方案6】:

          不少实用程序库(例如YourJS)提供了用于确定某事物是数组还是整数或许多其他类型的函数。 YourJS 定义 isInt 通过检查值是否为数字然后是否可被 1 整除:

          function isInt(x) {
            return typeOf(x, 'Number') && x % 1 == 0;
          }
          

          上面的 sn-p 取自 this YourJS snippet,因此只能工作,因为 typeOf 是由库定义的。可以下载YourJS的简约版,主要只有typeOf()isInt()isArray()等类型检查功能:http://yourjs.com/snippets/build/34,2

          【讨论】:

            【解决方案7】:

            您还可以查看Runtyper - 一种对===(和其他操作)中的操作数进行类型检查的工具。
            对于你的例子,如果你有严格的比较x === yx = 123, y = "123",它会自动检查typeof x, typeof y并在控制台显示警告:

            不同类型的严格比较:123(数字)===“123”(字符串)

            【讨论】:

              【解决方案8】:

              干净的方法

              您可以考虑使用一个非常小的、无依赖的库,例如 Issable。解决所有问题:

              // at the basic level it supports primitives
              let number = 10
              let array = []
              is(number).number() // returns true
              is(array).number() // throws error
              
              // so you need to define your own:
              import { define } from 'issable'
              // or require syntax
              const { define } = require('issable')
              
              define({
                  primitives: 'number',
                  nameOfTyping: 'integer',
                  toPass: function(candidate) {
                      // pre-ECMA6
                      return candidate.toFixed(0) === candidate.toString()
                      // ECMA6
                      return Number.isInteger(candidate)
                  }
              })
              is(4.4).custom('integer') // throws error
              is(8).customer('integer') // returns true
              

              如果你养成习惯,你的代码会更强大。 Typescript 解决了部分问题,但在运行时不起作用,这也很重要。

              function test (string, boolean) {
                  // any of these below will throw errors to protect you
                  is(string).string()
                  is(boolean).boolean()
              
                  // continue with your code.
              }
              

              【讨论】:

              • 您能解释一下如何使用这种技术检查某事物是否为整数吗?
              • @sova 我已经添加了示例。
              猜你喜欢
              • 1970-01-01
              • 2014-04-08
              • 2016-02-14
              • 1970-01-01
              • 2018-04-13
              • 2013-12-27
              • 1970-01-01
              • 2019-08-24
              • 1970-01-01
              相关资源
              最近更新 更多