javascript中undefined与null的区别

来详细讲解一下 JavaScript 中 undefined 与 null 的区别。

概述

JavaScript 中的 undefined 和 null 都是表示值的不存在或无效。它们两者很相似,但又有所不同。下面我们来逐个解释。

undefined

undefined 代表某个变量未被定义,或者存在但没有被赋值。在以下三种情况中,变量的值将默认为 undefined:

  • 给未声明过的变量赋值时;
  • 函数没有显式地返回值时;
  • 对象中没有命名的属性。

下面是一些示例:

var x; // 声明但未被赋值
console.log(x); // undefined

function foo() {}
console.log(foo()); // undefined

var obj = { a: 1 };
console.log(obj.b); // undefined

null

undefined 不同,null 表示某个变量被定义了,但无值可用。在以下两种情况中,可以将变量值赋为 null:

  • 用于清空变量中的引用数据类型(如对象、数组)的值;
  • 等待服务器响应时,可以将变量值初始化为 null。

以下是一些示例:

var x = null; // 变量已被定义,但赋值为 null
console.log(x); // null

var obj = null;
obj = { a: 1 }; // 赋值为一个对象
console.log(obj); // { a: 1 }
obj = null; // 清空变量中的对象值
console.log(obj); // null

区别

总结一下,undefined:未定义、值为 undefined,通常是变量声明后未被赋值或者没有返回值;null:已定义但没有值可用,通常用于清空变量中的对象值或者变量初始化。

所以我们可以这样区分:未定义的变量其默认值为 undefined,已定义但未被赋值的变量也默认为 undefined;而 null 是一个已定义的空值。

示例:

var x;
console.log(x); // undefined

var y = null;
console.log(y); // null

示例

示例 1

下面的代码中,我们定义了一个对象,并且给它赋值为 null,之后再打印出来。但是这段代码会打印出 { a: null } 而不是 null

var obj = { a: null };
console.log(obj.a); // null
console.log(obj.b); // undefined

原因是虽然在上面将变量 obj 赋值为 null,意味着这个变量并没有值可以使用了,但是它实际上已经被定义了。因此,打印出 obj 将仍然会得到一个对象,只是这个对象的属性 a 值为 null。

示例 2

我们在调用函数时,如果未传递预期的参数,则函数中的那个参数被定义为 undefined,而不是 null。

function foo(a, b) {
  console.log(a); // undefined
  console.log(b); // null
}

foo(undefined, null);

在以上例子中,我们将 foo 函数的第一个参数设置为 undefined,第二个参数设置为 null,所以第一个参数的值为 undefined,第二个参数的值为 null。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:javascript中undefined与null的区别 - Python技术站

(0)
上一篇 2023年5月26日
下一篇 2023年5月26日

相关文章

  • 基于Spring Security的Oauth2授权实现方法

    下面是详细讲解“基于Spring Security的Oauth2授权实现方法”的完整攻略。 什么是OAuth2 OAuth2是一个授权协议,可以使用户在第三方应用中提供安全的访问API和资源,而无需将用户凭证(例如,用户名和密码)直接提供给第三方应用。 OAuth2的流程通常包括以下步骤: 第三方应用向资源服务器申请访问API的授权; 资源服务器向用户询问授…

    Java 2023年5月20日
    00
  • SpringBoot启动原理深入解析

    SpringBoot启动原理深入解析 什么是SpringBoot? SpringBoot是基于Spring框架的一套快速开发框架,采用约定优于配置的思想,目的在于简化Spring应用的创建和开发过程。 SpringBoot启动过程 SpringBoot启动过程涉及到的类和接口有很多,下面对SpringBoot启动过程的核心部分做一个简单的介绍。 Spring…

    Java 2023年5月15日
    00
  • Java虚拟机JVM之server模式与client模式的区别

    Java虚拟机JVM之server模式与client模式的区别 1. 背景 在Java应用程序执行过程中,Java虚拟机(JVM)是一个关键的组件,负责将Java字节码解释成可执行的机器指令。为了提高应用程序的性能,JVM提供了不同的启动模式来适应不同的运行环境。 JVM支持两种启动模式:client模式和server模式。本文将详细讲解这两种启动模式之间的…

    Java 2023年5月26日
    00
  • 从零开始让你的Spring Boot项目跑在Linux服务器

    首先我们来讲解“从零开始让你的Spring Boot项目跑在Linux服务器”的攻略。 准备工作 在将Spring Boot项目跑在Linux服务器之前,需要先确保我们已经满足以下条件: 已经有一台Linux服务器,并且可以通过SSH连接; 已经安装好Java Runtime Environment(JRE); 已经下载好我们的Spring Boot项目并打…

    Java 2023年5月19日
    00
  • feign调用中文参数被encode编译的问题

    当我们使用Feign进行调用时,如果参数中含有中文或其他非ASCII字符,我们会发现这些参数被自动编码了,而且编码方式并不是我们常见的UTF-8,这就需要我们进行一些额外的配置来解决这个问题。 一般情况下,我们需要在Feign配置中添加一个编码器类,用于将参数编码成UTF-8格式,例如: @Configuration public class FeignCo…

    Java 2023年5月20日
    00
  • 使用Java代码进行因数分解和求最小公倍数的示例

    当我们需要在Java程序中进行因数分解和求最小公倍数的计算时,我们可以选择使用Java自带的Math类中的方法。下面我会分别介绍解题思路和代码实现。 因数分解 对于因数分解,我们可以利用Math类中的sqrt()方法求出目标数的平方根,然后从2开始递增,试图将其除尽,直到除不了为止。具体实现如下: /** * 因数分解 * * @param n 待分解的数 …

    Java 2023年5月19日
    00
  • vue.js数据响应式原理解析

    Vue.js数据响应式原理解析 Vue.js是一个极易上手,功能强大的Javascript框架,它的核心就是数据响应式系统。在Vue.js中,我们可以轻松的绑定数据和视图,而这一切都得益于Vue.js的数据响应式系统。在本篇文章中,我们将深入剖析Vue.js数据响应式原理。 数据响应式系统란? Vue.js的数据响应式系统简单来说,就是一种将ViewMode…

    Java 2023年5月23日
    00
  • 为何Java单例模式我只推荐两种

    Java单例模式是一种设计模式,它确保一个类在任何时间内只有一个实例,并提供一种全局访问该实例的方式。单例模式在许多场景中都很有用,例如线程池、数据库连接池、日志工具等。 在Java的单例模式实现中,有很多方法,但是只有少数几种方法被广泛认为是最有效、最稳定、最可靠的。本文将介绍这些最流行的两种Java单例模式实现,同时详细讲解它们的优点和缺点。 饿汉式单例…

    Java 2023年5月26日
    00
合作推广
合作推广
分享本页
返回顶部