undefiend和null_js中哪些是null哪些是undefiend-程序员宅基地

技术标签: 前端  

Undefined和Null都是js的基本数据类型且分别都只有唯一值即undefined和null。

Undefined类型

什么时候能得到一个undefined呢?

  1. 声明一个变量,但未初始化时。
var a;
console.log(a)//undefined

2.初始化为undefined

var a = undefined;
console.log(a)//undefined

3.对未定义的变量执行typeof

//未定义变量b
var a;
console.log(typeof a) //undefined
console.log(typeof b) //undefined

如果此时使用===来把为定义变量bundefined比较,会出现报错。
其他会返回undefined的情况,比如一个没有return的函数,会返回undefined,或者调用函数没有传参,参数也会初试化为undefined

所也得出判断一个变量是否为undefined的两个方法:

  1. 使用===或者!==来判断一个变量是否有值。
  2. 使用typeof操作符,对未定义的变量只有使用typeof来判断。

全局属性window.undefiend

无论是否初始化一个变量,我们都能给其赋值undefined,我们所赋值的undefined不是一个值而是window的一个属性window.undefined,他的值是undefined即原始的undefined。通常情况下代码中参与判断、比较赋值的都是window.undefined而在控制台打印或者函数中返回的就是原始的undefined

console.log(window.undefined) // 原始的undefined

局部属性undefined

对比资料发现,undefined在js中不是一个保留字,这意味着以下情况发生。

(function() {
    
    var undefined = 'not is undefined';
    console.log(undefined); //"not is undefined"
    console.log(typeof undefined) // "string"
})()

这样会让js代码变的奇怪,让我们难以维护。

void 0

我们发行undefined可以重写,所以使用data === undefined来判断会有风险,怎么解决呢?
在官方文档中有这样一句话

void 运算符 对给定的表达式进行求值,然后返回 undefined
他告诉我们,使用void无论后面表达式结果是多少,都返回原始的undefined
所以可以这样来判断:

var a
console.log(a === void 0) //true

Null类型

Null也是JS的基本数据类型之一,他的值也只有唯一的null,null是一个字面量不是全局属性。逻辑上null是一个空对象指针,指示变量未指向任何对象。把 null 作为尚未创建的对象,也许更好理解。null 常在返回类型是对象,但没关联值的地方使用。

var $container = doucment.getElementById('container'); // 此时$container是不存在的
console.log($container) //null 

typeof unll

typeof null为什么不是Null而是Object呢?

var a = null;
console.log(typeof a); // "object"

我们可以做如下理解:

  • 逻辑上,null表示空对象指针,它代表的就是一个空对象,所以typeof会返回object。
  • 在最初的js中,JavaScript 中的值是由一个表示类型的标签和实际数据值表示的。对象的类型标签是 0。null 代表的是空指针(大多数平台下值为 0x00),因此,null的类型标签也成为了 0,typeof null就错误的返回了”object”。在ES6中,当时曾经有提案为历史平凡, 将type null的值纠正为null, 但最后提案被拒了,所以还是保持”object”类型。

null判断

使用严格相等符===或不相等操作符!==判断。
==和undefined会返回true,而typeof是没法判断的。

unll使用

将变量赋值null的情况

  • 一个变量未来将保存一个对象时。
  • 当一个数据不再需要使用时,我们最好通过将其值设置为null来释放其引用,这个做法叫做解除引用。解除一个值的引用并不意味着自动回收改值所占用的内存。解除引用的作用是让值脱离执行环境,以便垃圾收集器在下次运行时将其回收。解除引用还有助于消除有可能出现的循环引用的情况。这一做法适用于大多数全局变量和全局对象的属性,局部变量会在它们离开执行环境时(函数执行完时)自动被解除引用。

undefined和unll

实际上undefined值是派生自null值的,因此ECMA-262规定对它们的相等性测试要返回true:
==会转换其操作数为相同类型后再做比较,而使用严格相等符===比较,我们会发现它们是不相等的

console.log(undefined == unll) //true

console.log(undefined === unll) //false

写在最后

在看一到面试题null和undefined的区别的时候,想起自己虽然看过几次,单印象不深刻,在参考前人的文章时总结出这篇文章,用来以后复习。

参考链接

JavaScript深入理解之undefined与null | CavsZhouyou’s Blog

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_44156482/article/details/118440271

智能推荐

while循环&CPU占用率高问题深入分析与解决方案_main函数使用while(1)循环cpu占用99-程序员宅基地

文章浏览阅读3.8k次,点赞9次,收藏28次。直接上一个工作中碰到的问题,另外一个系统开启多线程调用我这边的接口,然后我这边会开启多线程批量查询第三方接口并且返回给调用方。使用的是两三年前别人遗留下来的方法,放到线上后发现确实是可以正常取到结果,但是一旦调用,CPU占用就直接100%(部署环境是win server服务器)。因此查看了下相关的老代码并使用JProfiler查看发现是在某个while循环的时候有问题。具体项目代码就不贴了,类似于下面这段代码。​​​​​​while(flag) {//your code;}这里的flag._main函数使用while(1)循环cpu占用99

【无标题】jetbrains idea shift f6不生效_idea shift +f6快捷键不生效-程序员宅基地

文章浏览阅读347次。idea shift f6 快捷键无效_idea shift +f6快捷键不生效

node.js学习笔记之Node中的核心模块_node模块中有很多核心模块,以下不属于核心模块,使用时需下载的是-程序员宅基地

文章浏览阅读135次。Ecmacript 中没有DOM 和 BOM核心模块Node为JavaScript提供了很多服务器级别,这些API绝大多数都被包装到了一个具名和核心模块中了,例如文件操作的 fs 核心模块 ,http服务构建的http 模块 path 路径操作模块 os 操作系统信息模块// 用来获取机器信息的var os = require('os')// 用来操作路径的var path = require('path')// 获取当前机器的 CPU 信息console.log(os.cpus._node模块中有很多核心模块,以下不属于核心模块,使用时需下载的是

数学建模【SPSS 下载-安装、方差分析与回归分析的SPSS实现(软件概述、方差分析、回归分析)】_化工数学模型数据回归软件-程序员宅基地

文章浏览阅读10w+次,点赞435次,收藏3.4k次。SPSS 22 下载安装过程7.6 方差分析与回归分析的SPSS实现7.6.1 SPSS软件概述1 SPSS版本与安装2 SPSS界面3 SPSS特点4 SPSS数据7.6.2 SPSS与方差分析1 单因素方差分析2 双因素方差分析7.6.3 SPSS与回归分析SPSS回归分析过程牙膏价格问题的回归分析_化工数学模型数据回归软件

利用hutool实现邮件发送功能_hutool发送邮件-程序员宅基地

文章浏览阅读7.5k次。如何利用hutool工具包实现邮件发送功能呢?1、首先引入hutool依赖<dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>5.7.19</version></dependency>2、编写邮件发送工具类package com.pc.c..._hutool发送邮件

docker安装elasticsearch,elasticsearch-head,kibana,ik分词器_docker安装kibana连接elasticsearch并且elasticsearch有密码-程序员宅基地

文章浏览阅读867次,点赞2次,收藏2次。docker安装elasticsearch,elasticsearch-head,kibana,ik分词器安装方式基本有两种,一种是pull的方式,一种是Dockerfile的方式,由于pull的方式pull下来后还需配置许多东西且不便于复用,个人比较喜欢使用Dockerfile的方式所有docker支持的镜像基本都在https://hub.docker.com/docker的官网上能找到合..._docker安装kibana连接elasticsearch并且elasticsearch有密码

随便推点

Python 攻克移动开发失败!_beeware-程序员宅基地

文章浏览阅读1.3w次,点赞57次,收藏92次。整理 | 郑丽媛出品 | CSDN(ID:CSDNnews)近年来,随着机器学习的兴起,有一门编程语言逐渐变得火热——Python。得益于其针对机器学习提供了大量开源框架和第三方模块,内置..._beeware

Swift4.0_Timer 的基本使用_swift timer 暂停-程序员宅基地

文章浏览阅读7.9k次。//// ViewController.swift// Day_10_Timer//// Created by dongqiangfei on 2018/10/15.// Copyright 2018年 飞飞. All rights reserved.//import UIKitclass ViewController: UIViewController { ..._swift timer 暂停

元素三大等待-程序员宅基地

文章浏览阅读986次,点赞2次,收藏2次。1.硬性等待让当前线程暂停执行,应用场景:代码执行速度太快了,但是UI元素没有立马加载出来,造成两者不同步,这时候就可以让代码等待一下,再去执行找元素的动作线程休眠,强制等待 Thread.sleep(long mills)package com.example.demo;import org.junit.jupiter.api.Test;import org.openqa.selenium.By;import org.openqa.selenium.firefox.Firefox.._元素三大等待

Java软件工程师职位分析_java岗位分析-程序员宅基地

文章浏览阅读3k次,点赞4次,收藏14次。Java软件工程师职位分析_java岗位分析

Java:Unreachable code的解决方法_java unreachable code-程序员宅基地

文章浏览阅读2k次。Java:Unreachable code的解决方法_java unreachable code

标签data-*自定义属性值和根据data属性值查找对应标签_如何根据data-*属性获取对应的标签对象-程序员宅基地

文章浏览阅读1w次。1、html中设置标签data-*的值 标题 11111 222222、点击获取当前标签的data-url的值$('dd').on('click', function() { var urlVal = $(this).data('ur_如何根据data-*属性获取对应的标签对象

推荐文章

热门文章

相关标签