当前位置: 首页 > news >正文

undefined和null的区别 (新手小白级教程)

undefined和null的区别 (新手小白级教程)

undefinednull 都表示“没有值”,但它们的核心区别在于:

  • undefined 是 JavaScript 自动分配的默认值,表示“未定义”,没有原始值;或者说是没有值这么一个东西。换句话说就是:这个地方应该是有一个值的,而你没有去定义,但你又去读取它,这个时候就会返回undefined。
  • null 是开发者主动赋值的空值,表示“空对象引用” (即:一个对象被定义了值为空值)。

一、定义与核心区别

维度undefinednull
来源系统自动赋予(默认值)开发者手动赋值
语义“这里应该有值,但还没定义”“这里应该是一个对象,但现在是空的”
类型typeof undefined"undefined"typeof null"object"(历史遗留问题)

二、常见场景与示例

1. undefined 的产生场景
  • 变量未赋值

    let name;
    console.log(name); // undefined
    
  • 函数无返回值

    function sayHello() {}
    console.log(sayHello()); // undefined
    
  • 对象属性未定义

    const obj = {};
    console.log(obj.age); // undefined
    
  • 函数参数未传递

    function greet(name) {
      console.log(name); // 未传参时,name → undefined
    }
    greet();
    

2. null 的产生场景
  • 主动清空对象引用

    let data = { id: 1 };
    data = null; // 释放内存,表示data不再指向任何对象
    
  • 初始化空值占位

    let user = null; // 稍后从服务器获取数据再赋值
    
  • DOM获取不存在的元素

    const element = document.getElementById("no-such-id");
    console.log(element); // null
    

三、类型检测与比较

1. 类型检测
console.log(typeof undefined); // "undefined"  
console.log(typeof null);      // "object"(历史遗留问题,实际应为"null")
2. 相等性比较
  • ==(宽松相等)
    console.log(null == undefined); // true(规范约定)
    
  • ===(严格相等)
    console.log(null === undefined); // false(类型不同)
    

四、使用建议与避坑指南

1. 使用原则
  • undefined:表示“系统默认的未定义状态”,不要手动赋值
  • null:表示“开发者主动设置的明确空值”。
2. 常见误区
  • typeof null 的陷阱

    // 检测null的正确方式
    const isNull = (value) => value === null;
    
  • JSON序列化的差异

    JSON.stringify({ a: undefined, b: null }); 
    // 结果:'{"b":null}'(undefined被忽略,null保留)
    

五、总结记忆口诀

“系统未定义用 undefined,主动清空用 null

  • undefined:系统自动填,变量未赋默认值。
  • null:开发者主动设,空对象引用要牢记。

通过理解它们的来源和设计意图,我们可以避免混淆,写出更清晰的代码!

http://www.dtcms.com/a/66455.html

相关文章:

  • 第5关:猴子爬山
  • 航空动力系统适航标准要点手册
  • OpenRewrite配方之import语句的顺序——org.openrewrite.java.OrderImports
  • transformer bert 多头自注意力
  • element-plus中Autocomplete自动补全输入框组件的使用
  • 【Spring】详细剖析Spring程序
  • 多线程实现批量保存数据
  • PE,ELF,COFF
  • 基于物联网设计的疫苗冷链物流监测系统
  • 【前端知识】前端构建工具webpack的平替vite
  • 【软件测试】--面试
  • 如何用终端运行一个SpringBoot项目
  • SD ComfyUI工作流 一键Q版盲盒手办形象_多关键词切换
  • 星越L_副驾驶屏使用讲解
  • 每日一题之储存晶体
  • 基于GoogleNet深度学习网络和GEI步态能量提取的步态识别算法matlab仿真,数据库采用CASIA库
  • Linux驱动开发实战(四):设备树点RGB灯
  • Cursor 终极使用指南:从零开始走向AI编程
  • 【算法题解答·六】栈队列堆
  • 剑指 Offer II 073. 狒狒吃香蕉
  • 2025-03-13 禅修-错误的做法
  • 大白话如何在 Vue 项目中进行路由懒加载?
  • DexGraspVLA:面向通用灵巧抓取的视觉-语言-动作框架
  • 便利店商品推荐数字大屏:基于python和streamlit
  • python元组(被捆绑的列表)
  • 【C#学习笔记04】C语言格式化输出
  • 【Linux】线程
  • uniapp实现 uview1 u-button的水波纹效果
  • AI智能体系列文章:一、导论【Medium文章转载】
  • 基于SpringBoot和MybatisPlus实现通用Controller