在测试某些变量是否为空时我遇到了代码问题,并决定用小提琴测试它:
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?
答案 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;
然后它们的值为undefined
或null
,在if条件中都为== null
。
答案 1 :(得分:1)
在JavaScript中,null
是一个特殊值,一个对象(是的,对象 - null
的类型是对象)可以表示它没有值 - 这个不同于它是空的。您可以将{}
(空对象)视为空玻璃,而null
则意味着玻璃甚至不存在。它也不同于根本没有定义的变量 - 当一个变量被定义,但设置为null
时,它有一个地方&#34;保留&#34;将玻璃(或可能是其他东西)放在某个位置,但现在空间没有被占用。
对于您的测试,与''
,0
或false
进行比较会得到为空消息(仅在使用{{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),看看它是否是一个活物,并看它是否有内容。
字符串可能更棘手,因为其中只包含空格的字符串是具有实际内容的完全有效的对象,但在大多数用例中你会认为它是空的。