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

【JS】内置类型的相关问题

我是目录

  • 引言
  • 内置类型
  • undefined与null
    • null和undefined的区别
  • 字符串
    • 转换为字符串
  • 数字
    • 0.1+0.2不等于0.3
    • NaN
  • BigInt
    • 大数相加问题
  • 原生函数(封箱与解封)
  • 判断类型的方法
    • typeof
    • instanceof
    • Object.prototype.toString.call
    • constructor
  • 类型转换
    • toString
    • toNumber
    • toBoolean
    • 显式强制类型转换
      • 字符串和数字
      • 显式转换布尔值
    • 隐式强制类型转换
      • 字符串和数字
      • 转成布尔值
      • 宽松相等和严格相等
      • 结论

引言

类型的相关知识包含内置类型的判断、类型转换、基础类型的装箱与开箱等,面试时候作为基础知识考察。但是最常被问到的是JS有几种类型,你敢信。。。

内置类型

JavaScript 目前有八种内置类型:

  • 空值(null)
  • 未定义(undefined)
  • 布尔值( boolean)
  • 数字(number)
  • 字符串(string)
  • 对象(object)
  • 符号(symbol, ES6 中新增)
  • 大整数(BigInt,ES2020新增)

除对象之外,其他统称为基本类型原始类型;对象被称为引用类型
在对象(object)中,包含了常用的数组(array)、函数(function)、map、set等。

undefined与null

undefined是全局对象的一个属性,也就是说,它是全局作用域的一个变量。 理论上,undefined 是一个不能被配置(non-configurable),不能被重写(non-writable)的属性。已在作用域中声明但还没有赋值的变量为 undefined

null 不是全局对象的属性。相反,null 是表示缺少的标识,它通常表示一个变量应该是一个对象,但是目前还未指向任何对象。

null和undefined的区别

  1. undefined是全局对象的一个属性,null不是
  2. undefined是一个标识符,可以被当作变量来使用和赋值(不要这么干),null不可以
var undefined = 1 // 不会报错,虽然值还是undefined
var null = 1 // 报错,null是关键字,不能赋值
  1. undefined 一般指代一个声明了但未赋值的变量,null一般指代一个声明了但是没有任何指向的对象
typeof undefined // 'undefined'
typeof null // 'object'

字符串

JavaScript 中字符串是不可变的,这是指字符串的成员函数不会改变其原始值,而是创建并返回一个新的字符串。
许多数组函数用来处理字符串很方便。虽然字符串没有这些函数,但可以通过“借用”数组的非变更方法来处理字符串。

var a = "foo";
var b = ["f","o","o"];
a.length; // 3
b.length; // 3
a.indexOf( "o" ); // 1
b.indexOf( "o" ); // 1
var c = a.concat( "bar" ); // "foobar"
var d = b.concat( ["b","a","r"] ); // ["f","o","o","b","a","r"]
a === c; // false
b === d; // false
var c = Array.prototype.join.call( a, "-" );
var d = Array.prototype.map.call( a, function(v){return v.toUpperCase() + ".";
} ).join( "" );
c; // "f-o-o"
d; // "F.O.O."

转换为字符串

将其他类型转换为字符串有两个比较重要的方法:

  • toString():这是一个方法,数值、布尔值、对象和字符串值都有toString()方法。
  • String():这是一个全局函数,适用于所有数据类型

数字

JavaScript 中的数字类型是基于 IEEE 754 标准来实现的,该标准通常也被称为“浮点数”。 JavaScript 使用的是“双精
度”格式(即 64 位二进制)。JavaScript 中的“整数”就是没有小数的十进制数。所以 42.0 即等同于“整数” 42。
由于数字值可以使用 Number 对象进行封装,因此数字值可以调用 Number.prototype 中的方法。

0.1+0.2不等于0.3

二进制浮点数最大的问题(不仅 JavaScript,所有遵循 IEEE 754 规范的语言都是如此),是会出现如下情况:

0.1 + 0.2 === 0.3; // false

那么应该怎样来判断 0.1 + 0.2 和 0.3 是否相等呢?
最常见的方法是设置一个误差范围值,通常称为“机器精度”( machine epsilon), 对JavaScript 的数字来说,这个值通常是 2^-52 (2.220446049250313e-16)。

可以使用 Number.EPSILON 来比较两个数字是否相等(在指定的误差范围内):

function numbersCloseEnoughToEqual(n1,n2) {return Math.abs( n1 - n2 ) < Number.EPSILON;
}
var a = 0.1 + 0.2;
var b = 0.3;
numbersCloseEnoughToEqual( a, b ); // true
numbersCloseEnoughToEqual( 0.0000001, 0.0000002 ); // false

NaN

NaN被称为不是数字的数字,用于指出数字类型中的错误情况,即“执行数学运算没有成功,这是失败后返回的结果”。

var a = 2 / "foo"; // NaN
typeof a === "number"; // true
a === NaN; // false

NaN 是一个特殊值,它和自身不相等。如果想要判断是否为NaN,可以使用isNaN函数。
ES5时,isNaN存在bug,在ES6中可以使用Number.isNaN来判断NaN

//ES5
var a = 2 / "foo";
var b = "foo";
a; // NaN
b; "foo"
window.isNaN( a ); // true
window.isNaN( b ); // true——晕!
//ES6
Number.isNaN( a ); // true
Number.isNaN( b ); // false——好!

BigInt

BigInt提供了一种方法来表示大于 2^53 - 1 的整数。这原本是 Javascript 中可以用 Number 表示的最大数字。BigInt 可以表示任意大的整数。
可以用在一个整数字面量后面加 n 的方式定义一个 BigInt ,如:10n,或者调用函数 BigInt()(但不包含 new 运算符)并传递一个整数值或字符串值。
它在某些方面类似于 Number ,但是也有几个关键的不同点:

  • 不能用于 Math 对象中的方法;
  • 不能和任何 Number 实例混合运算,两者必须转换成同一种类型。在两种类型来回转换时要小心,因为 BigInt 变量在转换成 Number 变量时可能会丢失精度。

BigIntNumber 不是严格相等的,但是宽松相等的。

0n === 0;
// false0n == 0;
// true

大数相加问题

Number.MAX_SAFE_INTEGER; // 9007199254740991

当两个数据相加时,其中一个或者两个数据都超过了Number.MAX_SAFE_INTEGER,直接相加结果就会不准了。这就是人们常说的大数相加问题。

一般的做法是转成逐位相加,转成字符串:

function largeNumAdd(num1, num2) {let maxLength = Math.max(num1.length, num2.length);//num1和num2位数对齐,位数较小的前面补0num1 = num1.padStart(maxLength, '0');num2 = num2.padStart

相关文章:

【JS】内置类型的相关问题

我是目录 引言内置类型undefined与nullnull和undefined的区别字符串转换为字符串数字0.1+0.2不等于0.3NaNBigInt大数相加问题原生函数(封箱与解封)判断类型的方法typeofinstanceofObject.prototype.toString.callconstructor类型转换toStringtoNumbertoBoolean显式强制类型转…...

Mac上无法访问usr/local的文件

sudo chmod 755 /usr/loca 最后用百度提供的方法解决了...

http 常见状态码

1xx 信息&#xff0c;表示临时响应并需要请求者继续执行操作 2xx 成功&#xff0c;操作被成功接收并处理 3xx 表示要完成请求&#xff0c;需要进一步操作。通常&#xff0c;这些状态码用来重定向 4xx 客户端错误&#xff0c;请求包含语法错误或无法完成请求 5xx 服务…...

代码训练营 day59|并查集

前言 这里记录一下陈菜菜的刷题记录&#xff0c;主要应对25秋招、春招 个人背景 211CS本CUHK计算机相关硕&#xff0c;一年车企软件开发经验 代码能力&#xff1a;有待提高 常用语言&#xff1a;C 系列文章目录 第59天 &#xff1a;第十一章&#xff1a;图论part05 文章目录…...

Node.js——fs模块-路径补充说明

1、相对路径&#xff1a; ./座右铭.txt 当前目录下的座右铭.txt座右铭.txt 等效于上面的写法../座右铭.txt 当前目录的上一级目录中的座右铭.txt 2、绝对路径 D&#xff1a;/Program File Windows系统下的绝对路径/usr/bin Linux系统…...

华为ENSP--ISIS路由协议

项目背景 为了确保资源共享、办公自动化和节省人力成本&#xff0c;公司E申请两条专线将深圳总部和广州、北京两家分公司网络连接起来。公司原来运行OSFP路由协议&#xff0c;现打算迁移到IS-IS路由协议&#xff0c;张同学正在该公司实习&#xff0c;为了提高实际工作的准确性和…...

论软件可靠性设计及其应用

摘要 2023 年 3 月&#xff0c;我所在的公司承接了某智慧加油站平台的建设工作。该项目旨在帮助加油站提升运营效率、降低运营成本和提高销售额。我在该项目中担任系统架构设计师&#xff0c;负责整个项目的架构设计工作。 本文结合我在该项目中的实践&#xff0c;详细论述了…...

Android中桌面小部件framework层使用到的设计模式

在Android中&#xff0c;桌面小部件&#xff08;App Widget&#xff09;的Framework层采用了多种设计模式&#xff0c;以实现模块化、可维护性和高效的交互。 以下是Android桌面小部件Framework层中常用的设计模式及其具体应用&#xff1a; 1. 观察者模式&#xff08;Observe…...

【JavaEE进阶】HTML

本节⽬标 认识 HTML 的基本结构, 学习常⽤的 HTML 标签. 一 HTML基础 1.什么是HTML HTML(Hyper Text Markup Language), 超⽂本标记语⾔. 超⽂本: ⽐⽂本要强⼤. 通过链接和交互式⽅式来组织和呈现信息的⽂本形式. 不仅仅有⽂本, 还可能包含图⽚, ⾳频, 或者⾃已经审阅过它…...

ElasticSearch 添加IK分词器

ElasticSearch 添加IK分词器 前言一、IK分词器的算法二、Ik分词器的下载安装&#xff08;Winows 版本&#xff09;三、Ik分词器的下载安装&#xff08;Linux 版本&#xff09;四、验证测试&#xff08;postman工具&#xff09;测试 ik_smart 分词算法测试 ik_max_word 分词算法…...

可视化建模与UML《顺序图实验报告》

旷野的规则是永不回头。 一、实验目的&#xff1a; 1、熟悉顺序图的构件事物。 2、熟悉发送者与接受者的关系 3、熟练掌握描绘顺序图 4、加深对顺序图的理解和应用能力 二、实验环境&#xff1a; window7 | 10 | 11 EA15 三、实验内容&#xff1a; 据如下描述绘制顺序图&…...

Mac的极速文件搜索工具,高效管理文件

Mac的资源管理可以说是许多转Mac的朋友用不明白的一点了&#xff0c;访达怎么用&#xff0c;文件怎么找&#xff0c;为什么找不到&#xff0c;非常的头大 All作为Mac上的极速文件搜索管理工具&#xff0c;有效的为文件查找困难的用户解决难题 基于极速搜索引擎&#xff0c;快…...

公开仓库改私有再配置公钥后Git拉取仍需要输入用户名的问题

问题描述&#xff1a;git拉取私有仓库需要输入用户名和密码 我之前写了一个脚本用来定时自动拉取远程仓库更新本地仓库&#xff0c;后来将这个远程仓库改成私有后执行脚本就会需要输入用户名和密码。 [rootLH2020 ~]# ./sync_repo.sh 正在从远程仓库拉取最新更改… Username f…...

工作流初始错误 泛微提交流程提示_泛微协同办公平台E-cology8.0版本后台维护手册(11)–系统参数设置

工作流初始错误 泛微提交流程提示_泛微协同办公平台E-cology8.0版本后台维护手册(11)–系统参数设置...-CSDN博客 工作流初始错误 泛微提交流程提示_泛微OA 工作流WebService接口使用说明 工作流初始错误 泛微提交流程提示_泛微OA 工作流WebService接口使用说明-CSDN博客 工作…...

window下安装rust 及 vscode配置

安装 安装mingw64 &#xff08;c语言环境 选择posix-ucrt&#xff09; ucrt:通用c运行时库配置mingw64/bin的路径到环境变量中在cmd窗口中输入命令 "gcc -v" 4. 下载Rust安装程序 安装 Rust - Rust 程序设计语言 5. 配置rustup和cargo目录 &#xff08;cargo是包管…...

【数据结构】【线性表】单链表1—概念即创建(附C语言源码)

单链表的定义&#xff0c; 链表用链式存储的方式实现线性表&#xff0c;链表中每个结点元素中需要指向下一个结点的指针&#xff08;有时候也要指向上一个结点的指针&#xff09;&#xff0c;链表中的每个结点指针只指向下一结点的被叫为单链表。 单链表的创建和初始化 先定…...

centos7的maven配置

首先进入conf配置文件夹下的setting.xml 要改两个地方 第一&#xff1a;设置镜像源 <mirror> <id>alimaven</id> <name>aliyun maven</name> <url>https://maven.aliyun.com/nexus/content/groups/public/</url> <mirrorOf>c…...

day57 图论章节刷题Part08(拓扑排序、dijkstra(朴素版))

拓扑排序-117. 软件构建 思路&#xff1a;拓扑排序是经典的图论问题。给出一个有向图&#xff0c;把有向图转成线性的排序就叫拓扑排序&#xff0c;拓扑排序也要检测有向图是否有环&#xff0c;即存在循环依赖的情况&#xff0c;因为这种情况是不能做线性排序的&#xff0c;所…...

【Steam登录】protobuf协议逆向

https://api.steampowered.com/IAuthenticationService/GetPasswordRSAPublicKey/v1 搜索 input_protobuf_encoded定位 input_protobuf_encoded的值就是 o s r.SerializeBody() o i.iI(s) 精准定位 打上条件断点&#xff1a;t ‘Authentication.GetPasswordRSAPublicKey…...

git 对已提交的说明进行编辑

如果提交代码的时候&#xff0c;对上次提交代码的说明不准确的话&#xff0c;例如 1、可以使用 git log 查看代码提交的记录&#xff1b; 2、使用 git commit --amend 命令对上次提交的说明进行编辑&#xff1a; 当显示上次提交的内容的时候&#xff0c;按下键盘 i 键即可编辑…...

在Ubuntu中设置开机自动运行(sudo)指令的指南

在Ubuntu系统中&#xff0c;有时需要在系统启动时自动执行某些命令&#xff0c;特别是需要 sudo权限的指令。为了实现这一功能&#xff0c;可以使用多种方法&#xff0c;包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法&#xff0c;并提供…...

解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错

出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上&#xff0c;所以报错&#xff0c;到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本&#xff0c;cu、torch、cp 的版本一定要对…...

【HTML-16】深入理解HTML中的块元素与行内元素

HTML元素根据其显示特性可以分为两大类&#xff1a;块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...

ardupilot 开发环境eclipse 中import 缺少C++

目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...

【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)

1.获取 authorizationCode&#xff1a; 2.利用 authorizationCode 获取 accessToken&#xff1a;文档中心 3.获取手机&#xff1a;文档中心 4.获取昵称头像&#xff1a;文档中心 首先创建 request 若要获取手机号&#xff0c;scope必填 phone&#xff0c;permissions 必填 …...

【Oracle】分区表

个人主页&#xff1a;Guiat 归属专栏&#xff1a;Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...

以光量子为例,详解量子获取方式

光量子技术获取量子比特可在室温下进行。该方式有望通过与名为硅光子学&#xff08;silicon photonics&#xff09;的光波导&#xff08;optical waveguide&#xff09;芯片制造技术和光纤等光通信技术相结合来实现量子计算机。量子力学中&#xff0c;光既是波又是粒子。光子本…...

智能AI电话机器人系统的识别能力现状与发展水平

一、引言 随着人工智能技术的飞速发展&#xff0c;AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术&#xff0c;在客户服务、营销推广、信息查询等领域发挥着越来越重要…...

uniapp 开发ios, xcode 提交app store connect 和 testflight内测

uniapp 中配置 配置manifest 文档&#xff1a;manifest.json 应用配置 | uni-app官网 hbuilderx中本地打包 下载IOS最新SDK 开发环境 | uni小程序SDK hbulderx 版本号&#xff1a;4.66 对应的sdk版本 4.66 两者必须一致 本地打包的资源导入到SDK 导入资源 | uni小程序SDK …...

LabVIEW双光子成像系统技术

双光子成像技术的核心特性 双光子成像通过双低能量光子协同激发机制&#xff0c;展现出显著的技术优势&#xff1a; 深层组织穿透能力&#xff1a;适用于活体组织深度成像 高分辨率观测性能&#xff1a;满足微观结构的精细研究需求 低光毒性特点&#xff1a;减少对样本的损伤…...