我可以设置变量为undefined或传递undefined作为参数吗?

我对JavaScript的undefinednull值有点困惑。

if (!testvar)实际上是做什么的?它是测试undefinednull还是只测试undefined?

一旦定义了一个变量,我是否可以将其清除回undefined(因此删除变量)?

我可以传递undefined作为参数吗?例如:

function test(var1, var2, var3) {


}


test("value1", undefined, "value2");
342631 次浏览

要回答你的第一个问题,not操作符(!)将强制将给定的值转换为布尔值。因此null0falseNaN""(空字符串)都将显示为false。

检查空值的最佳方法是

if ( testVar !== null )
{
// do action here
}

对于undefined

if ( testVar !== undefined )
{
// do action here
}

你可以用undefined来赋值一个变量。

testVar = undefined;
//typeof(testVar) will be equal to undefined.

你不能(不应该?)将任何东西定义为undefined,因为变量将不再是undefined –你只要定义它的东西。

不能(不应该?)将undefined传递给函数。如果你想传递一个空值,使用null代替。

语句if(!testvar)检查布尔值true/false,这个语句测试testvar是否为false。根据定义,nullundefined不应该被计算为truefalse,但是JavaScript将null计算为false,如果你试图计算一个未定义的变量,就会给出一个错误。

要正确地测试undefinednull,使用以下方法:

if(typeof(testvar) === "undefined") { ... }


if(testvar === null) { ... }

for if (something)if (!something)通常用于检查是否定义了某些东西。例如:

if (document.getElementById)

标识符被转换为布尔值,因此undefined被解释为false。当然,还有其他值(如0和")也被解释为false,但要么标识符不应该有这样的值,要么你乐于将这样的值视为未定义。

Javascript有一个delete操作符,可以用来删除对象的成员。根据变量的作用域(即,如果它是全局的或非全局的),你可以删除它,使其未定义。

没有可以用作未定义文字的undefined关键字。你可以在函数调用中省略形参以使它们未定义,但这只能通过向函数发送更少的形参来使用,你不能在中间省略形参。

我有点困惑Javascript的未定义&null。

null的行为通常类似于其他脚本语言的带外‘null’、‘nil’或‘None’对象的概念。

另一方面,undefined是一个奇怪的JavaScript怪癖。它是一个表示带外值的单例对象,本质上是第二个相似但不同的null。它出现了:

  1. 当你调用一个比function语句列表中的参数列表更少的函数时,未传递的参数将被设置为undefined。你可以用eg.:

    function dosomething(arg1, arg2) {
    if (arg2===undefined)
    arg2= DEFAULT_VALUE_FOR_ARG2;
    ...
    }
    

    使用此方法,您无法区分dosomething(1)dosomething(1, undefined);arg2在两者中是相同的值。如果你需要区分,你可以查看arguments.length,但像这样做可选参数通常不是很可读。

  2. 当函数没有return value;时,它返回undefined。通常不需要使用这样的返回结果。

  3. 当你在一个块中通过var a语句声明一个变量,但还没有给它赋值时,它是undefined。再说一次,你真的不需要依赖它。

  4. typeof操作符的操作数是一个不存在的简单变量时,它会返回'undefined',而不是像你试图引用它时通常会发生的那样抛出错误。(你也可以给它一个括号括起来的简单变量,但是一个包含不存在变量的完整表达式。)那也没什么用。

  5. 这是一个有争议的问题。当你访问一个不存在的对象的属性时,你不会像在其他语言中那样立即得到一个错误。相反,你会得到一个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)实际上做什么?它是否测试为undefined和null或只是undefined?

这样的“真实性”测试检查falseundefinednull0NaN和空字符串。但在这种情况下,是的,它真正关心的是undefined。在我看来,它应该更明确地说if (testvar!==undefined)

一旦一个变量被定义,我可以把它清除回未定义(因此删除变量)。

你当然可以将undefined赋值给它,但这不会删除变量。只有delete object.property操作符真正删除内容。

delete实际上是为属性而不是变量。浏览器会让你直接使用delete variable,但这不是一个好主意,并且在ECMAScript第五版的严格模式下无法工作。如果你想释放对某个对象的引用,这样它就可以被垃圾回收,更常见的说法是variable= null

我可以传递undefined作为参数吗?

是的。

如何在命令行中设置一个变量为undefined:

在Ubuntu 12.10上的Java自带的js javascript命令行终端中将一个变量设置为undefined。

el@defiant ~ $ js


js> typeof boo
"undefined"


js> boo
typein:2: ReferenceError: boo is not defined


js> boo=5
5


js> typeof boo
"number"


js> delete(boo)
true


js> typeof boo
"undefined"


js> boo
typein:7: ReferenceError: boo is not defined

如果你在javascript中设置一个变量为undefined:

把这个放到myjs.html中:

<html>
<body>
<script type="text/JavaScript">
document.write("aliens: " + aliens);
document.write("typeof aliens: " + (typeof aliens));
var aliens = "scramble the nimitz";
document.write("found some aliens: " + (typeof aliens));
document.write("not sayings its aliens but... " + aliens);
aliens = undefined;
document.write("aliens deleted");
document.write("typeof aliens: " + (typeof aliens));
document.write("you sure they are gone? " + aliens);
</script>
</body>
</html>

输出如下:

aliens: undefined
typeof aliens: undefined
found some aliens: string
not sayings its aliens but... scramble the nimitz
aliens deleted
typeof aliens: undefined
you sure they are gone? undefined

警告!当你把你的变量设置为undefined时,你就是在把你的变量设置为另一个变量。如果一些狡猾的人运行undefined = 'rm -rf /';,那么无论何时你将变量设置为undefined,你都会收到该值。

您可能想知道我如何在开始时输出未定义的值异形,并使其仍然运行。这是因为javascript提升了:http://www.adequatelygood.com/JavaScript-Scoping-and-Hoisting.html

是的,你可以,,因为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

只是为了好玩,这里有一种相当安全的方法将“未赋值”赋值给变量。为了产生碰撞,需要有人在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()];

基本的区别是undefinednull代表不同的概念。

如果只有null可用,你将无法确定null是否被故意设置为值,或者该值是否还没有设置,除非你使用了繁琐的错误捕获:例如

var a;


a == null; // This is true
a == undefined; // This is true;
a === undefined; // This is true;

然而,如果你故意将值设置为null,与undefined的严格相等将失败,从而允许你区分nullundefined值:

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 < a href = " https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/undefined " > < / >

这种行为也不是JavaScript特有的,它完成了布尔结果可以是truefalse、未知(null)、无值(undefined)或出错(error)的广义概念。

http://en.wikipedia.org/wiki/Undefined_value < a href = " http://en.wikipedia.org/wiki/Undefined_value " > < / >

试试这个:

// found on UglifyJS
variable = void 0;