萧山网站制作公司作品集网站代码
我是目录
- 引言
 - 内置类型
 - 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的区别
undefined是全局对象的一个属性,null不是undefined是一个标识符,可以被当作变量来使用和赋值(不要这么干),null不可以
var undefined = 1 // 不会报错,虽然值还是undefined
var null = 1 // 报错,null是关键字,不能赋值
 
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变量时可能会丢失精度。 
BigInt 和 Number 不是严格相等的,但是宽松相等的。
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