检查变量是否未定义

check if variables are undefined

提问人:Neville Nazerane 提问时间:3/31/2018 最后编辑:StuccoNeville Nazerane 更新时间:4/4/2018 访问量:174

问:

是否可以有一个函数来检查提供给它的任何参数是否未定义?我正在尝试以下方法

function isDefined() {
    for (var i = 0; i < arguments.length; i++)
        if (typeof (arguments[i]) === "undefined") return false;
    return true;
}

但是,如果我传递一个未定义的参数,它会给我一个错误:

未捕获的 ReferenceError:未定义 b

更新

用法示例:

let a = 5;
let c = "hello";

isDefined(a, b, c); // gives false
isDefined(a, c); // gives true
JavaScript 函数 undefined-reference

评论

3赞 Barmar 3/31/2018
在调用函数之前计算参数。该函数无法及时返回并防止此错误。
0赞 Manos Kounelakis 3/31/2018
do if(!arguments[i]) 返回 false
0赞 Barmar 3/31/2018
@ManosKounelakis 这有什么帮助?它只是将参数转换为布尔值
0赞 Manos Kounelakis 3/31/2018
你可以这样写let isDefined = function(){ return [...arguments].some(arg=>!arg)}
0赞 Barmar 3/31/2018
仅当未声明函数时,才会发生此错误。如果声明变量,则不会出现错误。

答:

-2赞 The Unfit donkey 3/31/2018 #1

undefined 的值为 null。 数组中任何未定义的元素都返回 null。

function isDefined() {
    for (var i = 0; i < arguments.length; i++)
        if (arguments[i]==null) return false;
    return true;
}

评论

0赞 Abslen Char 3/31/2018
这不会解决 op 问题
0赞 BShaps 3/31/2018
undefined 和 null 是两个不同的东西。作为证据,你可以做,你会看到它是错误的。undefined === null
0赞 The Unfit donkey 3/31/2018
=== 与 == 不同,返回 false,返回 true。三等分更严格。undefined === nullundefined == null
0赞 Stucco 3/31/2018 #2

我认为它工作的唯一方法是将 isDefined 包装在 try/catch 中。您的示例用法必须按如下方式进行修改:

let a = 5;
let c = "hello";

try{
  isDefined(a, b, c); // gives false
}catch(e){
  // ... some code that can return false
}
try{
  isDefined(a, c); // gives true
}catch(e){
  // ... some code
}

下面是一个工作示例:

let a = 5;
// b isn't a thing 
let c = 'hello';
let d = null;
let e;


function isDefined() {
 !arguments;
 for (arg in arguments) {
  if(arguments[arg] === null || arguments[arg] === undefined) {
    return false;
  }
 }
 return true;
}


console.log(`isDefined(a, c): Result: ${isDefined(a, c)}`);
//you'd have to wrap isDefined in a try/catch if you're checking for this
try{
  console.log(`try{isDefined(a, b, c)}catch(e){...}: Result: ${isDefined(a, b, c)}`);
}catch(err){
  console.log('try{isDefined(a, b, c)}catch(e){...}: Result: false');
}

console.log(`isDefined(d) Result: ${isDefined(d)}`);
console.log(`isDefined(e): Result: ${isDefined(e)}`);

评论

0赞 Neville Nazerane 3/31/2018
但这仅适用于您将 B 定义为 的情况。如果 B 从未被分配,则不会进行检查b = undefined
0赞 Neville Nazerane 3/31/2018
我的意思是甚至没有 let d
0赞 Stucco 3/31/2018
我唯一能想到的就是在 try catch 中运行 isDefined。
0赞 Sergei Ryzhov 3/31/2018 #3
function isDefined() {
    return !Array.from(arguments).includes(undefined);
}