JQuery / Javascript:检查var是不是存在[重复]
Posted
技术标签:
【中文标题】JQuery / Javascript:检查var是不是存在[重复]【英文标题】:JQuery/Javascript: check if var exists [duplicate]JQuery / Javascript:检查var是否存在[重复] 【发布时间】:2012-12-06 07:35:18 【问题描述】:可能重复:How can I check whether a variable is defined in javascript?Is there a standard function to check for null, undefined, or blank variables in JavaScript?
我有一个分为两部分的脚本。
第一部分设置一个var:
var pagetype = "textpage";
第二部分是一个简单的 if 语句:
if(pagetype == "textpage")
//do something
;
现在第二部分 if 语句出现在我网站的所有页面上。但是声明 var 的第一部分只出现在我的一些页面上。
在没有 var 的页面上我自然会得到这个错误:
Uncaught ReferenceError: pagetype is not defined
所以我的问题是:有没有办法用 JavaScript 或 JQ 来检测一个 var 是否存在(不仅仅是它是否有数据分配给它)?
我想我会使用另一个 if 语句,例如:
if ("a var called pagetypes exists")....
【问题讨论】:
typeof
, window.hasOwnProperty
, if(var x)
...
你会得到这个问题的很多答案,我认为其中大部分都是正确的......我投票赞成这个问题,因为很高兴看到错误处理的“正确”尝试......
【参考方案1】:
我怀疑在 SO 上有很多这样的答案,但你去吧:
if ( typeof pagetype !== 'undefined' && pagetype == 'textpage' )
...
【讨论】:
if(var pagetype == "textpage")...
呢?
@JanDvorak:很确定那不是有效的 JS...
这并不测试pagetype
是否被声明,只是它的值的类型不是未定义的。
该问题专门要求进行测试,即即使尚未分配变量,也已声明变量。因此,即使只声明了 var pagetype;
而没有为其赋值,if 语句也应该返回 true。目前没有。
@elclanrs 如果在我的脚本顶部我声明变量 pagetype 像这样var pagetype;
以下表达式将返回typeof pagetype
? var 存在,但没有分配给它的值。因此,typeof pagetype
不能用作存在的测试。【参考方案2】:
你可以使用typeof
:
if (typeof pagetype === 'undefined')
// pagetype doesn't exist
【讨论】:
【参考方案3】:要测试是否存在,有两种方法。
一个。 "property" in object
此方法检查原型链是否存在属性。
b. object.hasOwnProperty( "property" )
此方法不会沿着原型链检查属性是否存在,它必须存在于您正在调用该方法的对象中。
var x; // variable declared in global scope and now exists
"x" in window; // true
window.hasOwnProperty( "x" ); //true
如果我们使用以下表达式进行测试,那么它将返回 false
typeof x !== 'undefined'; // false
【讨论】:
这仅在pagetype
定义在全局范围内时有效
这也仅适用于浏览器,但不适用于 Node.js 等。尝试使用this
而不是window
。
@Bruno——你的方法 a 不检查变量是否存在,方法 b 只对全局属性有用,其中一些可能是变量。
全局变量不是添加到全局对象的用户定义属性吗?但是是的,你是对的。
@Bruno 如果你在函数内部声明一个变量会怎样。这不会将它添加到全局对象中......【参考方案4】:
在每个条件语句之前,您可以执行以下操作:
var pagetype = pagetype || false;
if (pagetype === 'something')
//do stuff
【讨论】:
假设您不介意将pagetype
定义为副作用,OFC。
这只是一种方法。这样,如果条件不存在,它至少会默认失败。
这对于 pagetype
具有错误值(如 ""
、0
等)根本不起作用。如果 pagetype
已声明并设置为这些值之一,则覆盖false
,会导致不正确的比较。
实际上不会。如果您希望条件与特定字符串不匹配(如 OP 的情况)失败,那么当然 ""
和 0
和 false
都是等价的【参考方案5】:
除了使用 try..catch 来判断一个变量是否被声明是不可能的。测试如下:
if (typeof varName == 'undefined')
不要告诉你varName
是否是范围内的变量,只有使用 typeof 的测试返回未定义。例如
var foo;
typeof foo == 'undefined'; // true
typeof bar == 'undefined'; // true
在上面,你不能说 foo 被声明但 bar 没有被声明。您可以使用in
测试全局变量:
var global = this;
...
'bar' in global; // false
但是全局对象是唯一可以访问的变量对象*,不能访问任何其他执行上下文的变量对象。
解决方案是始终在适当的上下文中声明变量。
全局对象并不是真正的变量对象,它只是具有与全局变量匹配并提供对它们的访问权限的属性,因此它看起来就是一个。【讨论】:
又一例无法解释原因的驾车通过的选民。【参考方案6】:对于你的情况,99.9% 的其他人elclanrs
的答案是正确的。
但是因为undefined
是一个有效值,如果有人要测试一个未初始化的变量
var pagetype; //== undefined
if (typeof pagetype === 'undefined') //true
唯一 100% 可靠的确定 var 是否存在的方法是捕获异常;
var exists = false;
try pagetype; exists = true; catch(e)
if (exists && ...)
但我永远不会这样写
【讨论】:
如果你投反对票,证明答案是错误的 ^^if (typeof pagetype === 'undefined') //false
sigh ... 错字:-),即使它仍然评估为 true
其实你就在那里。我会尽可能投票。
'prop' in this
呢?为什么这还不够?以上是关于JQuery / Javascript:检查var是不是存在[重复]的主要内容,如果未能解决你的问题,请参考以下文章
如何检查 var 是不是是 JavaScript 中的字符串?
javascript Var Type检查器(toType)
jQuery“ $ variable”与javascript“ var” 简单变量声明的困惑