我可以将variables设置为undefined或将undefined作为parameter passing吗?
我对JavaScript的undefined
和null
值有点困惑。
if (!testvar)
实际上做了什么? 它testingundefined
和null
或只是undefined
?
一旦定义了variables,我可以将其清除回undefined
(因此删除variables)?
我可以通过undefined
作为参数吗? 例如:
function test(var1, var2, var3) { } test("value1", undefined, "value2");
我对Javascript undefined&null有点困惑。
不要混淆null
。 它通常是有意义的,并且行为类似于其他脚本语言的带外“空”,“零”或“无”对象的概念。
undefined
,另一方面,是一个奇怪的JavaScript怪癖。 这是一个表示带外值的单例对象,本质上是第二个类似但不同的null
。 它出现了:
-
当调用
function
语句列表中参数列表less的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
语句来声明一个variables,但还没有为它赋值时,它是undefined
。 再次,你不应该依靠这个。 -
当它的操作数是一个不存在的简单variables时,这个令人毛骨悚然的
typeof
运算符返回'undefined'
,而不是像通常发生的那样抛出一个错误,如果你试图引用它。 (你也可以给它一个简单的包含在括号中的variables,但不能包含一个不存在variables的完整expression式)。 -
这是有争议的。 当你访问一个不存在的对象的属性时,你不会立即得到像其他语言一样的错误。 相反,你会得到一个
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)
实际上做了什么? 它testing未定义和null或只是未定义?
这样的“真实性”testing针对false
, undefined
, null
, 0
, NaN
和空string进行检查。 但在这种情况下,是的,它确实是undefined
。 国际海事组织,它应该是更明确的说, if (testvar!==undefined)
。
一旦定义了一个variables,我可以将其清除回到未定义状态(因此删除该variables)。
你当然可以给它undefined
,但是不会删除这个variables。 只有delete object.property
操作符才能真正删除东西。
delete
实际上是指属性而不是variables。 浏览器可以让你直接delete variable
,但这不是一个好主意,并且在ECMAScript第五版的严格模式下不起作用。 如果你想释放一个对某些东西的引用,所以它可以被垃圾收集,通常说variable= null
。
我可以通过undefined作为参数吗?
是。
你不能(不应该)定义任何未定义的东西,因为variables不再是未定义的 – 你只是将它定义为某个东西。
你不能(不应该)将undefined
传递给一个函数。 如果你想传递一个空值,那么使用null
。
语句if(!testvar)
检查布尔型的真/假值,这个特定的testing是否testvar
评估为false
。 根据定义, null
和undefined
应该被评估为true
或false
,但JavaScript会将null
评估为false
,并且如果您尝试评估未定义的variables,则会给出错误。
要正确testingundefined
或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
)的概念。
检查空值的最佳方法是
if ( testVar !== null ) { // do action here }
并为未定义
if ( testVar !== undefined ) { // do action here }
你可以指定一个未定义的variables。
testVar = undefined; //typeof(testVar) will be equal to undefined.
为了回答你的第一个问题,非运算符( !
)会强制将它赋给一个布尔值。 所以null
, 0
, false
, NaN
和""
(空string)都将显示为false。
是的,你可以,因为undefined被定义为undefined。
console.log( /*global.*/undefined === window['undefined'] && /*global.*/undefined === (function(){})() && window['undefined'] === (function(){})() ) //true
你的情况:
test("value1", undefined, "value2")
你也可以创build你自己的未定义的variables:
Object.defineProperty(this, 'u', {value : undefined}); console.log(u); //undefined
JavaScript,如何在命令行上设置一个variablesundefined:
在Ubuntu 12.10中的Java附带的js
javascript命令行terminal中设置一个未定义的variables。
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中设置一个未定义的variables:
把这个放在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
警告! 将variables设置为undefined时,将variables设置为另一个variables。 如果某个鬼鬼祟祟的人运行undefined = 'rm -rf /';
那么无论何时将您的variables设置为undefined,您都将收到该值。
你可能想知道如何在一开始就输出未定义的外星人,并让它继续运行。 这是因为JavaScript的提升: http : //www.adequatelygood.com/JavaScript-Scoping-and-Hoisting.html
if (something)
和if (!something)
通常用于检查是否定义或未定义。 例如:
if (document.getElementById)
标识符被转换为布尔值,所以undefined
被解释为false
。 当然还有其他的值(比如0和'')也被解释为false
,但是标识符不应该合理地具有这样的值,或者您对于像undefined一样处理这样的值感到高兴。
JavaScript有一个delete
操作符,可以用来删除一个对象的成员。 根据variables的范围(即,如果它是全局的),你可以删除它使其不确定。
没有undefined
关键字可以用作未定义的文字。 你可以省略一个函数调用中的参数来使它们不确定,但只能通过向函数发送较less的参数来使用,不能省略中间的参数。
只是为了好玩,这是一个相当安全的方式来分配“未分配”的variables。 对于这种碰撞,需要有人添加到与随机生成的string名称完全相同的Object的原型中。 我相信随机string生成器可以改进,但我只是从这个问题: 在JavaScript中生成随机string/字符
这是通过创build一个新的对象,并尝试访问一个随机生成的名称,我们假设不会存在,并因此将具有未定义的值的属性。
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()];
尝试这个:
// found on UglifyJS variable = void 0;