为什么在 JavaScript 中被null
认为是 an object
?
正在检查
if ( object == null )
Do something
一样
if ( !object )
Do something
?
并且:
null
和 和有什么不一样undefined
?
为什么在 JavaScript 中被null
认为是 an object
?
正在检查
if ( object == null )
Do something
一样
if ( !object )
Do something
?
并且:
null
和 和有什么不一样undefined
?
(name is undefined)
你:是什么name
?(*)
JavaScript: name
? 什么是name
?我不知道你在说什么。你以前从来没有提到name
过。您是否在(客户端)端看到了其他一些脚本语言?
name = null;
你:是什么name
?
JavaScript:我不知道。
简而言之; undefined
是不存在事物概念的地方;它没有类型,并且在该范围内之前从未被引用过;null
是已知事物存在的地方,但不知道其value是什么。
有一点要记住的是,null
不是,概念,同为false
或""
或这样,即使它们的类型转换,即在画上等号
name = false;
你:是什么name
?
JavaScript:布尔假。
name = '';
你:是什么name
?
JavaScript:空字符串
*:name
在此上下文中表示从未定义的变量。它可以是任何未定义的变量,但是,名称几乎是任何 HTML 表单元素的属性。它可以追溯到很久以前,并且在 id 之前就已经建立了。这很有用,因为 id 必须是唯一的,但名称不必是唯一的。
差异可以总结为这个片段:
alert(typeof(null)); // object
alert(typeof(undefined)); // undefined
alert(null !== undefined) //true
alert(null == undefined) //true
检查
object == null
是不同的检查if ( !object )
。
后者等于! Boolean(object)
,因为一元运算!
符会自动将右操作数转换为布尔值。
由于Boolean(null)
等于 false then !false === true
。
因此,如果您的对象不是 null,而是 false或0或"",则检查将通过,因为:
alert(Boolean(null)) //false
alert(Boolean(0)) //false
alert(Boolean("")) //false
null
是不是一个对象,它是一个原始值。例如,您不能向其添加属性。有时人们错误地认为它是一个对象,因为typeof null
返回"object"
。但这实际上是一个错误(甚至可能在 ECMAScript 6 中修复)。
之间的差null
和undefined
如下:
undefined
: 由 JavaScript 使用,表示“没有value”。未初始化的变量、缺失的参数和未知变量具有该值。
> var noValueYet;
> console.log(noValueYet);
undefined
> function foo(x) { console.log(x) }
> foo()
undefined
> var obj = {};
> console.log(obj.unknownProperty)
undefined
但是,访问未知变量会产生异常:
> unknownVariable
ReferenceError: unknownVariable is not defined
null
: 被程序员用来表示“无值”,例如作为函数的参数。
检查变量:
console.log(typeof unknownVariable === "undefined"); // true
var foo;
console.log(typeof foo === "undefined"); // true
console.log(foo === undefined); // true
var bar = null;
console.log(bar === null); // true
作为一般规则,在 JavaScript 中您应该始终使用 === 并且永远不要使用 ==(== 执行各种可能产生意外结果的转换)。检查x == null
是一种边缘情况,因为它适用于null
和undefined
:
> null == null
true
> undefined == null
true
检查变量是否具有值的常用方法是将其转换为布尔值并查看它是否为true
。该转换由if
语句和布尔运算符执行!(“不是”)。
function foo(param) {
if (param) {
// ...
}
}
function foo(param) {
if (! param) param = "abc";
}
function foo(param) {
// || returns first operand that can't be converted to false
param = param || "abc";
}
这种方法的缺点:以下所有值都计算为false
,因此您必须小心(例如,上述检查无法区分undefined
和0
)。
undefined
, null
false
+0
, -0
,NaN
""
您可以使用Boolean
作为函数来测试到布尔值的转换(通常它是一个构造函数,与 一起使用new
):
> Boolean(null)
false
> Boolean("")
false
> Boolean(3-3)
false
> Boolean({})
true
> Boolean([])
true
null 和 undefined 有什么区别??
没有定义的属性是undefined
。anull
是一个对象。它的类型是object
. null 是一个特殊的值,意思是“没有值。undefined 不是一个对象,它的类型是 undefined。
您可以声明一个变量,将其设置为空,并且行为是相同的,只是您会看到打印出“空”与“未定义”。您甚至可以将未定义的变量与 null 进行比较,反之亦然,条件将为真:
undefined == null
null == undefined
有关更多详细信息,请参阅JavaScript 的 null 和 undefined 区别。
和你的新编辑 是
if (object == null) does mean the same if(!object)
当测试 ifobject
为 false 时,它们都只在测试 if false时满足条件,而在 true 时不满足
在这里检查:Javascript 陷阱
问题的第一部分:
为什么 null 在 JavaScript 中被认为是一个对象?
这是他们现在无法修复的 JavaScript 设计错误。它应该是 null 类型,不是 object 类型,或者根本没有它。它需要在检测真实物体时进行额外检查(有时会被遗忘)并且是错误的来源。
问题的第二部分:
检查是否
if (object == null)
Do something
与
if (!object)
Do something
这两个检查总是假的,除了:
对象未定义或为空:两者都为真。
object 是原始的,0, ""
, 或 false:首先检查 false,第二个 true。
如果对象不是原始对象,而是真正的对象,例如new Number(0)
、new String("")
、 或new Boolean(false)
,则两个检查都为假。
因此,如果“对象”被解释为一个真正的对象,那么两个检查总是相同的。如果允许基元,则对 0 ""
、 和 false的检查不同。
在这种情况下object==null
,不明显的结果可能是错误的来源。使用==
不推荐过,用===
代替。
问题的第三部分:
还有:
null 和 undefined 有什么区别?
在 JavaScript 中,一个区别是 null 是 object 类型,undefined 是 undefined 类型。
在 JavaScript 中,null==undefined
为真,如果忽略类型,则视为相等。为什么他们决定这样做,但是 0""
和 false 不相等,我不知道。这似乎是一种随意的意见。
在 JavaScript 中,null===undefined
不是真的,因为类型在===
.
实际上, null 和 undefined 是相同的,因为它们都代表不存在。0""
也是如此,就此而言也是如此,也许空容器[]
和{}
. 这么多类型的相同没有是错误的秘诀。一种或根本没有更好。我会尽量少用。
“假”、“真”和“!” 是可以简化,例如蠕虫的另一个袋子,if(!x)
而if(x)
单是足够了,你不需要真假。
var x
如果没有给出值,则声明的类型为 undefined,但它应该与 x 从未声明过一样。另一个错误来源是一个空的容器。所以最好一起声明和定义,比如var x=1
.
人们绕着圈子转来转去,试图找出所有这些不同类型的虚无,但在复杂的不同衣服中,这一切都是一样的。现实是
undefined===undeclared===null===0===""===[]==={}===nothing
也许所有人都应该抛出异常。