我对 JavaScriptundefined
和null
值有点困惑。
什么是if (!testvar)
真正做到?它是否测试undefined
和null
或只是undefined
?
一旦定义了变量,我可以将其清除回undefined
(因此删除变量)吗?
我可以undefined
作为参数传递吗?例如:
function test(var1, var2, var3) {
}
test("value1", undefined, "value2");
我对 JavaScriptundefined
和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
语句列表中的参数列表的函数时,未传递的参数将设置为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
运算符,它不在 JavaScript 的原始 Netscape 版本中,但现在随处可用:
if ('prop' in o)
...
总之,undefined
是一个 JavaScript 特有的混乱,让每个人都感到困惑。除了可选的函数参数之外,JS 没有其他更优雅的机制,undefined
应该避免。它不应该成为语言的一部分;null
对于 (2) 和 (3) 本来可以正常工作,而 (4) 是一个错误功能,它仅存在于 JavaScript 开始时没有异常。
什么
if (!testvar)
实际上做?它是否测试未定义和空值或只是未定义?
这样的“感实性”对测试检查false
,undefined
,null
,0
,NaN
和空字符串。但是在这种情况下,是的,它确实与undefined
它有关。IMO,应该更明确地说if (testvar!==undefined)
。
一旦定义了变量,我可以将其清除回未定义(因此删除变量)。
您当然可以分配undefined
给它,但这不会删除变量。只有delete object.property
操作员才能真正移除东西。
delete
真正用于属性而不是变量本身。浏览器会让你摆脱直接delete variable
,但这不是一个好主意,并且在 ECMAScript Fifth Edition 的严格模式下不起作用。如果你想释放对某物的引用以便它可以被垃圾收集,通常说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
代表不同的概念。
如果 onlynull
可用,您将无法确定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
、未知 ( null
)、 无值 ( undefined
) 或出现问题 ( error
)的通用概念。
检查空值的最佳方法是
if ( testVar !== null )
{
// do action here
}
对于未定义
if ( testVar !== undefined )
{
// do action here
}
您可以使用 undefined 分配变量。
testVar = undefined;
//typeof(testVar) will be equal to undefined.
是的,你可以,因为 undefined 被定义为 undefined。
console.log(
/*global.*/undefined === window['undefined'] &&
/*global.*/undefined === (function(){})() &&
window['undefined'] === (function(){})()
) //true
你的情况:
test("value1", undefined, "value2")
您还可以创建自己的未定义变量:
Object.defineProperty(this, 'u', {value : undefined});
console.log(u); //undefined