null值的JavaScript行为是什么?

Gus*_*avo 6 javascript null ecmascript-5

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

测试空值

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;
Run Code Online (Sandbox Code Playgroud)
<div id="result"></div>
Run Code Online (Sandbox Code Playgroud)

结果是:

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:
Run Code Online (Sandbox Code Playgroud)

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

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

另外,我相信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?
Run Code Online (Sandbox Code Playgroud)

Ber*_*rgi 3

在 EcmaScript 定义中,null 是“表示故意不存在任何对象值的原始值”,但根据我的测试,它在 JavaScript at list 中似乎是不可能的,除了 v = null 的情况,我认为它是 Null 类型的 var。

好吧,您测试中的所有测试用例都有一个value。我不确定你为什么排除

Teste.Null = null;
Run Code Online (Sandbox Code Playgroud)

但它会起作用的。另外, aTeste.Undefined = undefined会被比较为等于null

Teste.Null = null;
Run Code Online (Sandbox Code Playgroud)
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;
Run Code Online (Sandbox Code Playgroud)

那么,如果有办法的话,我们如何正确引用空值呢?

使用该null。不要将它包裹在任何东西中,否则你会在它周围得到一个包装器(例如你的 array [null])。

如果您想测试数组 ( []) 或字符串 ( "") 是否为(这与值不存在是不同的概念),您应该检查它们是否.length0

var dir = new String(); // should be null
Run Code Online (Sandbox Code Playgroud)

不。您已经在此处的空字符串(您似乎想要)周围创建了一个 Wrapper 对象(您永远不需要该对象)。要声明一个变量,但不初始化它,只需使用

var dir;
Run Code Online (Sandbox Code Playgroud)

或者

var dir = null;
Run Code Online (Sandbox Code Playgroud)

然后它们将具有值undefinedor null,这两个值都== null在您的 if 条件中。