为什么在JavaScript中将null视为object

正在检查

if ( object == null )Do something

与...相同

if ( !object )Do something

并且:

nullundefined什么区别?


#1楼

理解null和undefined的一种方法是了解每种情况的发生位置。

在以下情况下,期望返回空值:

  • 查询DOM的方法

     console.log(window.document.getElementById("nonExistentElement")); //Prints: null 
  • 从Ajax请求收到的JSON响应

{name: "Bob",address: null}
  • RegEx.exec 。

  • 不断变化的新功能。 以下返回null:

var proto = Object.getPrototypeOf(Object.getPrototypeOf({}));// But this returns undefined:Object.getOwnPropertyDescriptor({}, "a");

所有其他不存在的情况都由undefined表示(如@Axel所示)。 以下每个打印“未定义”:

    var uninitalised;console.log(uninitalised);var obj = {};console.log(obj.nonExistent);function missingParam(missing){console.log(missing);}missingParam();var arr = [];console.log(arr.pop());

当然,如果您决定写var unitialized = null; 或自己从方法返回null,则在其他情况下会出现null。 但这应该很明显。

第三种情况是您要访问变量,但您甚至不知道它是否已声明。 对于这种情况,请使用typeof以避免引用错误:

if(typeof unknown !== "undefined"){//use unknown
}

总之,在处理DOM,处理Ajax或使用某些ECMAScript 5功能时,请检查是否为null。 对于所有其他情况,可以使用严格的相等性检查undefined是安全的:

if(value === undefined){// stuff
}

#2楼

要补充此页面上的 JavaScript权威指南中的undefinednull之间的区别什么

您可能认为undefined表示系统级,意外或类似错误的值null ,而null表示程序级,正常或预期的值缺失。 如果您需要将这些值之一分配给变量或属性或将这些值之一传递给函数,则null几乎总是正确的选择。


#3楼

JavaScript中许多不同的空检查的比较:

http://jsfiddle.net/aaronhoffman/DdRHB/5/

// Variables to test
var myNull = null;
var myObject = {};
var myStringEmpty = "";
var myStringWhiteSpace = " ";
var myStringHello = "hello";
var myIntZero = 0;
var myIntOne = 1;
var myBoolTrue = true;
var myBoolFalse = false;
var myUndefined;...trim...

http://aaron-hoffman.blogspot.com/2013/04/javascript-null-checking-undefined-and.html


#4楼

以下功能说明了原因并能够解决差异:

function test() {var myObj = {};console.log(myObj.myProperty);myObj.myProperty = null;console.log(myObj.myProperty);
}

如果你打电话

test();

你正在

未定义

空值

第一个console.log(...)试图在尚未定义的myObj获取myProperty因此它返回“未定义”。 在为它分配了null之后,第二个console.log(...)显然会返回“ null”,因为myProperty存在,但已为其分配了null值。

为了能够查询这种差异,JavaScript具有nullundefined :尽管null是-就像在其他语言中一样,object, undefined不能是对象,因为没有可用的实例(甚至不是null实例)。


#5楼

摘自Nicholas C. Zakas的“面向对象Javascript的原理”

但是为什么类型为null的对象呢? (实际上,这是设计和维护JavaScript的委员会TC39承认的错误。您可能会认为null为空对象指针,使“对象”成为逻辑返回值,但这仍然令人困惑。)

扎卡斯(Nicholas C.)(2014-02-07)。 面向对象JavaScript的原理(Kindle位置226-227)。 没有淀粉新闻。 Kindle版。

说:

var game = null; //typeof(game) is "object"game.score = 100;//null is not an object, what the heck!?
game instanceof Object; //false, so it's not an instance but it's type is object
//let's make this primitive variable an object;
game = {};
typeof(game);//it is an object
game instanceof Object; //true, yay!!!
game.score = 100;

未定义的情况:

var score; //at this point 'score' is undefined
typeof(score); //'undefined'
var score.player = "felix"; //'undefined' is not an object
score instanceof Object; //false, oh I already knew that.

#6楼

考虑“空”的最好方法是回忆一下在数据库中如何使用类似的概念,它表示一个字段“根本没有任何值”。

  • 是的,该物品的价值是已知的; 它 “定义的”。 它被初始化。
  • 该项目的值是: “没有值”。

这对于编写更易于调试的程序是非常有用的技术。 “未定义”变量可能是错误的结果…… (您怎么知道?) ……但是,如果变量包含值“ null”,则您会知道“有人在该程序的某个位置, 将其设置为因此,我建议当您需要删除变量的值时,请不要“删除”,而是将其设置为“空”。 旧值将被孤立,不久将被垃圾回收; 新值是“没有值(现在)”。 在这两种情况下,变量的状态都是确定的:“显然,它是故意这样做的。”


#7楼

与未定义相比,null的另一个有趣之处在于它可以递增。

 x = undefined x++ y = null y++ console.log(x) // NaN console.log(y) // 0 

这对于设置计数器的默认数值很有用。 您在变量声明中将变量设置为-1多少次?


#8楼

  1. 未定义表示已声明变量,但尚未分配任何值,而可以将Null分配给表示“无值”的变量。(Null是赋值运算符)

2. Undefined是类型本身,而Null是对象。

3 Javascript本身可以将任何未分​​配的变量初始化为undefined,但是永远不能将变量的值设置为null。 这必须以编程方式完成。


#9楼

Javascript中, null不是object类型,它是primitave类型。

有什么区别? 未定义是指尚未设置的指针。 Null表示空指针,例如,某些东西已手动将变量设置为null类型


#10楼

看这个:

   <script>
function f(a){alert(typeof(a));if (a==null) alert('null');a?alert(true):alert(false);
}
</script>//return:
<button onclick="f()">nothing</button>    //undefined    null    false
<button onclick="f(null)">null</button>   //object       null    false
<button onclick="f('')">empty</button>    //string               false
<button onclick="f(0)">zero</button>      //number               false
<button onclick="f(1)">int</button>       //number               true
<button onclick="f('x')">str</button>     //string               true

#11楼

问题的第一部分:

为什么在JavaScript中将null视为对象?

这是一个JavaScript设计错误,目前无法修复。 它应该是null类型,而不是object类型,或者根本没有。 在检测真实对象时,它需要进行额外的检查(有时被遗忘),并且是错误的来源。

问题的第二部分:

正在检查

if (object == null)
Do something

与...相同

if (!object)
Do something

除以下几点外,这两项检查始终均为假:

  • object未定义或为null:均为true。

  • object是基本类型,并且为0, ""或false:第一次检查false,第二次检查true。

如果对象不是原始对象,而是真实的对象(例如new Number(0)new String("")new Boolean(false) ,则两个检查都为false。

因此,如果“对象”被解释为表示真实对象,则两个检查始终相同。 如果允许使用原语,则对于0, ""和false的检查是不同的。

object==null类的情况下,不明显的结果可能是错误的来源。 绝不建议使用== ,而应使用===

问题的第三部分:

并且:

null和undefined有什么区别?

在JavaScript中,一个区别是null为object类型,而undefined为undefined类型。

在JavaScript中, null==undefined为true,如果类型被忽略,则视为相等。 为什么他们决定,但0, ""和false不相等,我不知道。 这似乎是一个任意看法。

在JavaScript中, null===undefined不是true,因为类型必须在===相同。

实际上,null和undefined是相同的,因为它们都表示不存在。 因此,0和""也是如此,也许还有空容器[]{} 。 如此多的相同类型的东西都是导致错误的良方。 一种或根本没有更好。 我会尝试使用尽可能少的。

'false','true'和'!' 是另一种可以简化的蠕虫,例如,仅if(!x)if(x)就足够了,您不需要true和false。

如果没有给出值,则声明的var x的类型为undefined,但是它应该与从未声明过x的变量相同。 另一个错误源是一个空的无容器。 因此,最好像var x=1一样一起声明和定义它。

人们四处走动,试图找出所有这些类型的虚无,但都是一件复杂而又不同的衣服。 现实是

undefined===undeclared===null===0===""===[]==={}===nothing

也许所有人都应该抛出异常。


#12楼

null 不是对象 ,它是原始值 。 例如,您不能向其添加属性。 有时人们会错误地认为它是一个对象,因为typeof null返回"object" 。 但这实际上是一个错误(甚至可以在ECMAScript 6中修复)。

nullundefined之间的区别如下:

  • undefined :由JavaScript使用,表示“无价值”。 未初始化的变量,缺失的参数和未知变量具有该值。

     > var noValueYet; > console.log(noValueYet); undefined > function foo(x) { console.log(x) } > foo() undefined > var obj = {}; > console.log(obj.unknownProperty) undefined 

    但是,访问未知变量会产生异常:

     > unknownVariable ReferenceError: unknownVariable is not defined 
  • null :程序员使用它来表示“无值”,例如作为函数的参数。

检查变量:

console.log(typeof unknownVariable === "undefined"); // truevar foo;
console.log(typeof foo === "undefined"); // true
console.log(foo === undefined); // truevar bar = null;
console.log(bar === null); // true

通常,应该在JavaScript中始终使用===且永远不要使用==(==会执行各种可能产生意外结果的转换 )。 校验x == null是一种边缘情况,因为它适用于nullundefined

> null == null
true
> undefined == null
true

检查变量是否具有值的一种常见方法是将其转换为布尔值,然后查看其是否为true 。 该转换由if语句和布尔运算符执行! (“不”)。

function foo(param) {if (param) {// ...}
}
function foo(param) {if (! param) param = "abc";
}
function foo(param) {// || returns first operand that can't be converted to falseparam = param || "abc";
}

这种方法的缺点:以下所有值均评估为false ,因此您必须小心(例如,上述检查不能区分undefined0 )。

  • undefinednull
  • 布尔值: false
  • 数字: +0-0NaN
  • 字符串: ""

您可以通过使用Boolean作为函数来测试到boolean的转换(通常是构造函数,与new一起使用):

> Boolean(null)
false
> Boolean("")
false
> Boolean(3-3)
false
> Boolean({})
true
> Boolean([])
true

#13楼

null是一个对象。 其类型为null。 undefined不是对象; 其类型未定义。


#14楼

null和undefined有什么区别?

没有定义的属性未定义。 null是一个对象。 它的类型是对象。 null是一个特殊值,表示“无值。undefined不是对象,类型是undefined。

您可以声明一个变量,将其设置为null,其行为是相同的,除了看到的是“ null”而不是“ undefined”。 您甚至可以将未定义的变量与null进行比较,反之亦然,条件将为true:

 undefined == nullnull == undefined

有关更多详细信息,请参见JavaScript与null和undefined之间的区别 。

和您的新编辑

if (object == null)  does mean the same  if(!object)

在测试object是否为false时,它们都仅在测试false时满足条件,而在true时不满足条件

检查这里: Javascript陷阱


#15楼

例如, window.someWeirdProperty是未定义的,因此

"window.someWeirdProperty === null"计算结果为false

"window.someWeirdProperty === undefined"计算结果为true。

此外checkif if (!o)是不一样的检查if (o == null)ofalse


#16楼

var x = null;

x定义为null

y未定义; //因为我没有定义它

if (!x)

null被评估为false


#17楼

对于值相等,null和undefined均为false(null == undefined):它们都折叠为布尔值false。 它们不是同一对象(null!== undefined)。

undefined是全局对象的属性(浏览器中为“窗口”),但它是原始类型,而不是对象本身。 这是未初始化的变量和函数的默认值,这些变量和函数以没有return语句的形式结束。

null是Object的实例。 对于用于返回集合对象以指示为空结果的DOM方法,将使用null,该方法将提供false值而不指示错误。


#18楼

区别可以总结为以下代码段:

alert(typeof(null));      // object
alert(typeof(undefined)); // undefinedalert(null !== undefined) //true
alert(null == undefined)  //true

检查

object == null不同于检查if ( !object )

后者等于! Boolean(object) ! Boolean(object) ,因为一元! 运算符会自动将正确的操作数转换为布尔值。

由于Boolean(null)等于false,所以!false === true

因此,如果您的对象不是null而是 false0“” ,则检查将通过,因为:

alert(Boolean(null)) //false
alert(Boolean(0))    //false
alert(Boolean(""))   //false

#19楼

(name is undefined)

你: name什么? (*)
JavaScript: name ? 叫什么name ? 我不知道你在说什么 您以前从未提到过任何name 。 您是否在(客户端)看到其他脚本语言?

name = null;

你: name什么?
JavaScript:我不知道。

简而言之; undefined是不存在事物的概念的地方; 它没有类型,并且在该范围内从未被引用过; null是已知的事物存在的地方,但是它的值是未知的。

要记住的一件事是,从概念上讲, nullfalse""等并不相同,即使它们在类型转换之后相等,即

name = false;

你: name什么?
JavaScript:布尔值false。

name = '';

你: name什么?
JavaScript:空字符串


*:在此上下文中, name含义是从未定义的变量。它可以是任何未定义的变量,但是name几乎是任何HTML表单元素的属性。它沿路前进,早在id之前就已建立。这很有用,因为id必须是唯一的,但名称不必是唯一的。


#20楼

一些精度:

null和undefined 两个不同的值。 一个代表缺少名称的值,而另一个代表缺少名称。


ifif( o )进行以下操作, if( o )会发生什么:

评估括号o中的表达式,然后执行if强制将括号中表达式的值强制类型化(在我们的情况下为o

JavaScript中的Falsy(将被强制转换为false)的值为: ”,null,undefined,0和false

为什么null为对象,并且null和undefined有什么区别?相关推荐

  1. 判断JavaScript对象为null或者属性为空

    http://blog.csdn.net/yiluoak_47/article/details/7766760 首先说下null与undefined区别: 对已声明但未初始化的和未声明的变量执行typ ...

  2. null?对象?异常?到底应该如何返回错误信息

    null?对象?异常?到底应该如何返回错误信息 参考文章: (1)null?对象?异常?到底应该如何返回错误信息 (2)https://www.cnblogs.com/dsj2016/p/748208 ...

  3. JavaScript技术篇 - js的null值判断,js的undefined的判断,js的null与undefined的2种区分方法

    undefined 和 null 用 == 比较是相等的,我们可以有两种方法来进行区分. 区别方法一: 因为他们的类型时不同的,=== 会先比较类型,再比较值,所有可以直接用 === 来进行区分. n ...

  4. Java的if判断对象为null时,null放在比较运算符的左边还是右边较好?

    如java中:if(name == null)和if(null == name)有什么讲究吗? 答:在java里面,它们是一样的.但是通常写为null == name.这其实是在C语言里面引申出来的. ...

  5. java 垃圾回收 null_java方法中把对象置null,到底能不能加速垃圾回收

    今天逛脉脉,看见匿名区有人说java中把对做置null,这种做法很菜,不能加速垃圾回收,但是我看到就觉得呵呵了,我是觉得可以加速置null对象回收的. 测试的过程中,费劲的是要指定一个合理的测试堆大小 ...

  6. Introduce Null Object(引入Null 对象)

    一而再,再而三地检查对象是否null public class Site {private Customer customer;public Customer getCustomer() {retur ...

  7. Introduce Null Object(引入Null对象)

    Introduce Null Object(引入Null对象) 你需要再三检查某对象是否为null. 将null值替换为null对象. if (customer == null) plan = Bil ...

  8. Java基础学习总结(127)——Java方法应该返回空对象还是null

    Java方法应该返回空对象还是null? 大多数情况下就是在需要返回值的方法中,使用空对象(empty object)来代替返回null.理由很简单,空对象与其他有意义的对象一样,使得调用方法的用户不 ...

  9. Scala的null/空对象

    引言 在Java中,我们通常用一个null来表示引用的缺失.但是,这样的做法会在代码里产生大量的判空逻辑: //常用的判空逻辑 if(null == someObejct){... ... }else ...

最新文章

  1. linux命令:返回上一次目录
  2. UDP广播之socket bad address 错误被解决,舒服
  3. DOM——创建节点及节点属性与内部插入append()和appendTo()
  4. compare to造句及翻译_compare to造句
  5. 如何借助Kubernetes实现持续的业务敏捷性
  6. 设计原本思维导图笔记
  7. .Net中俩种使用不定参数的方法
  8. VSCode 拓展插件推荐
  9. android studio安卓订餐管理系统
  10. 华硕aura完全卸载_更快,更信仰,华硕RTX 2070电竞显卡
  11. 打印纸张尺寸换算_电脑打印纸规格全记录
  12. REST API 是什么?
  13. RHEL Linux 8.3 通过 BIND 实现 DNS 基本功能
  14. 直播带货系统,实现一套完整的直播系统应该具备的功能
  15. 键盘鼠标是计算机标准输入输出设备,微型计算机输入输出设备之键盘和鼠标(ppt 32页).ppt...
  16. 【钛媒体】人人不死,只是凋零
  17. 招生1400名!这所985高校发布2023年博士研究生招生简章!
  18. 回顾整个房子调频发射机
  19. ConstraintLayout的理解和相关术语的解释
  20. 如何引领万亿休闲零食市场新消费浪潮?三只松鼠提供了一种思路

热门文章

  1. 如何成为一个优秀的从程序员
  2. NetScaler Networking Deployment
  3. Linux编程学习--开篇
  4. Linux之磁盘挂载
  5. Leetcode 24——Swap Nodes in Pairs
  6. 第三章:3.4 处理登陆的请求
  7. 浮动float的一些规则
  8. 关于Romoting又一例
  9. Winodws 10中pyCharm 2017安装
  10. 利用 Zabbix 监控 mysqldump 定时备份数据库是否成功