我知道undefined不等于null。但是在其他语言中是否有类似的概念,如c#,C ++或java?
答案 0 :(得分:4)
您列出的所有语言(C#,C ++,Java)都是statically-typed languages。在静态类型语言中,您需要在编译时知道每个表达式的类型,因此将事物设置为“未定义”通常没有意义,因为它将是类型错误。正如您已经指出的那样,在大多数静态类型语言中,空指针/引用可能是您接近“未定义”值的最接近的东西。
JavaScript是dynamically-typed,这就是undefined
的原因。如果您查看其他动态类型语言,您可以找到类似的概念。例如,Python的None
值与JavaScript中的undefined
有一些相似之处。
答案 1 :(得分:2)
除了@DaoWen的例子......
Perl有一个undefined value(通常缩写为“undef”),与null或0分开。可以使用defined进行测试,通常表示发生了运行时错误(异常未使用时) )。在布尔上下文中,它被视为false。你可以通过......获得它。
my $foo;
sub foo { return; }
$foo = undef;
SQL具有NULL值。与未定义的值不同,它不是假的。它是3rd boolean state,既不是真也不是假。这种三元逻辑经常使那些可能将NULL与false混淆的人绊倒。
答案 2 :(得分:0)
javascript有未使用的变量和属性默认为undefined,以帮助防止写得不好的网页完全失败。大多数其他语言具有必须有意使用的类似功能。静态类型语言具有额外的限制,即必须声明属性或变量的类型,这通常意味着变量可能为NULL,但不会完全未定义(它具有类型)。另一方面,如果对象上不存在该属性,则大多数面向对象的语言都能够查找属性并将其返回或返回指定的替换。考虑:
class Undefined(object):
pass
a=object()
b=getattr(a,'b',Undefined)
print b is Undefined
将打印True
。
Java有类似的能力,但当然你必须知道属性的类型是什么,你会看到它与反射一起使用。我假设c ++有类似的东西,但我不知道任何细节。
作为旁注,您可以在Python中的类和模块级别使用一些温和的黑魔法实现Undefined。在类的__getattribute__
方法中,如果属性不在类的属性中,则返回Undefined
,然后创建types.ModuleType
的子类并在其上定义__getattribute__
这也会返回Undefined
,但我建议在做之前先仔细考虑,因为我看不到你真的希望任何名字引用一个值的情况,即使它是一个错字...