我知道在javascript中有两种方法可以确定变量是否存在而不是null(false,empty):
1)if ( typeof variableName !== 'undefined' && variableName )
2)if ( window.variableName )
哪一个更受欢迎?为什么?
答案 0 :(得分:98)
如果访问变量名称不会产生ReferenceError
,则变量声明。只有两种情况中的一种情况,typeof variableName !== 'undefined'
表达式为false
:
var variableName
),或 undefined
(即变量的值 未定义)否则,比较评估为true
。
如果你真的想测试一个变量是否被声明,你需要catch
试图引用它所产生的任何ReferenceError
:
var barIsDeclared = true;
try{ bar; }
catch(e) {
if(e.name == "ReferenceError") {
barIsDeclared = false;
}
}
如果您只是想测试声明变量的值是否既不是undefined
也不是null
,那么您只需测试它:
if (variableName !== undefined && variableName !== null) { ... }
或等效地,对null
进行非严格的相等检查:
if (variableName != null) { ... }
&&
操作中的第二个示例和右手表达式都测试值是否为“falsey”,即它是否在布尔上下文中强制为false
。这些值包括null
,false
,0
和空字符串,并非您可能要丢弃的所有字符串。
答案 1 :(得分:19)
重要的是要注意'undefined'是要保持的变量的完全有效值。如果要检查变量是否存在,
if (window.variableName)
是一个更完整的检查,因为它正在验证变量是否已实际定义。但是,这仅在保证变量是对象时才有用!另外,正如其他人所指出的,如果variableName的值为false,0,''或null,则也可能返回false。
尽管如此,这对我们的日常用途来说通常是不够的,因为我们通常不希望有不确定的价值。因此,您应首先检查变量是否已定义,然后使用typeof运算符断言它未定义,正如Adam指出的那样,除非变量确实未定义,否则不会返回undefined。
if ( variableName && typeof variableName !== 'undefined' )
答案 2 :(得分:9)
如果要检查变量(比如说v)是否已定义且不为null:
if (typeof v !== 'undefined' && v !== null) {
// Do some operation
}
如果您想检查所有虚假值,例如:undefined
,null
,''
,0
,false
:
if (v) {
// Do some operation
}
答案 3 :(得分:6)
我之所以写答案只是因为我没有足够的声誉来评论来自 apsillers 的接受答案。 我同意他的回答,但
如果你真的想测试一个变量是否未声明,你需要 捕获ReferenceError ...
不是唯一的方法。人们可以做到:
public class MyObject
{
[BsonIgnoreIfDefault]
public string _id { get; set; }
public int X { get; set; }
}
static void Main(string[] args)
{
var Client = new MongoClient("mongodb://localhost");
var Database = Client.GetDatabase("testdatabase");
var Driver = Database.GetCollection<MyObject>("testcollection");
Driver.Indexes.CreateOne(Builders<MyObject>.IndexKeys.Ascending(_ => _._id));
var C1 = Driver.Count(_ => true);
// c1 == 0 since the db is empty
var A1 = Driver.UpdateMany(_ => false, Builders<MyObject>.Update.Set(_ => _.X, 1), new UpdateOptions {IsUpsert = true});
//A1.MatchedCount == 0
//A1.ModifiedCount == 0;
//A1.Upsertdld = (some id)
var C2 = Driver.Count(_ => true);
// c2 == 1 because a dummy document was created due to the upsert flag
var A2 = Driver.UpdateMany(_ => true, Builders<MyObject>.Update.Set(_ => _.X, 3), new UpdateOptions {IsUpsert = true});
//A2.MatchedCount == 1
//A2.ModifiedCount == 1;
//A2.Upsertdld = null;
var C3 = Driver.Count(_ => true);
// c3 == 1 since no new dummy documents were created as there was a match
}
检查当前上下文中是否声明了变量 bar 。 (我不确定,但是调用 hasOwnProperty 也可能比提出异常更快/更有效) 这仅适用于当前上下文(不适用于整个当前范围)。
答案 4 :(得分:2)
if ( typeof variableName !== 'undefined' && variableName )
//// could throw an error if var doesnt exist at all
if ( window.variableName )
//// could be true if var == 0
////further on it depends on what is stored into that var
// if you expect an object to be stored in that var maybe
if ( !!window.variableName )
//could be the right way
best way => see what works for your case
答案 5 :(得分:1)
我发现这个更短更好:
if(varName !== (undefined || null)) { //do something }
答案 6 :(得分:0)
if (variable)
,或者如果将false,0等视为“默认”值(因此等效于undefined或null)。
typeof variable == 'undefined'
可用于指定的null对未初始化的变量或属性具有不同含义的情况。此检查不会抛出,并且未声明错误是变量。
答案 7 :(得分:-1)
你可以简单地做
SED PROGRAM:
/\n/ {
P
D
}
s/[0-9]{3}_[0-9]{3}/
&
/
D
INPUT: 'file' line 1
PATTERN: aaa123_456bbb123_456ccc
COMMAND: /\n/ {
COMMAND: }
COMMAND: s/[0-9]{3}_[0-9]{3}/
&
/
MATCHED REGEX REGISTERS
regex[0] = 3-10 '123_456'
PATTERN: aaa\n123_456\nbbb123_456ccc
MATCHED REGEX REGISTERS
regex[0] = 0-3 'aaa'
PATTERN: \n123_456\nbbb123_456ccc
COMMAND: D
PATTERN: 123_456\nbbb123_456ccc
COMMAND: /\n/ {
COMMAND: P
123_456
COMMAND: D
PATTERN: bbb123_456ccc
COMMAND: /\n/ {
COMMAND: }
COMMAND: s/[0-9]{3}_[0-9]{3}/
&
/
MATCHED REGEX REGISTERS
regex[0] = 3-10 '123_456'
PATTERN: bbb\n123_456\nccc
MATCHED REGEX REGISTERS
regex[0] = 0-3 'bbb'
PATTERN: \n123_456\nccc
COMMAND: D
PATTERN: 123_456\nccc
COMMAND: /\n/ {
COMMAND: P
123_456
COMMAND: D
PATTERN: ccc
COMMAND: /\n/ {
COMMAND: }
COMMAND: s/[0-9]{3}_[0-9]{3}/
&
/
PATTERN: ccc
MATCHED REGEX REGISTERS
regex[0] = 0-3 'ccc'
PATTERN:
COMMAND: D