null值的JavaScript行为是什么?
null值的JavaScript行为是什么?
在测试一些变量是否为空时,我遇到了一个代码问题,决定在fiddle中进行测试:\nTesting null values\n
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 += "Type " + i + " is null: " + Teste[i] + ""; } else { result += "Type " + i + " is not null: " + Teste[i] + ""; } } document.getElementById("result").innerHTML = result;
\n
\n结果如下:\n
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:
\n我在Safari中进行了测试,结果相同。\n我同时在php和JS中编码,对调整我的思维感到困惑。在php中,$var = array()返回NULL,但在JavaScript中,似乎没有任何类型的null值。在EcmaScript定义中,null是“表示任何对象值的故意不存在的原始值”,但在我的测试中,它似乎在JavaScript中是不可能的,除了v = null的情况,我认为它是一个Null类型的变量。\n此外,我认为AS3遵循ecmascript的概念,通过从值中分离类型,var语句“构建”一个与值分开的对象。\n那么,如果有方法的话,我们应该如何正确地引用null值呢?\n编辑\n我在遇到这种情况时进行了这个测试:我创建了一个变量,它具有图形库的相对目录。如果这个变量为空,意味着我不希望在软件初始化阶段改变它的默认值(我有一个带有默认值的表),因此系统只会为目录添加正确的http基础目录。如果变量不为空,它将假定该值刚刚被赋给它。但如果它是一个空格,意味着目录是根目录,但将被视为null,从而产生错误。\n动态:\n
var dir = new String(); // 应该是null // 初始化 dir = ""; // 目录将是根目录 // 初始化完成 if(dir==null) … // 假定默认值,但这不起作用,那么我怎么知道呢?
null值在JavaScript中的行为是什么?
在JavaScript中,null值表示一个变量未被初始化,即变量指向了一个空的位置,没有任何值。与之相对的,undefined表示一个变量未定义,即变量没有被声明或者不在作用域范围内。任何未初始化的变量都是null值。
与C++中的指针类似,指针可以指向任何类型的数据,但如果未初始化,它会指向内存中的一个准随机位置。例如,SomeType* myVar; 是未初始化的指针,使用这个对象会导致严重错误,并且无法判断指针是否有效。而 SomeType* myVar = 0; 这种方式可以通过检查是否为0来判断是否为未初始化的指针。
在高级语言中,不需要直接处理这些问题,所以 var something:AnyObjectType; 会自动被设置为null,即未初始化。
判断一个字符串或数组是否为空是另一个问题。在PHP中,$var = array(); if($var) 的结果为true,因为它是一个实际的对象,而不是null。判断数组是否有内容可以使用 empty($var)。在JavaScript中,可以使用 if(myArray && myArray.length) 来判断是否为一个有内容的对象。
字符串可能会更加复杂,因为只包含空格的字符串在大多数情况下被认为是空的,但实际上它是一个有效的对象并且有内容。
需要注意的是,null并不意味着变量未初始化,未初始化的变量是undefined。null是一个值,而不是一个变量的状态。
JavaScript引擎没有办法像处理内存一样处理null指针或未初始化的C++变量。
尽管null和undefined在JavaScript中有不同的概念,但我们可以进行比较,因为它们都是用来处理相同的底层问题/情况。JavaScript引擎并没有一种神奇的方法来处理内存。
需要注意的是,null是一个类型,typeof运算符在判断null类型时会出错。
总结起来,null值在JavaScript中表示变量未被初始化,而undefined表示变量未定义。我们可以使用if语句来判断一个对象是否为空,并且需要注意null是一个类型,typeof运算符会判断错误。
在JavaScript中,null是一个特殊的值,表示一个对象(是的,null的类型是object)没有值 - 这与它为空是不同的。你可以把{}(空对象)看作是一个空玻璃杯,而null意味着这个杯子甚至不存在。它也不同于变量根本没有被定义 - 当一个变量被定义,但被设置为null时,它有一个"保留"位置来放置玻璃杯(或可能是其他东西),但现在这个空间没有被占用。
至于你的测试,与''、0或false进行比较将会得到“is null”消息(仅在使用==而不是===进行比较时)。如果这是你想要实现的目标,可能"正确"(最容易理解)的检查变量是否具有零值或空值(类似于PHP的empty)的方法是if (!variable)...
是的,我使用(!variable)来检测null值(例如:函数的参数),但它非常通用,因为它会转换为false。我在想是否有类似varName:String = null(真正的null字符串)的东西,但似乎JS不遵循这种方法,对吗?
据我所知,没有这样的东西,但我不确定我是否理解在哪种情况下null字符串会有用(或者说,在弱类型语言中,null字符串应该与空字符串有什么区别)?
要测试一个值是否真正为null而不是"假值",请使用===运算符:var foo = null; console.log(foo === null)
fstanis: 我有一些情况需要知道用户是否真的想使用某个文本框。我不知道他是想让文本框保持空白(他想要,但现在不想)还是根本不想要这个文本框。解决办法是在旁边放一个复选框,而不是null按钮,另一个变量将存储null信息。
在EcmaScript的定义中,null是表示“有意没有任何对象值”的原始值,但根据我的测试,这在JavaScript中似乎是不可能的,除非v = null这种情况,我认为这是Null类型的变量。
好吧,你测试中的所有测试用例都有一个值。我不确定为什么你排除了Teste.Null = null,但它应该也可以工作。另外,Teste.Undefined = undefined将被视为等于null。
那么我们应该如何正确引用null值,如果有的话?
使用value null。不要将其包裹在任何东西中,否则会得到一个包装器(例如你的数组[null])。
如果你想测试数组([])或字符串("")的空值(这是一个与值不存在不同的概念),你应该检查它们的.length是否为0。
var dir = new String(); // should be null
不。你在这里创建了一个包装对象(你永远不应该需要),它将一个空字符串(你似乎不想要)包裹起来。要声明一个变量,但不初始化它,只需使用var dir;或var dir = null;然后它们的值将为undefined或null,这两者在你的if条件中都是== null。
你意识到你正在使用undefined类型的变量或null类型来“模拟”一个null值吗?拥有值或没有值是概念性的(0 == null?)。这个讨论很酷,但也许我给这个论坛带来了一个概念性的问题。而且我认为你离答案很近:JavaScript中没有null值,我们可以模拟它。请注意,在最后,我们不知道dir是一个字符串,因为JS允许类型变异,我们可以使用它,但我们应该在注释中记录,否则可能会产生混淆甚至错误。
我不确定你对“null值”的理解是什么,显然你不是指JavaScript的null值。你是在寻找类似于“可为空类型”或Option的东西吗?是的,如果打算将一个变量保留为undefined,添加一个注释是适当的,但是明确赋值null应该足够了。
相关链接:在JavaScript中null和undefined有什么区别?以及null是一个对象,null和undefined之间有什么区别?
我的对null值的理解是通过在php和AS3中编码形成的,我后来才开始使用JavaScript(作为一种语言)并带有一些先入为主的观念。这个观念是错误的,唯一允许null值的变量是Null类型,在JavaScript中。我将你的答案视为正确,因为我认为其他程序员会通过我的问题和你的答案来解决他们的问题,但我认为你似乎有点“封闭”。我的建议是你再次阅读一下EcmaScript关于null值的概念。此外,我将String Wrapper Object视为构造函数,所以在编写JS代码之前我应该换眼镜!
我不认为null值在这些语言中有什么不同(虽然我不了解AS),只有PHP在使用宽松类型时比JavaScript更奇怪。在Js中,您不需要将其与null进行比较以识别0或"",您只需将它们用作布尔值即可-它们是“假值”。是的,我的答案仅基于ES规范 🙂
在AS3和PHP中,可以创建一个具有null值的对象,因此与null的==比较结果并不意味着类型是undefined。正如你所回答的,JavaScript将null视为“值对象”,正如ES定义的那样,但是作为类型未定义的结果(你不知道创建的是哪种类型的瓶子,因此无法初始化值,所以是null)。如果类型已定义,则分配一个初始值,正如你所说,它将永远不会为空。在日常编码中并没有太大的区别,但在概念上意义重大。