我可以将变量设置为undefined或传递undefined作为参数吗?
我对JavaScript的undefined
值和null
值有点困惑。
if (!testvar)
实际上做了什么? 它测试undefined
和null
或只是undefined
?
一旦定义了一个变量,我可以将其清除回undefined
(因此删除该变量)?
我可以传递undefined
作为参数吗? 例如:
function test(var1, var2, var3) {
}
test("value1", undefined, "value2");
我对Javascript undefined&null有点困惑。
不要对null
感到困惑。 它通常是有意义的,其行为与其他脚本语言的带外'null','nil'或'None'对象的概念相似。
undefined
,另一方面,是一个奇怪的JavaScript怪癖。 它是一个单独的对象,表示带外值,实质上是第二个类似但不同的null
。 它出现了:
当您调用function
语句列表中的参数数量少于参数列表的function
,超出的参数将设置为undefined
。 你可以用例如:
function dosomething(arg1, arg2) {
if (arg2===undefined)
arg2= DEFAULT_VALUE_FOR_ARG2;
...
}
用这种方法你不能区分dosomething(1)
和dosomething(1, undefined)
之间的区别; arg2
在两者中都是相同的值。 如果你需要说明不同之处,你可以看看arguments.length
,但是做这样的可选参数通常不太可读。
当函数没有return value;
它返回undefined
。 通常不需要使用这样的返回结果。
当你通过在一个块中声明一个var a
语句来声明一个变量,但尚未给它赋值时,它是undefined
。 再一次,你不应该真的需要依靠那个。
当它的操作数是一个不存在的简单变量时,这个令人毛骨悚然的typeof
运算符返回'undefined'
,而不是像通常发生的那样抛出错误,如果你试图引用它。 (你也可以给它一个包含在括号中的简单变量,但不能包含一个不存在变量的完整表达式)。对此也没什么用处。
这是有争议的。 当你访问一个不存在的对象的属性时,你不会立即得到像其他语言一样的错误。 相反,你会得到一个undefined
对象。 (然后,当您尝试在脚本中稍后使用undefined
对象时,它会以一种奇怪的方式出错,这比JavaScript刚刚抛出错误更难追踪。)
这通常用于检查属性的存在:
if (o.prop!==undefined) // or often as truthiness test, if (o.prop)
...do something...
但是,因为您可以像其他任何值一样指定undefined
:
o.prop= undefined;
这实际上并没有检测到房产是否有可靠的存在。 最好使用in
运算符,该运算符不在原始的Netscape版本的JavaScript中,但现在到处都可用:
if ('prop' in o)
...
总之, undefined
是一个JavaScript特定的混乱,混淆了每个人。 除了可选的函数参数,其中JS没有其他更优雅的机制,应该避免undefined
。 它不应该是语言的一部分; null
对于(2)和(3)来说工作得很好,而(4)是只存在的错误特征,因为在开始时JavaScript没有例外。
if (!testvar)
实际上做了什么? 它测试未定义和null或只是未定义?
这种'真实性'测试针对false
, undefined
, null
, 0
, NaN
和空字符串进行检查。 但是在这种情况下,是的,它确实undefined
它所关心的。 国际海事组织,它应该更明确的说, if (testvar!==undefined)
。
一旦定义了变量,我可以将其清除回未定义(因此删除该变量)。
你当然可以为它undefined
,但不会删除变量。 只有delete object.property
操作符才能真正删除东西。
delete
实际上是指属性而不是变量。 浏览器会让你直接delete variable
,但这不是一个好主意,并且不适用于ECMAScript第五版的严格模式。 如果你想释放一个对某些东西的引用,以便它可以被垃圾回收,那么通常说variable= null
。
我可以传递undefined作为参数吗?
是。
你不能(不应该)定义任何未定义的东西,因为变量不再是未定义的 - 你只是将它定义为某种东西。
你不能(不应该)将undefined
传递给一个函数。 如果您想传递一个空值,请使用null
。
语句if(!testvar)
检查布尔真/假值,这个特定的测试testvar
是否计算为false
。 根据定义, null
和undefined
不应被评估为true
或false
,但JavaScript会将null
评估为false
,并且如果您尝试评估未定义的变量,则会发出错误。
要正确测试undefined
或null
,请使用以下内容:
if(typeof(testvar) === "undefined") { ... }
if(testvar === null) { ... }
基本的区别在于undefined
和null
表示不同的概念。
如果只有null
可用,那么您将无法确定null
是否被有意设置为值或者值是否尚未设置,除非您使用繁琐的错误捕获:例如
var a;
a == null; // This is true
a == undefined; // This is true;
a === undefined; // This is true;
但是,如果您有意将该值设置为null
,则与undefined
严格相等会失败,从而允许您区分null
和undefined
值:
var b = null;
b == null; // This is true
b == undefined; // This is true;
b === undefined; // This is false;
看看这里的参考资料,而不是依赖人们轻蔑地说“垃圾邮件就像”总之,undefined是一个特定于JavaScript的混乱,混淆了每个人。 只是因为你感到困惑,并不意味着它是一团糟。
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/undefined
这种行为也不是特定于JavaScript的,它完成了布尔结果可以为true
, false
,unknown( null
),no value( undefined
)或出错( error
)的概念。
http://en.wikipedia.org/wiki/Undefined_value
链接地址: http://www.djcxy.com/p/76653.html上一篇: Can I set variables to undefined or pass undefined as an argument?