null值的JavaScript行为是什么?

时间:2014-09-24 01:18:59

标签: javascript null ecmascript-5

在测试某些变量是否为空时我遇到了代码问题,并决定用小提琴测试它:

Testing null values

var result = "";
var Teste = new Object();
Teste.ObjectNew = new Object();
Teste.StringNew = new String();
Teste.NumberNew = new Number();
Teste.ArrayNew = new Array();
Teste.ObjectLiteral = {};
Teste.StringLiteral = "";
Teste.NumberLiteral = 0;
Teste.ArrayLiteral = [];
Teste.ObjectNull = Object(null);
Teste.StringNull = String(null);
Teste.NumberNull = Number(null);
Teste.ArrayNull = [null];
for (var i in Teste) {
  if (Teste[i] == null) {
    result += "<p>Type " + i + " is null: " + Teste[i] + "</p>";
  } else {
    result += "<p>Type " + i + " is not null: " + Teste[i] + "</p>";
  }
}

document.getElementById("result").innerHTML = result;
<div id="result"></div>

结果是:

Type ObjectNew is not null: [object Object]

Type StringNew is not null:

Type NumberNew is not null: 0

Type ArrayNew is not null:

Type ObjectLiteral is not null: [object Object]

Type StringLiteral is not null:

Type NumberLiteral is not null: 0

Type ArrayLiteral is not null:

Type ObjectNull is not null: [object Object]

Type StringNull is not null: null

Type NumberNull is not null: 0

Type ArrayNull is not null:

我在Safari中测试过,结果相同。

我在php中完全使用JS编写代码并且在调整我的想法时遇到了问题。在php中,$ var = array()返回NULL,但在JavaScript中它接缝在任何类型都不会有null值。在EcmaScript定义中,null是“表示故意缺少任何对象值的原始值”,但是我的测试在列表中的JavaScript中不可能找到它,不包括v = null的情况,我认为它是一个Null类型的var。 / p>

此外,我相信AS3遵循ecmascript概念,通过拆分类型从它的值开始,var语句“构建”var作为除了值之外的对象。

那么,如果有办法,我们如何才能正确引用空值?

修改

当我遇到这种情况时,我做了这个测试:我创建了一个具有图形库相对目录的变量。如果此变量为null,则表示我不希望在软件初始化阶段将其从默认值(我有一个默认值的表)更改,因此系统只需为目录添加正确的http基础。如果变量不为null,则假定该值仅分配给它。但是如果它是一个空的空间,则意味着该目录是根目录,但将被视为空,从而产生错误。

Dinamyc:

var dir = new String(); // should be null
// initializing
dir = ""; // the directory will be the root
// finish ini
if(dir==null) … // assume the default value, but this doesn't work, so how can I know?

3 个答案:

答案 0 :(得分:3)

  

在EcmaScript定义中,null是“表示故意缺少任何对象值的原始值”,但是我的测试在列表中的JavaScript中找不到它,不包括我认为是Null类型的v = null的情况变种

嗯,您的测试中的所有测试用例都 。我不确定你为什么要排除

Teste.Null = null;

但它会起作用。此外,Teste.Undefined = undefined将与null进行比较。

var result = "";
var Teste = {
    Null: null,
    Undefined: undefined,
    ObjectNew: new Object(),
    StringNew: new String(),
    NumberNew: new Number(),
    ArrayNew: new Array(),
    ObjectLiteral: {},
    StringLiteral: "",
    NumberLiteral: 0,
    ArrayLiteral: [],
    ObjectNull: Object(null),
    StringNull: String(null),
    NumberNull: Number(null),
    ArrayNull: [null]
}
for (var i in Teste) {
    result += "<p>Type "+i+" is"+(Teste[i] == null?"":" not")+" null: "+Teste[i]+"</p>";
}

document.getElementById("result").innerHTML = result;
<div id="result"></div>

  

那么,如果有办法,我们如何才能正确引用空值?

使用value null。不要将它包装在任何东西中,或者你会得到一个包装器(例如你的数组[null])。

如果你想测试数组([])或字符串("")的空白(这是一个与不存在的值不同的概念),您应该检查他们的.length是否为0

var dir = new String(); // should be null

没有。你在这里围绕一个空字符串创建了一个Wrapper对象(你never should need)(你似乎不想要它)。要声明变量,但不初始化它,只需使用

var dir;

var dir = null;

然后它们的值为undefinednull,在if条件中都为== null

答案 1 :(得分:1)

在JavaScript中,null是一个特殊值,一个对象(是的,对象 - null的类型是对象)可以表示它没有值 - 这个不同于它是空的。您可以将{}(空对象)视为空玻璃,而null则意味着玻璃甚至不存在。它也不同于根本没有定义的变量 - 当一个变量被定义,但设置为null时,它有一个地方&#34;保留&#34;将玻璃(或可能是其他东西)放在某个位置,但现在空间没有被占用。

对于您的测试,与''0false进行比较会得到为空消息(仅在使用{{1}时)而不是==用于比较当然)。如果那是你想要实现的目标,可能就是&#34;正确的&#34; (最容易理解)检查变量是否为零或空值(类似于PHP&#39; s empty)的方法是===

答案 2 :(得分:-1)

====编辑====

好吧,我的坏,未定义意味着它的酉化,而null意味着它指向任何东西,没有价值。

http://www.2ality.com/2013/10/typeof-null.html

==== / edit ====

没有null-string或null-type之类的东西。 null没有类型,这意味着变量没有被初始化,换句话说变量指向无处。任何未初始化的变量都是null。 像c ++中的指针一样。指针可以指向任何类型,但如果它未初始化则指向内存中的准随机位置。

SomeType * myVar;

它不为空,如果你使用这个对象你会把事情弄得很糟糕,而且你无法判断它是否是一个有效的指针。

SomeType * myVar = 0;

通过这种方式你可以通过简单地检查它是否为0来判断这是一个未初始化的指针。

在更高级别的语言中,您不必直接处理这些问题

var something:AnyObjectType;

自动为空,a.k.a。未初始化。

测试字符串或数组是否为空是另一个问题。 在php $ var = array(); if($ var)的计算结果为true,因为它是一个实际的对象,而不是null。 empty($ var)将是您用来查看数组实际上是否包含任何内容的检查。 在js中,这将是if(myArray&amp;&amp; myArray.length),看看它是否是一个活物,并看它是否有内容。

字符串可能更棘手,因为其中只包含空格的字符串是具有实际内容的完全有效的对象,但在大多数用例中你会认为它是空的。