当前位置: 首页 > 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
http://www.lryc.cn/news/480711.html

相关文章:

  • Mac上无法访问usr/local的文件
  • http 常见状态码
  • 代码训练营 day59|并查集
  • Node.js——fs模块-路径补充说明
  • 华为ENSP--ISIS路由协议
  • 论软件可靠性设计及其应用
  • Android中桌面小部件framework层使用到的设计模式
  • 【JavaEE进阶】HTML
  • ElasticSearch 添加IK分词器
  • 可视化建模与UML《顺序图实验报告》
  • Mac的极速文件搜索工具,高效管理文件
  • 公开仓库改私有再配置公钥后Git拉取仍需要输入用户名的问题
  • 工作流初始错误 泛微提交流程提示_泛微协同办公平台E-cology8.0版本后台维护手册(11)–系统参数设置
  • window下安装rust 及 vscode配置
  • 【数据结构】【线性表】单链表1—概念即创建(附C语言源码)
  • centos7的maven配置
  • day57 图论章节刷题Part08(拓扑排序、dijkstra(朴素版))
  • 【Steam登录】protobuf协议逆向
  • git 对已提交的说明进行编辑
  • CTF —— 网络安全大赛
  • 【大数据测试spark+kafka-详细教程(附带实例)】
  • 如何为 GitHub 和 Gitee 项目配置不同的 Git 用户信息20241105
  • 【Lucene】原理学习路线
  • Go语言的并发安全与互斥锁
  • SpringBoot框架在资产管理中的应用
  • ElasticSearch备考 -- 集群配置常见问题
  • 【UE5】一种老派的假反射做法,可以用于移动端,或对反射的速度、清晰度有需求的地方
  • FasterNet中Pconv的实现、效果与作用分析
  • QToolbar工具栏下拉菜单不弹出有小箭头
  • w025基于SpringBoot网上超市的设计与实现