Javascript-标准内置对象-值属性-globalThis-Infinity-Nan-undefined 手写实现globalThis功能

news/2024/12/22 15:33:33/

1 globalThis

1.1 globalThis简介

        globalThis 是 ECMAScript 2020(ES11)引入的全局对象的标准化引用。在不同JavaScript 运行环境中,全局对象的名称可能不同: 浏览器中是 window。 Node.js 中是 global。 Web Workers 中是 self。 使用 globalThis,你可以在任何环境中统一访问全局对象。

javascript">// globalThis
console.log(globalThis)
// 挂载全局对象
globalThis.a = 1
console.log(a)// 使用全局对象Math Math也是任意环境下都可以使用的
const num = globalThis.Math.random()
console.log(num) 

1.2 手写实现globalThis

        通过条件判断实现一个跨环境的全局对象获取函数,代码如下所示,利用了所有环境都有Math对象挂载到全局对象来判断实现:

javascript">function check(val){return val && val.Math === Math && val
}function getGlobal(){return check(typeof window === "object" && window) ||check(typeof self === "object" && self) ||check(typeof global === "object" && global) ||(function(){return this})() || Function("return this")()
}const myglobal = getGlobal()
console.log(myglobal)

2 Infinity

        Infinity 表示正无穷大,是一个数值类型的全局属性。在数学计算中,当结果超出 JavaScript 能表示的最大数字时,会返回 Infinity。负无穷大用 -Infinity 表示。 Infinity 大于任何数值。与任何数进行算术运算,遵循特定规则。

  • 对Infinity加减都是Infinity,Infinity任意数都是+-Infinity,但是乘法中乘以0的时候是Nan
  • Math.pow(10, 10000)是Infinity因为大于某个值就会成为Infinity,Math.log(0)是-Infinity
  • 常数除以Infinity是0, 1 / 0是Infinity
  • 1**infinity, Infinity * infinity, infinity - infinity也是Nan

        代码示例如下所示:

javascript">// Infinity
console.log(Infinity === Number.POSITIVE_INFINITY) // true
console.log(Infinity * 0) // NaN
console.log(Infinity); /* Infinity */
console.log(Infinity + 1); /* Infinity */
console.log(Math.pow(10, 1000)); /* Infinity */
console.log(Math.log(0)); /* -Infinity */
console.log(1 / Infinity); /* 0 */
console.log(1 / 0); /* Infinity */

3 Nan

        NaN 代表 "Not-a-Number"(非数字),是一个特殊的数值类型。当数学运算无法得到有效数值结果时,会返回 NaN。

  • NaN 不等于任何值,包括它自身。
  • 可以使用 isNaN() 函数或 Number.isNaN() 方法来检测是否为 NaN。
  • 如果 NaN 涉及数学运算(但不涉及位运算),结果通常也是 NaN。
  • 当 NaN 是任何关系比较(>、<、>=、<=)的操作数之一时,结果总是 false。
  • NaN 不等于(通过 ==、!=、=== 和 !==)任何其他值——包括与另一个 NaN 值。

 3.1 争对NaN的测试

        测试关系比较运算符,以及==, ===, !==的测试,测试isNaN和Number.isNaN的使用,发现:

  • isNaN会将参数转换为数字判断,Number.isNaN不会
  • NaN !== NaN判断为真,可以使用 x !== x来判断NaN
javascript">// NaN
console.log(NaN === NaN) // false
console.log(NaN > 3) // false
console.log(NaN < 3) // false
console.log(NaN == 3) // false
console.log(NaN === 3) // false
console.log(NaN !== NaN) // true// isNaN
console.log(isNaN(NaN)) // true
console.log(Number.isNaN(NaN)) // true
// Number.isNaN不会将参数转换为数字(只会判断当前状态是否为NaN)
console.log(Number.isNaN("Hello")) // false
// 全局isNaN会将参数转换为数字(包含未来状态)
console.log(isNaN("Hello")) // true

         如果数组当中存在Nan那么有些方法无法查找到NaN的存在,例如indexOf、lastIndexOf,但是查找值的可以,例如includes。

4 undefined

        undefined 表示未定义的值,是 JavaScript 中的一种基本数据类型。当变量声明但未赋值时,其值为 undefined,有以下要点:

  • 访问对象中不存在的属性,返回 undefined。
  • 没有return的函数返undefined。
  • undefined 与 null 不同,null 表示空值。
  • 必须使用严格等于运算符 === 来检测是否为 undefined,因为undefined和null在==下为true。
  • 如果方法或者是语句中操作的变量没有被赋值,则会返回 undefined
  • undefined可以在非全局作用域中被当作标识符(变量名)来使用(因为 undefined 不是保留字)。
javascript">let x;
console.log(x);                     // 输出:undefined
const obj = {};
console.log(obj.prop);              // 输出:undefined
function foo() {}
console.log(foo());                 // 输出:undefined
console.log(undefined === undefined); // 输出:true
console.log(null == undefined) // true// 这里没有声明 y
if (typeof y === "undefined") {// 没有错误,执行结果为 trueconsole.log("y is " + typeof y); // y is undefined}if (y === undefined) {// ReferenceError: y is not defined}

http://www.ppmy.cn/news/1533331.html

相关文章

Spring Boot 集成 MySQL 的详细指南

在现代软件开发中&#xff0c;Spring Boot 因其简单易用而成为构建 Java 应用程序的热门选择。结合 MySQL这一常用关系型数据库&#xff0c;开发者可以快速构建出功能完善的后端服务。本文将详细介绍如何将 Spring Boot 与 MySQL 集成&#xff0c;提供从环境搭建到代码实现的全…

【前端安全】js逆向之微信公众号登录密码

❤️博客主页&#xff1a; iknow181 &#x1f525;系列专栏&#xff1a; 网络安全、 Python、JavaSE、JavaWeb、CCNP &#x1f389;欢迎大家点赞&#x1f44d;收藏⭐评论✍ 随着发展&#xff0c;越来越多的登录页面添加了密码加密的措施&#xff0c;使得暴力破解变得不在简单&a…

微软开源GraphRAG的使用教程-使用自定义数据测试GraphRAG

微软在今年4月份的时候提出了GraphRAG的概念&#xff0c;然后在上周开源了GraphRAG,Github链接见https://github.com/microsoft/graphrag,截止当前&#xff0c;已有6900Star。 安装教程 官方推荐使用Python3.10-3.12版本&#xff0c;我使用Python3.10版本安装时&#xff0c;在…

Spring Boot 调用外部接口的常用方式!

使用Feign进行服务消费是一种简化HTTP调用的方式&#xff0c;可以通过声明式的接口定义来实现。下面是一个使用Feign的示例&#xff0c;包括设置Feign客户端和调用服务的方法。 添加依赖 首先&#xff0c;请确保你的项目中已经添加了Feign的依赖。如果你使用的是Maven&#xf…

【QT】QWidget 重要属性

文章目录 enabledgeometrywindowTitlewindowIconqrc 机制windowOpacitycursorfontQFont toolTip 和 toolTipDurationfocusPolicyQt::FocusPolicy styleSheet enabled 作用&#xff1a;设置控件是否可使用. true 表⽰可用, false 表⽰禁用. 对应的API bool isEnabled(); // 获…

探索Python新境界:funboost库揭秘

文章目录 探索Python新境界&#xff1a;funboost库揭秘背景&#xff1a;为什么选择funboost&#xff1f;funboost是什么&#xff1f;如何安装funboost&#xff1f;简单的库函数使用方法场景应用常见Bug及解决方案总结 探索Python新境界&#xff1a;funboost库揭秘 背景&#x…

实时Python解释器介绍和使用

Realtime Python &#xff08;实时Python解释器&#xff09; 使用 概述 项目地址&#xff1a;https://github.com/nitsc/Real-time-Python/tree/main Realtime Python&#xff08;rtpy.py&#xff09; 是一个 Python 脚本&#xff0c;旨在根据配置文件的设定频率&#xff0c;自…

C++:STL(四)之vector的基本介绍与使用方式|容器接口

✨ Blog’s 主页: 白乐天_ξ( ✿&#xff1e;◡❛) &#x1f308; 个人Motto&#xff1a;他强任他强&#xff0c;清风拂山冈&#xff01; &#x1f525; 所属专栏&#xff1a;C深入学习笔记 &#x1f4ab; 欢迎来到我的学习笔记&#xff01; 一、C/C中的字符串 1.1. C语言中的…