哪种检查变量是否已初始化的方法更好/正确?(假设变量可以保存任何内容(字符串、int、对象、函数等))
if (elem) { // or !elem
or
if (typeof elem !== 'undefined') {
or
if (elem != null) {
哪种检查变量是否已初始化的方法更好/正确?(假设变量可以保存任何内容(字符串、int、对象、函数等))
if (elem) { // or !elem
or
if (typeof elem !== 'undefined') {
or
if (elem != null) {
当前回答
我根据对象使用两种不同的方式。
if( !variable ){
// variable is either
// 1. '';
// 2. 0;
// 3. undefined;
// 4. null;
// 5. false;
}
有时我不想将空字符串求值为false,所以我使用这种情况
function invalid( item ){
return (item === undefined || item === null);
}
if( invalid( variable )){
// only here if null or undefined;
}
如果你需要相反的东西,那么首先!变量变为!!变量,并且在无效函数中==变为!=函数名变为notInvalid。
其他回答
你可以试试。。。捕获块如下所示:
var status='变量存在'尝试{我的变量}catch(ReferenceError){status='变量不存在'}console.log(状态)
缺点是不能将其放在函数中,因为它会引发ReferenceError
函数变量Exists(x){var状态=真尝试{x(x)}catch(ReferenceError){状态=假}返回状态}console.log(variableExists(x))
编辑:
如果您在前端Javascript中工作,需要检查变量是否未初始化(var x=undefined将算作未初始化),可以使用:
函数globalVariableExists(变量){if(window[variable]!=未定义){返回true}return false}var x=未定义console.log(globalVariableExists(“x”))console.log(globalVariableExists(“y”))变量z=123console.log(globalVariableExists(“z”))
编辑2:
如果需要检查当前作用域中是否存在变量,只需将其与字符串中包含的变量名称一起传递给函数即可:
函数variableExists(变量,thisObj){if(thisObj[variable]!==未定义){返回true}return false}类someClass{构造函数(名称){这个.x=99这个。y=99这个.z=99这个。v=99console.log(variableExists(name,this))}}新建someClass('x')新建someClass('y')新建someClass('z')新建someClass('v')新建someClass('doesNotExist')
我根据对象使用两种不同的方式。
if( !variable ){
// variable is either
// 1. '';
// 2. 0;
// 3. undefined;
// 4. null;
// 5. false;
}
有时我不想将空字符串求值为false,所以我使用这种情况
function invalid( item ){
return (item === undefined || item === null);
}
if( invalid( variable )){
// only here if null or undefined;
}
如果你需要相反的东西,那么首先!变量变为!!变量,并且在无效函数中==变为!=函数名变为notInvalid。
在JavaScript中,可以定义变量,但保持值未定义,因此最常见的答案在技术上不正确,而是执行以下操作:
if (typeof v === "undefined") {
// no variable "v" is defined in the current scope
// *or* some variable v exists and has been assigned the value undefined
} else {
// some variable (global or local) "v" is defined in the current scope
// *and* it contains a value other than undefined
}
这可能足以满足你的目的。以下测试具有更简单的语义,这使得准确描述代码的行为并自己理解它变得更容易(如果您关心这些事情):
if ("v" in window) {
// global variable v is defined
} else {
// global variable v is not defined
}
当然,这假设您在浏览器中运行(其中window是全局对象的名称)。但如果你在摆弄这样的全局变量,你很可能是在浏览器中。主观上,在window中使用“name”在风格上与使用window.name来引用全局变量一致。将全局变量作为窗口的财产而不是变量进行访问,可以最大限度地减少代码中引用的未声明变量的数量(为了linting的好处),并避免全局变量被局部变量遮蔽的可能性。此外,如果全局对象使您的皮肤爬行,您可能会觉得仅用这根相对较长的棍子触摸它们更舒服。
检查window.hasOwnProperty(“varname”)
一种替代过多类型答案的方法;
用var varname=value声明的全局变量;全局范围内的语句
可以作为窗口对象的财产访问。
因此,hasOwnProperty()方法
返回一个布尔值,指示对象是否将指定的属性作为自己的属性(而不是继承它)可用于确定
“varname”的var已全局声明,即是窗口的属性。
//因此,在全球范围内建立了窗口的财产var foo=“whatever”,//stringbar=false,//bool巴兹;//未定义//window.qux不存在console.log([window.hasOwnProperty(“foo”),//truewindow.hasOwnProperty(“bar”),//truewindow.hasOwnProperty(“baz”),//truewindow.hasOwnProperty(“qux”)//false] );
hasOwnProperty()的优点在于,在调用它时,我们没有使用一个尚未声明的变量,这当然是问题的一半。
虽然不总是完美或理想的解决方案,但在某些情况下,这只是工作!
笔记
当使用var定义变量时,上述情况是正确的,而不是let which:
声明一个块作用域局部变量,可选地将其初始化为一个值。与var关键字不同,var关键字全局定义变量,或局部定义整个函数,而不考虑块范围。在程序和函数的顶层,let与var不同,它不会在全局对象上创建属性。
为了完整性:根据定义,常量实际上不是可变的(尽管它们的内容可以是可变的);更相关的是:
与var变量不同,全局常量不会成为窗口对象的财产。常量的初始值设定项是必需的;也就是说,必须在声明它的同一语句中指定它的值。常量的值不能通过重新分配来更改,也不能重新声明。const声明创建对值的只读引用。这并不意味着它所持有的值是不可变的,只是变量标识符不能被重新分配。
由于let变量或常量永远不是继承了hasOwnProperty()方法的任何对象的财产,因此不能使用它来检查它们是否存在。
关于hasOwnProperty()的可用性和使用:
object派生的每个对象都继承hasOwnProperty()方法。[…]与in运算符不同,此方法不检查对象的原型链。
很难区分undefined和null。Null是一个值,当您想要指示变量没有特定值时,可以将其赋值给该变量。未定义是一个特殊值,它将是未分配变量的默认值。
var _undefined;
var _null = null;
alert(_undefined);
alert(_null);
alert(_undefined == _null);
alert(_undefined === _null);