目录
一、JS数据类型
1.基本数据类型
2.引用数据类型
二、堆和栈
三、数据类型检测
1.typeof
2.instanceof
3.constructor
4.Object.prototype.toString.call()
JavaScript 中的数据类型主要分为两大类:原始数据类型(也称基本数据类型)和引用数据类型。
一、JS数据类型
1.基本数据类型
(1)Undefined未定义
类型只有一个值,即undefined
。
在使用var
声明变量,但未对其加以初始化时,这个变量值就是undefined
。
(2)Null空对象
类型只有一个值的数据类型,其特殊值就是null
。
从逻辑角度上看,null
是一个空的对象指针,表示一个空值或者没有值。
(3)Boolean
布尔类型,有两个值:true
和false
。
需要注意的是,布尔类型的字面值true
和false
是区分大小写的。
(4)Number
数字类型,有两种表示方法:整数和浮点数。例如:42
,3.14159
。
整数可以通过十进制、八进制、十六进制的字面值来表示。
浮点数必须包含一个小数点,且小数点后必须有一位数字。
(5)String
字符串类型,用于表示文本数据或字符序列。例如:"Hello, World!"
。
可以用单引号或双引号来表示,注意成对出现。
(6)Symbol
符号类型是ECMAScript 6版新定义的。
符号类型是唯一的并且是不可修改的,通常用于对象属性的键。例如:Symbol('myKey')
。
Symbol
函数前不能使用new
命令,否则会报错。
(7)BigInt
表示任意精度的整数。用于表示大于 2^53 - 1
的整数。例如:123n
。
2.引用数据类型
(1)Object
对象类型,是一组数据和功能(函数)的集合。它可以包含其他的数据类型(包括原始类型和对象类型),以及方法(函数)。例如:{name: 'Alice', age: 25}
。
(2)Array
数组类型,表示一个有序的集合。例如:[1, 2, 3]
。
数组可以使用索引来访问其元素。
(3)Function
函数类型,表示一个可执行的操作。例如:function add(a, b) { return a + b; }
。
在JavaScript中,函数也是对象,因此它们可以拥有属性和方法。
(4)Date
日期类型,表示日期和时间。例如:new Date()
。
提供了多种方法来操作和格式化日期和时间。
(5)RegExp(正则表达式)
用于匹配文本的模式,通常用于文本搜索和“查找替换”文本操作。例如:/ab+c/i
。
在处理字符串和文本时非常有用。
二、堆和栈
栈:原始数据类型
堆:引用数据类型
两种类型的区别在于存储位置的不同:
原始数据类型直接存储在栈中的简单数据段,占据空间小、大小固定,属于被频繁使用数据,所以放入栈中存储;
引用数据类型存储在堆中的对象,占据空间大,大小不固定。
三、数据类型检测
1.typeof
typeof
运算符是用于检测变量数据类型的常用方法。尽管它非常有用,但有一些限制和特殊情况需要注意。
console.log(typeof undefined); // undefined
console.log(typeof 0); // number
console.log(typeof true); // boolean
console.log(typeof "hello"); // string
console.log(typeof Symbol()); // symbol
const bigIntNum = 9007199254740991n;
console.log(typeof bigIntNum); // bigint
function foo() {}
console.log(typeof foo); // function
其中数组、对象、null都会被判断为object,其他判断都正确。
console.log(typeof null); // // object
console.log(typeof []); // object
console.log(typeof {}); // object
2.instanceof
instanceof
运算符用于检测一个对象是否是另一个构造函数的实例。这个运算符非常有用,尤其是在处理对象和数组时,因为 typeof
运算符对它们都返回 "object"
,这使得 instanceof
成为区分它们的有效工具。但是instanceof只能正确判断引用数据类型,而不判断基本数据类型。
const obj = {};
console.log(obj instanceof Object); // true
const arr = [];
console.log(arr instanceof Array); // true
console.log(2 instanceof Number); // false
3.constructor
constructor有两个作用,一是判断数据的类型,二是对象实例通过constructor对象访问它的构造函数。如果创建一个对象来改变它的原型,constructor就不能用来判断数据类型了。
console.log({}.constructor === Object); // true
console.log([].constructor === Array); // true
console.log(function(){}.constructor === Function); // true
console.log((2).constructor === Number); // true
console.log(('str').constructor === String); // true
// 如果创建一个对象来改变它的原型,constructor就不能用来判断数据类型了。
function myFn(){};
myFn.prototype=new Array();
var f = new myFn();
console.log(f.CONSTRUCTOR===myFn); // false
console.log(f.constructor===Array); // true
4.Object.prototype.toString.call()
Object.prototype.toString.call()
使用Object对象的原型方法toSting来判断数据类型。
console.log(Object.prototype.toString.call(42)); // "[object Number]"
console.log(Object.prototype.toString.call("Hello")); // "[object String]" console.log(Object.prototype.toString.call(true)); // "[object Boolean]" console.log(Object.prototype.toString.call({})); // "[object Object]" console.log(Object.prototype.toString.call([])); // "[object Array]" console.log(Object.prototype.toString.call(null)); // "[object Null]" console.log(Object.prototype.toString.call(undefined));// "[object Undefined]"
这些方法可以结合使用,以覆盖 typeof
的不足,提供更全面和准确的数据类型检测。
记录
若文章对你有帮助,点赞、收藏加关注吧!