JavaScript全局函数研究_手写模仿实现_01:eval、isFinite、isNaN、parseFloat、parseInt

news2024/10/11 8:24:49

JavaScript全局函数研究_手写模仿实现:eval、isFinite、isNaN、parseFloat、parseInt

JavaScript提供了一系列全局函数,用于在不同的场景下处理数据。这些函数包括evalisFiniteisNaNparseFloatparseInt等。理解这些函数的工作原理,有助于我们更深入地掌握JavaScript的核心机制。本文将逐一介绍这些全局函数的作用,并尝试手写模仿它们的实现,深入剖析其内部逻辑。

一、eval()

1. 基础介绍

eval()函数接收一个字符串作为参数,将其作为JavaScript代码执行。它可以动态地执行字符串形式的代码,这在某些动态场景下非常有用。然而,由于安全和性能问题,通常不建议使用eval()

2. 语法

eval(string)
  • string:要执行的字符串代码。

3. 示例代码

const code = 'console.log("Hello, World!");';
eval(code); // 输出: Hello, World!

4. 手写模仿实现

由于eval()是JavaScript引擎内置的解析器功能,无法完全手写实现其功能。但我们可以模拟eval()的一些简单场景,例如执行基本的数学表达式解析。

示例:简单的数学表达式求值
function simpleEval(expr) {
  // 只允许数字和基本运算符,防止安全问题
  if (/^[\d+\-*/\s()]+$/.test(expr)) {
    return new Function(`return ${expr}`)();
  } else {
    throw new Error('Invalid expression');
  }
}

console.log(simpleEval('2 + 3 * (4 - 1)')); // 输出: 11

注意:上面的实现使用了new Function(),它与eval()类似,也存在安全隐患。在生产环境中,应避免执行来自不可信来源的代码。

5. 安全与性能考虑

  • 安全性eval()可能执行恶意代码,导致安全漏洞。
  • 性能eval()在执行时需要调用解释器,可能会降低性能。
  • 替代方案:通常可以通过其他方式实现同样的功能,例如使用对象映射、函数调用等。

二、isFinite()

1. 基础介绍

isFinite()函数用于判断一个值是否为有限数值。当参数转换为数字类型后,如果是有限数字,则返回true,否则返回false

2. 语法

isFinite(value)
  • value:要检测的值。

3. 示例代码

console.log(isFinite(100));        // 输出: true
console.log(isFinite('200'));      // 输出: true(字符串会被转换为数字)
console.log(isFinite(Infinity));   // 输出: false
console.log(isFinite(NaN));        // 输出: false

4. 手写模仿实现

function myIsFinite(value) {
  const num = Number(value);
  return typeof num === 'number' && !isNaN(num) && num !== Infinity && num !== -Infinity;
}

console.log(myIsFinite(100));        // 输出: true
console.log(myIsFinite('200'));      // 输出: true
console.log(myIsFinite(Infinity));   // 输出: false
console.log(myIsFinite(NaN));        // 输出: false

5. 实现原理

  • 首先,将传入的值转换为数字类型。
  • 检查类型是否为number,并排除NaNInfinity-Infinity

三、isNaN()

1. 基础介绍

isNaN()函数用于判断一个值是否为NaN(非数字值)。当参数转换为数字后,如果结果是NaN,则返回true,否则返回false

2. 语法

isNaN(value)
  • value:要检测的值。

3. 示例代码

console.log(isNaN(NaN));          // 输出: true
console.log(isNaN('hello'));      // 输出: true('hello'转换为数字是NaN)
console.log(isNaN(123));          // 输出: false
console.log(isNaN('456'));        // 输出: false

4. 手写模仿实现

function myIsNaN(value) {
  const num = Number(value);
  return num !== num;
}

console.log(myIsNaN(NaN));          // 输出: true
console.log(myIsNaN('hello'));      // 输出: true
console.log(myIsNaN(123));          // 输出: false
console.log(myIsNaN('456'));        // 输出: false

5. 实现原理

  • 将值转换为数字。
  • 利用NaN不等于自身的特性,即NaN !== NaNtrue

注意:ES6引入了Number.isNaN(),它更为严格,只在参数为NaN时返回true

console.log(Number.isNaN('hello')); // 输出: false

四、parseFloat()

1. 基础介绍

parseFloat()函数解析一个字符串参数,并返回一个浮点数。如果字符串的第一个字符不能被转换为数字,则返回NaN

2. 语法

parseFloat(string)
  • string:要解析的字符串。

3. 示例代码

console.log(parseFloat('3.14'));      // 输出: 3.14
console.log(parseFloat('10e2'));      // 输出: 1000
console.log(parseFloat('  -5.5 '));   // 输出: -5.5
console.log(parseFloat('abc'));       // 输出: NaN

4. 手写模仿实现

function myParseFloat(str) {
  const regex = /^\s*([+-]?(\d+(\.\d*)?|\.\d+)([eE][+-]?\d+)?)\s*/;
  const match = str.match(regex);
  if (match) {
    return Number(match[1]);
  } else {
    return NaN;
  }
}

console.log(myParseFloat('3.14'));      // 输出: 3.14
console.log(myParseFloat('10e2'));      // 输出: 1000
console.log(myParseFloat('  -5.5 '));   // 输出: -5.5
console.log(myParseFloat('abc'));       // 输出: NaN

5. 实现原理

  • 使用正则表达式匹配浮点数格式。
  • 提取匹配的数值字符串并转换为数字。
  • 处理前导和后续的空白字符。

五、parseInt()

1. 基础介绍

parseInt()函数解析一个字符串参数,并返回一个指定基数的整数。如果字符串的第一个字符不能被转换为数字,则返回NaN

2. 语法

parseInt(string, [radix])
  • string:要解析的字符串。
  • radix(可选):表示要解析的数字的基数(2 ~ 36)。

3. 示例代码

console.log(parseInt('42'));           // 输出: 42
console.log(parseInt('1010', 2));      // 输出: 10(二进制)
console.log(parseInt('ff', 16));       // 输出: 255(十六进制)
console.log(parseInt('0x10'));         // 输出: 16
console.log(parseInt('abc'));          // 输出: NaN

4. 手写模仿实现

function myParseInt(str, radix) {
  str = String(str).trim();
  radix = radix || 0;

  const regexHex = /^[-+]?0[xX][\dA-Fa-f]+$/;
  const regexOct = /^[-+]?0[oO][0-7]+$/;
  const regexBin = /^[-+]?0[bB][01]+$/;

  if (radix === 0) {
    if (regexHex.test(str)) radix = 16;
    else if (regexOct.test(str)) radix = 8;
    else if (regexBin.test(str)) radix = 2;
    else radix = 10;
  }

  const regex = new RegExp(`^[-+]?([\\dA-Za-z]+)`);
  const match = str.match(regex);

  if (match) {
    const numStr = match[0];
    return Number.parseInt(numStr, radix);
  } else {
    return NaN;
  }
}

console.log(myParseInt('42'));           // 输出: 42
console.log(myParseInt('1010', 2));      // 输出: 10
console.log(myParseInt('ff', 16));       // 输出: 255
console.log(myParseInt('0x10'));         // 输出: 16
console.log(myParseInt('abc'));          // 输出: NaN

5. 实现原理

  • 将输入转换为字符串并去除空白字符。
  • 处理radix参数,确定进制。
  • 使用正则表达式提取有效的数字部分。
  • 利用Number.parseInt()进行数值转换。

注意:在ECMAScript规范中,parseInt()radix0或未提供时,会根据字符串内容自动判断进制。

注意事项

  • 安全性:避免使用eval()new Function()执行不可信的代码。
  • 类型转换isFinite()isNaN()会进行隐式类型转换,需要注意输入类型。
  • 进制处理parseInt()radix参数非常重要,可能影响结果,需要明确指定。

参考资料

  • MDN JavaScript eval()
  • MDN JavaScript isFinite()
  • MDN JavaScript isNaN()
  • MDN JavaScript parseFloat()
  • MDN JavaScript parseInt()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2204546.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java | Leetcode Java题解之第470题用Rand7()实现Rand10()

题目&#xff1a; 题解&#xff1a; class Solution extends SolBase {public int rand10() {int a, b, idx;while (true) {a rand7();b rand7();idx b (a - 1) * 7;if (idx < 40) {return 1 (idx - 1) % 10;}a idx - 40;b rand7();// get uniform dist from 1 - 63…

安卓13禁止用户打开开发者选项 android13禁止用户打开开发者选项

总纲 android13 rom 开发总纲说明 文章目录 1.前言2.问题分析3.代码分析4.代码修改5.编译6.彩蛋1.前言 设置 =》关于平板电脑 =》版本号,一般的话,在这里连续点击就可以打开我们的开发者选项了。但是有些系统要进行保密,因此要禁止用户进入。 2.问题分析 这里我们是通过点…

FastAPI框架使用枚举来型来限定参数、FastApi框架隐藏没多大意义的Schemes模型部分内容以及常见的WSGI服务器Gunicorn、uWSGI了解

一、FastAPI框架使用枚举来型来限定参数 FastAPI框架验证时&#xff0c;有时需要通过枚举的方式来限定参数只能为某几个值中的一个&#xff0c;这时就可以使用FastAPI框架的枚举类型Enum了。publish:December 23, 2020 -Wednesday 代码如下&#xff1a; #引入Enum模块 from fa…

【自注意力与Transformer架构在自然语言处理中的演变与应用】

背景介绍 在自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;序列到序列&#xff08;seq2seq&#xff09;模型和Transformer架构的出现&#xff0c;极大地推动了机器翻译、文本生成和其他语言任务的进展。传统的seq2seq模型通常依赖于循环神经网络&#xff08;RNN&…

【idea】切换多个仓库到一个分支

需求描述 打开个一个Project 里面包含多个子项目&#xff0c;每一个子项目都有一个自己的git仓库。在idea 中有没有一次性把多个项目切换到同一个分支上面。 解决方案 右键git -> branch 点击右上角的此轮 勾选Execute Branch Operations on All Roots 点击ommon Remote …

萱仔求职复习系列——2 Linux的常用方法(包含基础进阶高级操作)

由于最近接了一个笔试&#xff0c;发现笔试可能涉及到Linux&#xff0c;我准备临时抱佛脚一下赶紧复习一下Linux的用法哈哈。Linux 的基础用法包含文件系统操作、权限管理、网络配置、进程管理等基本命令&#xff1b;进阶操作包括网络调试、包管理、服务管理和用户管理等&#…

【jdk19虚拟线程 VS 普通线程】

文章目录 一.什么是虚拟线程二.虚拟线程与普通线程的区别1.普通线程2.虚拟线程3. 实际应用中的区别 三.上demo对比性能。1.线程池配置2.Service实现3.测试结果 四.小结 一.什么是虚拟线程 虚拟线程&#xff0c;也称作轻量级线程&#xff0c;是由JVM直接管理的线程类型&#xf…

jmeter入门:脚本录制

1.设置代理。 网络连接-》代理-》手动设置代理. ip&#xff1a; 127.0.0.1&#xff0c; port&#xff1a;8888 2. add thread group 3. add HTTP(s) test script recorder, target controller chooses Test plan-> thread Group 4. click start. then open the browser …

Golang | Leetcode Golang题解之第467题环绕字符串中唯一的子字符串

题目&#xff1a; 题解&#xff1a; func findSubstringInWraproundString(p string) (ans int) {dp : [26]int{}k : 0for i, ch : range p {if i > 0 && (byte(ch)-p[i-1]26)%26 1 { // 字符之差为 1 或 -25k} else {k 1}dp[ch-a] max(dp[ch-a], k)}for _, v :…

Java主流框架项目实战——SpringBoot入门

单元1-1 1&#xff09; IDEA工具安装好 2&#xff09; Maven安装&#xff0c;配置好 IDEA安装及永久试用 配置maven 单元1-2 使用aliyun(https://start.aliyun.com/)创建一个spring boot项目&#xff0c;hello world&#xff01; 构建项目 1&#xff09;构建项目 直接默认…

MicroFlow:一种高效的基于Rust的TinyML推理引擎

英文论文标题&#xff1a;MICROFLOW: AN EFFICIENT RUST-BASED INFERENCE ENGINE FOR TINYML 中文论文标题&#xff1a;MicroFlow&#xff1a;一种高效的基于Rust的TinyML推理引擎 作者信息&#xff1a; Matteo Carnelos&#xff0c;意大利帕多瓦大学&#xff0c;Grepit AB,…

什么软件可以晚上睡觉录音

什么软件可以晚上睡觉录音&#xff0c;在日常生活中&#xff0c;我们常常忽略夜间的声音&#xff0c;然而这些声音有时可能会揭示重要信息&#xff0c;比如打鼾情况、说梦话、甚至是潜在的睡眠问题。因此&#xff0c;一款适合夜间录音的软件对于关注健康及生活细节的人来说至关…

在IDEA中配置Selenium和WebDriver

前言&#xff1a; 在当今自动化测试和网络爬虫的领域&#xff0c;Selenium是一个被广泛使用的工具。它不仅能够模拟用户与浏览器的交互&#xff0c;还能进行网页测试和数据抓取。而为了使用Selenium与谷歌/Edge浏览器进行自动化测试&#xff0c;配置合适的WebDriver至关重要。本…

【时时三省】(C语言基础)指针笔试题8

山不在高&#xff0c;有仙则名。水不在深&#xff0c;有龙则灵。 ----CSDN 时时三省 笔试题8 c是个数组 它的每个元素是char* 它初始化了四个字符串 把这四个字符串的首字符的地址 传到了c里面 cp有四个元素 每个元素的类型是char** 所以c3指向FORST c2指向POINT c1指向NE…

数学建模算法与应用 第9章 支持向量机及其方法

目录 9.1 支持向量机的基本原理 核函数的种类&#xff1a; 9.2 支持向量机的Matlab命令及应用 Matlab代码示例&#xff1a;二分类支持向量机 9.3 乳腺癌的诊断案例 Matlab代码示例&#xff1a;乳腺癌数据分类 9.4 支持向量回归&#xff08;SVR&#xff09; Matlab代码示…

uibot发送邮件:自动化邮件发送教程详解!

uibot发送邮件的操作指南&#xff1f;uibot发送邮件的两种方式&#xff1f; 在现代办公环境中&#xff0c;自动化流程的引入极大地提高了工作效率。uibot发送邮件功能成为了许多企业和个人实现邮件自动化发送的首选工具。AokSend将详细介绍如何使用uibot发送邮件。 uibot发送…

【AIGC】寻找ChatGPT最佳推理步骤:CoT思维链技术的探索与应用

博客主页&#xff1a; [小ᶻZ࿆] 本文专栏: AIGC | ChatGPT 文章目录 &#x1f4af;前言&#x1f4af;CoT思维链概述&#x1f4af;CoT思维链在大型语言模型中的应用&#x1f4af;CoT思维链改变对模型推理能力的理解和改进方式多样化应用场景挑战与未来发展总结 &#x1f4a…

鸿蒙NEXT开发-动画(基于最新api12稳定版)

注意&#xff1a;博主有个鸿蒙专栏&#xff0c;里面从上到下有关于鸿蒙next的教学文档&#xff0c;大家感兴趣可以学习下 如果大家觉得博主文章写的好的话&#xff0c;可以点下关注&#xff0c;博主会一直更新鸿蒙next相关知识 专栏地址: https://blog.csdn.net/qq_56760790/…

用FPGA做一个全画幅无反相机

做一个 FPGA 驱动的全画幅无反光镜数码相机是不是觉得很酷&#xff1f; 就是上图这样。 Sitina 一款开源 35 毫米全画幅 (3624 毫米) CCD 无反光镜可换镜头相机 (MILC)&#xff0c;这个项目最初的目标是打造一款数码相机&#xff0c;将 SLR [单镜头反光] 相机转换为 DSLR [数码…

探索Semantic Kernel:开启AI编程新篇章(入门篇)

文章目录 一、引言二、什么是Semantic Kernel&#xff1f;三、为什么选择Semantic Kernel&#xff1f;四、Semantic Kernel的核心特性4.1企业级4.2 自动化业务流程4.3 模块化和可扩展性 五、Semantic Kernel入门5.1 安装SDK5.2 编写控制台应用1. 配置2.实例3.示例一&#xff1a…