type checking in javascript

后端 未结 8 862
Happy的楠姐
Happy的楠姐 2020-12-13 11:48

How can I check if a variable is currently an integer type? I\'ve looked for some sort of resource for this and I think the === operator is important, but I\'m not sure how

相关标签:
8条回答
  • 2020-12-13 12:19

    These days, ECMAScript 6 (ECMA-262) is "in the house". Use Number.isInteger(x) to ask the question you want to ask with respect to the type of x:

    js> var x = 3
    js> Number.isInteger(x)
    true
    js> var y = 3.1
    js> Number.isInteger(y)
    false
    
    0 讨论(0)
  • 2020-12-13 12:31

    I know you're interested in Integer numbers so I won't re answer that but if you ever wanted to check for Floating Point numbers you could do this.

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

    Note: This MAY treat numbers ending in .0 (or any logically equivalent number of 0's) as an INTEGER. It actually needs a floating point precision error to occur to detect the floating point values in that case.

    Ex.

    alert(isFloat(5.2));   //returns true
    alert(isFloat(5));     //returns false
    alert(isFloat(5.0));   //return could be either true or false
    
    0 讨论(0)
  • 2020-12-13 12:34

    A number is an integer if its modulo %1 is 0-

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

    This is only as good as javascript gets- say +- ten to the 15th.

    isInt(Math.pow(2,50)+.1) returns true, as does Math.pow(2,50)+.1 == Math.pow(2,50)

    0 讨论(0)
  • 2020-12-13 12:34

    You may also have a look on Runtyper - a tool that performs type checking of operands in === (and other operations).
    For your example, if you have strict comparison x === y and x = 123, y = "123", it will automatically check typeof x, typeof y and show warning in console:

    Strict compare of different types: 123 (number) === "123" (string)

    0 讨论(0)
  • 2020-12-13 12:34

    A clean approach

    You can consider using a very small, dependency-free library like Not. Solves all problems:

    // at the basic level it supports primitives
    let number = 10
    let array = []
    not('number', 10) // returns false
    not('number', []) // throws error
    
    // so you need to define your own:
    let not = Object.create(Not)
    
    not.defineType({
        primitive: 'number',
        type: 'integer',
        pass: function(candidate) {
            // pre-ECMA6
            return candidate.toFixed(0) === candidate.toString()
            // ECMA6
            return Number.isInteger(candidate)
        }
    })
    not.not('integer', 4.4) // gives error message
    not.is('integer', 4.4) // returns false
    not.is('integer', 8) // returns true
    

    If you make it a habit, your code will be much stronger. Typescript solves part of the problem but doesn't work at runtime, which is also important.

    function test (string, boolean) {
        // any of these below will throw errors to protect you
        not('string', string)
        not('boolean', boolean)
    
        // continue with your code.
    }
    
    0 讨论(0)
  • 2020-12-13 12:37

    Try this code:

     alert(typeof(1) == "number");
    
    0 讨论(0)
提交回复
热议问题