javascript中的类型检查

Posted

技术标签:

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

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

【问题讨论】:

== 检查值是否相等,=== 检查值和类型是否相等。 "1" == 1 为真,"1" === 1 为假 你可以考虑使用一个非常小的库,比如Not。解决所有问题。 【参考方案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 我已经添加了示例。

以上是关于javascript中的类型检查的主要内容,如果未能解决你的问题,请参考以下文章

认识 JavaScrip

web前端 --- JavaScrip基础

JavaScrip笔记心得(持续更新)

JavaScrip笔记心得(持续更新)

JavaScrip笔记心得(持续更新)

JavaScrip和Java一样吗?