Appearance
数据类型
JavaScript 数据类型分为基础数据类型和引用数据类型,
- 栈:基础数据类型(Undefined、Null、Boolean、Number、String、Symbol)
- 堆:引用数据类型(对象、数组和函数)
JavaScript 的基本数据类型包括:
- 数字(Number):表示整数和浮点数。
- 字符串(String):表示文本字符串。
- 布尔值(Boolean):表示真/假值。
- 空值(Null):表示空值或者空对象引用。
- 未定义(Undefined):表示变量已声明但未初始化。
- Symbol 类型(Symbol):表示独一无二的标识符。
而引用类型则包括:
- 对象(Object):表示一组相关属性和方法的集合。
- 数组(Array):表示一组有序的、可重复的元素的集合。
- 函数(Function):表示可执行的代码块并可以通过调用来实现特定功能的对象。
- 正则表达式(RegExp):表示一个正则表达式对象,用于匹配文本字符串中的模式。
- 日期(Date):表示一个日期时间对象。
另外 BigInt (ES11) 新增的数据类型:是一种数字类型的数据,它可以表示任意精度格式的整数,使用 BigInt 可以安全地存储和操作大整数,即使这个数已经超出了 Number 能够表示的安全整数范围。
数据类型检测的方式有哪些
typeof
其中数组、对象、null 都会被判断为 object 查看原因,其他判断都正确。
jsconsole.log(typeof 2) // number console.log(typeof true) // boolean console.log(typeof 'str') // string console.log(typeof []) // object console.log(typeof function () {}) // function console.log(typeof {}) // object console.log(typeof undefined) // undefined console.log(typeof null) // object
instanceof
能正确判断对象的类型,其内部运行机制是判断在其原型链中能否找到该类型的原型,一但原型链被篡改,就失效。
jsconsole.log(2 instanceof Number) // false console.log(true instanceof Boolean) // false console.log('str' instanceof String) // false console.log([] instanceof Array) // true console.log(function () {} instanceof Function) // true console.log({} instanceof Object) // true
Object.prototype.toString.call()
Array、Function
等类型作为Object
的实例,都重写了toString
方法,所以不能调用自身toString
方法jsvar a = Object.prototype.toString console.log(a.call(2)) // [object Number] console.log(a.call(true)) // [object Boolean] console.log(a.call('str')) // [object String] console.log(a.call([])) // [object Array] console.log(a.call(function () {})) // [object Function] console.log(a.call({})) // [object Object] console.log(a.call(undefined)) // [object Undefined] console.log(a.call(null)) // [object Null]
判断数组的方式有哪些
Object.prototype.toString.call()
jsObject.prototype.toString.call(obj).slice(8, -1) === 'Array'
instanceof
jsobj instanceof Array
Array.isArray()
jsArray.isArrray(obj)
null 和 undefined
Undefined 和 Null 都是基本数据类型,都表示缺失的值,只有一个值,就是 undefined 和 null。
- undefined 是一个全局变量,表示未定义的值或变量;
- null 是一个关键字,它表示一个空对象引用;
typeof null
使用 typeof 进行判断时,Null 类型化会返回 “object”,这是一个历史遗留的问题。
在 JavaScript 早期版本中,null
被错误地识别为一个对象类型,而这个错误的结构一直保留到今天,为了保持向后兼容性,ECMAScript 标准没有改变这个行为。
提示
object 类型标签是 000,而 null 的二进制全是 0,自然前三位也是 0,所以 typeof null 结果是 object。
NaN
js
typeof NaN // number
NaN === NaN // false
NaN
并不是一个数字,是一个警戒值,表示计算失败;NaN
是唯一一个自反与自身不相等,可使用isNaN
或Number.isNaN
来判断;
isNaN 和 Number.isNaN 函数都可以用来判断一个值是否为 NaN。但它们之间有一些区别:
isNaN 函数会将其参数转换为数字类型,如果不能转换,则将其视为 NaN。因此,对于非数字类型的参数,isNaN()可能会返回意料之外的结果。
jsconsole.log(isNaN('hello')) // 输出 true console.log(isNaN(undefined)) // 输出 true console.log(isNaN({})) // 输出 true
Number.isNaN 函数只有当其参数是 NaN 时才返回 true,否则返回 false。它不会对参数进行类型转换。因此,对于非 NaN 的非数字类型参数,Number.isNaN()始终返回 false。
jsconsole.log(Number.isNaN(NaN)) // 输出 true console.log(Number.isNaN('hello')) // 输出 false console.log(Number.isNaN(undefined)) // 输出 false console.log(Number.isNaN({})) // 输出 false