我对JavaScript的undefined和null值有点困惑。
if (!testvar)实际上做什么?它是否测试为undefined和null或只是undefined?
一旦一个变量被定义,我可以把它清除回未定义(因此删除变量)?
我可以传递undefined作为参数吗?例如:
function test(var1, var2, var3) {
}
test("value1", undefined, "value2");
我对JavaScript的undefined和null值有点困惑。
if (!testvar)实际上做什么?它是否测试为undefined和null或只是undefined?
一旦一个变量被定义,我可以把它清除回未定义(因此删除变量)?
我可以传递undefined作为参数吗?例如:
function test(var1, var2, var3) {
}
test("value1", undefined, "value2");
当前回答
是的,你可以,因为未定义定义为未定义。
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
其他回答
只是为了好玩,这里有一种相当安全的方法将“未赋值”赋值给变量。为了产生碰撞,需要有人在Object原型中添加与随机生成的字符串完全相同的名称。我确信随机字符串生成器可以得到改进,但我只是从这个问题中取了一个:在JavaScript中生成随机字符串/字符
这是通过创建一个新对象并尝试访问一个随机生成的名称在它上的属性,我们假设不存在,因此将有undefined的值。
function GenerateRandomString() {
var text = "";
var possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
for (var i = 0; i < 50; i++)
text += possible.charAt(Math.floor(Math.random() * possible.length));
return text;
}
var myVar = {}[GenerateRandomString()];
for if (something)和if (!something)通常用于检查某物是否有定义。例如:
if (document.getElementById)
标识符被转换为布尔值,因此undefined被解释为false。当然,还有其他值(如0和")也被解释为false,但要么标识符不应该有这样的值,要么您乐于将这样的值视为未定义。
Javascript有一个删除操作符,可以用来删除对象的成员。根据变量的作用域(即,如果它是全局的或非全局的),你可以删除它,使其未定义。
没有可以用作未定义文字的未定义关键字。你可以在函数调用中省略形参以使它们未定义,但这只能通过向函数发送更少的形参来使用,你不能在中间省略形参。
要回答您的第一个问题,not操作符(!)将强制将给定的值转换为布尔值。因此null, 0, false, NaN和“”(空字符串)都将显示为false。
基本的区别是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;
查看这里的参考资料,而不是依赖于人们轻蔑地说“总之,未定义是一个特定于javascript的混乱,这让每个人都感到困惑”之类的垃圾。仅仅因为你感到困惑,并不意味着它就是一团糟。
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/undefined
这种行为也不是JavaScript特有的,它完成了布尔结果可以为真、假、未知(null)、无值(undefined)或出错(error)的广义概念。
http://en.wikipedia.org/wiki/Undefined_value
你不能(不应该?)将任何东西定义为未定义的,因为变量将不再是未定义的——你只是将它定义为某个东西。
不能(不应该?)将undefined传递给函数。如果你想传递一个空值,使用null代替。
语句if(!testvar)检查布尔值为true/false,这个语句测试testvar的结果是否为false。根据定义,null和undefined既不应该被赋值为true也不应该被赋值为false,但是JavaScript将null赋值为false,如果您尝试求值一个undefined变量,则会给出一个错误。
要正确地测试undefined或null,请使用以下命令:
if(typeof(testvar) === "undefined") { ... }
if(testvar === null) { ... }