0

0

全面解析JavaScript中null

WBOY

WBOY

发布时间:2022-09-13 17:30:35

|

3410人浏览过

|

来源于脚本之家

转载

本篇文章给大家带来了关于javascript的相关知识,null是一种原始类型,表示有意不包含任何对象值,下面就来看一下 javascript 中的 null 的一切: 它的含义,如何检测它,null 和 undefined 之间的区别,以及为什么大量使用 null 会造成代码维护困难等,希望对大家有帮助。

全面解析JavaScript中null

【相关推荐:javascript视频教程web前端

JavaScript 有两种类型:原始类型(strings, booleans, numbers, symbols)和对象

对象是一个复杂的数据结构。最简单的 JavaScript 对象是普通对象 —— 键和相关值的集合

立即学习Java免费学习笔记(深入)”;

let myObject = {
  name: 'Eric Cartman'
};

但是很多情况下不能创建一个对象。在这种情况下,JavaScript 提供了一个特殊的值 null —— 表示缺少对象

let myObject = null;

在这篇文章中,你将学习关于 JavaScript 中的 null 的一切: 它的含义,如何检测它,nullundefined 之间的区别,以及为什么大量使用 null 会造成代码维护困难等

1.null 的概念

JavaScript 规范中这么描述 null

null 是一种原始类型,表示有意不包含任何对象值

如果您看到 null(分配给变量或由函数返回),那么在那个位置原本应该是一个对象,但由于某种原因,一个对象没有创建

比如,函数 greetObject() 创建对象,但也可以在无法创建对象时返回 null:

function greetObject(who) {
  if (!who) {
    return null;
  }
  return { message: `Hello, ${who}!` };
}

greetObject('Eric'); // => { message: 'Hello, Eric!' }
greetObject();       // => null

当上面的函数中传入一个字符串参数时,如预期的,函数返回一个对象 { message: 'Hello, Eric!' }

但是,函数中不传任何参数时,该函数返回 null。返回 null 是合理的,因为 who 参数没有值,导致 greeting 对象无法创建

1.1 null 的一个比较贴切的比喻

考虑关于 null 的一个比较贴切的比喻,你可以把变量想象成一个盒子。就像变量可以容纳对象一样,盒子也可以容纳像茶壶等的物品

但一旦你收到一个盒子,打开它,什么也没有!有人弄错了,给了你一个空盒子。该盒子不包含任何内容,或者换句话说,它包含一个 null

2. 如何去检测 null

检查 null 好方法是使用严格相等运算符

const missingObject = null;
const existingObject = { message: 'Hello!' };

missingObject  === null; // => true
existingObject === null; // => false

missingObject === null 的结果为 true,因为 missingObject 变量包含一个 null 值。如果变量包含非空值,比如对象,则表达式 existingObject === null 的结果为 false

2.1 null 是一个假值

nullfalse、0、"、undefinedNaN 都是假值。如果在条件语句中遇到它们,那么 JavaScript 将把它们强制为 false

Boolean(null); // => false

if (null) {
  console.log('null is truthy');
} else {
  console.log('null is falsy'); // logs 'null is falsy'
}

2.2 typeof null

typeof value 类型操作符可以确定值的类型。例如,类型为 15 的是 numbertypeof { prop: 'Value' } 等于 object

有趣的是,null 值类型的结果是什么

typeof null; // => 'object'

一个缺失的对象类型怎么被判断为 object? 原来 typoef null 作为 object 是早期 JavaScript 实现中的一个错误

不要使用 typeof 操作符检测 null 值。如前所述,使用严格的相等运算符 myVar === null

如果你想使用 typeof 去检查一个变量是否是一个对象,你必须排除掉 null 的情况

function isObject(object) {
  return typeof object === 'object' && object !== null;
}

isObject({ prop: 'Value' }); // => true
isObject(15);                // => false
isObject(null);              // => false

3. null 的陷阱

null 通常会在你希望使用对象的情况下意外出现。然后,如果尝试从 null 中提取属性,JavaScript 会抛出一个错误

让我们再次使用 greetObject() 函数并尝试从返回的对象中访问 message 属性

科大讯飞-AI虚拟主播
科大讯飞-AI虚拟主播

科大讯飞推出的移动互联网智能交互平台,为开发者免费提供:涵盖语音能力增强型SDK,一站式人机智能语音交互解决方案,专业全面的移动应用分析;

下载
let who = '';

greetObject(who).message; 
// throws "TypeError: greetObject() is null"

因为 who 变量是一个空字符串,所以函数返回 null。当从 null 访问 message 属性时,将抛出类型错误错误

你可以通过使用 可选链操作符 来处理 null

let who = '';

greetObject(who)?.message ?? 'Hello, Stranger!';  
// => 'Hello, Stranger!'

或者使用下一节中描述的两种选择。

4. null 的替代方案

当你不能构造一个对象时,很容易返回 null。但这种做法也有缺点

一旦 null 出现在执行堆栈中,你总是必须检查它

我们尽量避免返回 null

  • 返回默认对象而不是 null
  • 抛出错误而不是返回 null

让我们回忆一下 greetObject() 函数返回 greeting 对象

当缺少参数时,可以返回一个默认对象,而不是返回 null

function greetObject(who) {
  if (!who) {
    who = 'Stranger';
  }
  return { message: `Hello, ${who}!` };
}

greetObject('Eric'); // => { message: 'Hello, Eric!' }
greetObject();       // => { message: 'Hello, Stranger!' }

或者抛出一个错误

function greetObject(who) {
  if (!who) {
    throw new Error('"who" argument is missing');
  }
  return { message: `Hello, ${who}!` };
}

greetObject('Eric'); // => { message: 'Hello, Eric!' }
greetObject();       // => throws an error

这些实践可以让你完全避免处理 null

5. null vs undefined

undefined 就是未初始化的变量或对象属性的值

例如,如果在声明变量时没有赋初值,那么访问该变量的结果为 undefined

let myVariable;

myVariable; // => undefined

nullundefined 之间的主要区别是,null 表示丢失了的对象,而 undefined 表示未初始化的状态

严格相等运算符 === 区分 nullundefined

null === undefined; // => false

而松散相等运算符 == 则认为 nullundefined 相等

null == undefined; // => true

我使用松散相等运算符检查变量是否为 nullundefined

function isEmpty(value) {
  return value == null;
}

isEmpty(42);                // => false
isEmpty({ prop: 'Value' }); // => false
isEmpty(null);              // => true
isEmpty(undefined);         // => true

6. 总结

nullJavaScript 中的一个特殊值,表示丢失的对象

严格相等运算符判断变量是否为空: variable === null

typoef 操作符用于确定变量的类型(number, string, boolean)。但是,typeofnull 情况下会引起误解: typeof null 结果为 object

nullundefined 在某种程度上是等价的,但null 表示一个丢失的对象,而 undefined 表示未初始化状态

尽可能避免返回 null 或将变量设置为 null。因为这种做法会导致 null 值的扩展和需要对 null 的验证。相反,尝试使用具有默认属性的对象,或者甚至抛出错误会是更好的实践

你会使用什么方法来检查 null?

【相关推荐:javascript视频教程web前端

相关文章

java速学教程(入门到精通)
java速学教程(入门到精通)

java怎么学习?java怎么入门?java在哪学?java怎么学才快?不用担心,这里为大家提供了java速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
C++ 设计模式与软件架构
C++ 设计模式与软件架构

本专题深入讲解 C++ 中的常见设计模式与架构优化,包括单例模式、工厂模式、观察者模式、策略模式、命令模式等,结合实际案例展示如何在 C++ 项目中应用这些模式提升代码可维护性与扩展性。通过案例分析,帮助开发者掌握 如何运用设计模式构建高质量的软件架构,提升系统的灵活性与可扩展性。

8

2026.01.30

c++ 字符串格式化
c++ 字符串格式化

本专题整合了c++字符串格式化用法、输出技巧、实践等等内容,阅读专题下面的文章了解更多详细内容。

9

2026.01.30

java 字符串格式化
java 字符串格式化

本专题整合了java如何进行字符串格式化相关教程、使用解析、方法详解等等内容。阅读专题下面的文章了解更多详细教程。

8

2026.01.30

python 字符串格式化
python 字符串格式化

本专题整合了python字符串格式化教程、实践、方法、进阶等等相关内容,阅读专题下面的文章了解更多详细操作。

1

2026.01.30

java入门学习合集
java入门学习合集

本专题整合了java入门学习指南、初学者项目实战、入门到精通等等内容,阅读专题下面的文章了解更多详细学习方法。

20

2026.01.29

java配置环境变量教程合集
java配置环境变量教程合集

本专题整合了java配置环境变量设置、步骤、安装jdk、避免冲突等等相关内容,阅读专题下面的文章了解更多详细操作。

17

2026.01.29

java成品学习网站推荐大全
java成品学习网站推荐大全

本专题整合了java成品网站、在线成品网站源码、源码入口等等相关内容,阅读专题下面的文章了解更多详细推荐内容。

19

2026.01.29

Java字符串处理使用教程合集
Java字符串处理使用教程合集

本专题整合了Java字符串截取、处理、使用、实战等等教程内容,阅读专题下面的文章了解详细操作教程。

3

2026.01.29

Java空对象相关教程合集
Java空对象相关教程合集

本专题整合了Java空对象相关教程,阅读专题下面的文章了解更多详细内容。

6

2026.01.29

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
React 教程
React 教程

共58课时 | 4.3万人学习

TypeScript 教程
TypeScript 教程

共19课时 | 2.6万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 3.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号