我对 JavaScriptundefined和null价值观有点困惑。
undefined
null
实际上是做什么的if (!testvar)?它是否测试undefinedandnull或 just undefined?
if (!testvar)
定义变量后,我可以将其清除回undefined(因此删除变量)吗?
我可以undefined作为参数传递吗?例如:
function test(var1, var2, var3) { } test("value1", undefined, "value2");
我对 Javascript undefined & null 有点困惑。
null通常行为类似于其他脚本语言的带外“null”、“nil”或“None”对象的概念。
undefined,另一方面,是一个奇怪的 JavaScript 怪癖。它是一个表示带外值的单例对象,本质上是第二个相似但不同的对象null。它出现:
function
js function dosomething(arg1, arg2) { if (arg2===undefined) arg2= DEFAULT_VALUE_FOR_ARG2; ... }
使用这种方法,您无法区分dosomething(1)和dosomething(1, undefined); arg2两者的值相同。如果你需要区分你可以看一下arguments.length,但是做这样的可选参数通常不是很可读。
dosomething(1)
dosomething(1, undefined)
arg2
arguments.length
当一个函数没有return value;时,它返回undefined。一般不需要使用这样的返回结果。
return value;
当您通过var a在块中使用语句来声明变量但尚未为其分配值时,它是undefined. 再一次,你不应该真的需要依赖它。
var a
当它的操作数是一个不存在的简单变量时,幽灵typeof运算符返回,而不是像您尝试引用它时通常会发生的那样抛出错误。'undefined'(你也可以给它一个用括号括起来的简单变量,但不是一个包含不存在变量的完整表达式。)也没有多大用处。
typeof
'undefined'
这是有争议的。当您访问不存在的对象的属性时,您不会像在其他所有语言中那样立即收到错误。相反,你得到一个undefined对象。(然后当您稍后尝试undefined在脚本中使用该对象时,它会以一种奇怪的方式出错,这比 JavaScript 直接抛出错误更难追踪。)
这通常用于检查属性的存在:
js if (o.prop!==undefined) // or often as truthiness test, if (o.prop) ...do something...
但是,因为您可以undefined像分配任何其他值一样分配:
js o.prop= undefined;
这实际上并没有检测到该属性是否可靠。最好使用该in运算符,它不在最初的 Netscape 版本的 JavaScript 中,但现在随处可用:
in
js if ('prop' in o) ...
总而言之,undefined是 JavaScript 特有的一团乱麻,让每个人都感到困惑。除了可选的函数参数,JS 没有其他更优雅的机制,undefined应该避免。它不应该成为语言的一部分;null对于 (2) 和 (3) 本来可以正常工作的,而 (4) 是一个错误功能,它只存在是因为一开始 JavaScript 没有例外。
if (!testvar)实际上做什么?它是否测试未定义和 null 或只是未定义?
这样的“真实性”测试检查false, undefined, null,0和NaN空字符串。但是在这种情况下,是的,它确实是undefined它所关心的。IMO,它应该更明确地说if (testvar!==undefined)。
false
0
NaN
if (testvar!==undefined)
一旦定义了变量,我可以将其清除回未定义(因此删除变量)。
您当然可以分配undefined给它,但这不会删除变量。只有delete object.property操作员才能真正删除东西。
delete object.property
delete实际上是针对属性而不是变量本身。浏览器可以让您直接使用delete variable,但这不是一个好主意,并且在 ECMAScript 第五版的严格模式下不起作用。如果您想释放对某事物的引用以便对其进行垃圾收集,则更通常的说法是variable= null.
delete
delete variable
variable= null
我可以将 undefined 作为参数传递吗?
是的。