在JavaScript中,有两个基本上说'我不存在'的值 - undefined和null.
程序员未分配任何内容undefined的属性将是,但为了使属性成为必需null,null必须明确分配给它.
我曾经认为需要null因为undefined原始价值和null对象.它不是,即使typeof null会产生'object':实际上,两者都是原始值 - 这意味着既不能undefined也不null能从构造函数返回,因为它们都将被转换为空对象(必须抛出错误来宣告构造函数中的失败).
它们也都false在布尔上下文中进行求值.唯一真正的区别我能想到的是,一个计算结果为NaN,其他0的数字环境.
那么为什么会出现这两种情况undefined,null如果这只会让那些null在试图找出属性是否已经设置时错误检查的程序员感到困惑?
我想知道的是,如果有人有一个合理的例子,那就是必须使用null而不是用来表示undefined.
因此,普遍的共识似乎undefined是"没有这样的财产",而null意味着"财产确实存在,但没有价值".
我可以忍受,如果JavaScript实现实际上会强制执行此行为 - 但它undefined是一个完全有效的原始值,因此可以很容易地将其分配给现有属性以破坏此合同.因此,如果要确定属性是否存在,则必须使用in运算符或hasOwnProperty()任何方式.再一次:对于undefined和的单独值的实际用途是null什么?
我实际上undefined在我想要取消设置不再使用但我不想要的属性值时使用delete.我应该用null吗?
我无法理解Option[T]Scala中的课程要点.我的意思是,我不能看到任何advanages None了null.
例如,考虑代码:
object Main{
class Person(name: String, var age: int){
def display = println(name+" "+age)
}
def getPerson1: Person = {
// returns a Person instance or null
}
def getPerson2: Option[Person] = {
// returns either Some[Person] or None
}
def main(argv: Array[String]): Unit = {
val p = getPerson1
if (p!=null) p.display
getPerson2 match{
case Some(person) => person.display
case None => /* Do nothing */
}
}
}
Run Code Online (Sandbox Code Playgroud)
现在假设,该方法getPerson1返回null …
我们注意到在C#(或Java)中开发的软件中存在很多错误会导致NullReferenceException.
有没有理由为什么"null"甚至被包括在语言中?
毕竟,如果没有"空",我就没有错,对吧?
换句话说,如果没有null,语言中的哪些功能无法工作?
我在编译器类中,我们的任务是从头开始创建自己的语言.目前我们的困境是是否包含'null'类型.null提供了什么目的?我们的一些团队认为这不是绝对必要的,而其他人则只是因为它可以提供额外的灵活性.
你有什么想法,尤其是支持或反对null吗?您是否曾创建过需要null的功能?
language-agnostic compiler-construction null language-design
在F#中,它们没有空值并且不想支持它.程序员仍然必须为无类似于C#程序员做出支持!= null.
没有人真的比无效更邪恶吗?
有许多人认为特殊值的概念null(因为它在C,Java,C#,Perl,Javascript,SQL等语言中使用)是一个坏主意.关于SO和P.SE有几个问题,例如没有null的语言的最佳解释和空引用真的是一件坏事吗?.
但是,我找不到任何没有它们的语言.我熟悉的所有语言null或类似的东西(例如Perl中的"undefined").
我意识到,每种语言都需要某种方式来表达"缺乏价值".但是,不是使用"null"或"undefined",而是使用Maybe(Haskell)或Optional(Guava)之类的东西也可以使其显式化.具有"null"或"undefined"的主要区别在于,如果对象具有特定类型(Maybe,Optional ...),则该对象只能具有"无值".相反,"null"/"undefined"通常是每种类型可能的有效值.
在这个意义上,是否存在没有"null"或类似概念的语言?
我知道在编程语言中不需要NULL,我最近决定不在我的编程语言中包含NULL.声明是通过初始化完成的,因此不可能有一个未初始化的变量.我希望这将消除NullPointerException支持更有意义的例外或者根本没有某些类型的错误.
当然,由于语言是用C实现的,因此在封面下会使用NULL.
我的问题是,除了使用NULL作为错误标志(这是用异常处理)或作为数据结构的端点,如链接列表和二叉树(这是由有区别的联合处理)是否有任何其他用例为NULL哪个我应该有解决方案?没有NULL可能会给我带来什么问题吗?
我正在设计一种语言,我想知道默认情况下使引用类型不可为空是否合理,并使用"?" 可以为空的值和引用类型.这有什么问题吗?你会怎么做:
class Foo {
Bar? b;
Bar b2;
Foo() {
b.DoSomething(); //valid, but will cause exception
b2.DoSomething(); //?
}
}
Run Code Online (Sandbox Code Playgroud) 在F#mantra中,似乎有一种内心的避免null,Nullable<T>以及它的同类.作为交换,我们应该使用选项类型.说实话,我并没有真正看到差异.
我对F#选项类型的理解是它允许您指定一个可以包含其任何正常值的类型,或者None.例如,除了之外,还Option<int>允许所有int可以拥有的值None.
我对C#可空类型的理解是它允许你指定一个可以包含任何正常值的类型,或者null.例如,Nullable<int>又名int?允许所有的值的int可具有,除了null.
有什么不同?用Nullable和Option,做一些词汇替换,null并且None,你基本上有相同的东西.有什么大惊小怪的null?
空指针被描述为" 十亿美元的错误 ".某些语言具有无法分配空值的引用类型.
我想知道在设计一种新的面向对象语言时是否应该使用默认行为来防止被赋值为null.然后可以使用特殊版本来覆盖此行为.例如:
MyClass notNullable = new MyClass();
notNullable = null; // Error!
// a la C#, where "T?" means "Nullable<T>"
MyClass? nullable = new MyClass();
nullable = null; // Allowed
Run Code Online (Sandbox Code Playgroud)
所以我的问题是,有没有理由不在新的编程语言中这样做?
编辑:
我想补充一点,我博客上的最新评论指出,当在数组中使用时,非可空类型有一个特殊的问题.我还要感谢大家的有益见解.这非常有帮助,对不起,我只能选择一个答案.
null ×9
f# ×2
java ×2
c# ×1
javascript ×1
monads ×1
non-nullable ×1
nullable ×1
scala ×1
undefined ×1