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 === y
和x = 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中的类型检查的主要内容,如果未能解决你的问题,请参考以下文章