js数据类型有哪些
在 ECMAScript 规范中, 分为 基本类型 和 引⽤类型 两⼤类,如下所示: 基本数据类型(值类型):-
number: NaN\Infinity\正常数字 string: 正常字符串\模版字符串 boolean: true\false null: 空 typeof null ==> "object" undefined: 未定义 symbol: 唯一值 bigInt: 大数字
-
在js中Object是一个基类 object:Object、Array、function、Date、RegExp。
基本数据类型和引用数据类型的区别
基本类型 也称为简单类型,由于其占据空间固定,是简单的数据段,为了便于提升变量查询速度,将其 存储在栈中,即按值访问。 引⽤类型 也称为复杂类型,由于其值的⼤⼩会改变,所以不能将其存放在栈中,否则会降低变量查询速度,因此,其值存储在堆(heap) 中,⽽存储在变量处的值,是⼀个指针,指向存储对象的内存处,即按址访问。堆栈内存
堆(内存) Heap 存储计算所用的数据 仓库
栈(内存) Stack 存贮计算过程空间 先进先出 先进后出
基本数据类型和引用数据类型在内存中的执行(图)
js中常见的数据类型判断
- typeof 只能判断基本数据类型(null==>object); 判断引用数据类型 都返回object
let str = 'dhvd'
console.log(typeof(str)); //string
let num = 123
console.log(typeof(num)); //number
let flag = false
console.log(typeof(flag)); //boolean
let s = Symbol('s')
console.log(typeof(s)); //symbol
let obj = {}
console.log(typeof(obj)); //object
let arr = []
console.log(typeof(arr)); //object
- instanceof 只有知道数据类型才可以判断 语法: 要判断数据类型的变量 instanceof Array,返回结果为布尔值,true/false。
[] instanceof Array;// true
{} instanceof Object;// true
new Date() instanceof Date;// true
function Person() { };
console.log(new Person() instanceof Person);
[] instanceof Object;// true
new Date() instanceof Object;// true
new Person instanceof Object;// true
*由于Object 是 js 的一个基类,根据原型链的机制,[] instanceof Object; 也返回 true 。
- constructor 语法: 要判断数据类型的变量.constructor === Array
console.log('数据类型判断' - constructor);
console.log(arr.constructor === Array); //true
console.log(date.constructor === Date); //true
console.log(fn.constructor === Function); //true
*null 和 undefined 是⽆效的对象,因此是不会有 constructor 存在的。
- Object.prototype.toString.call() 原生js最全能的数据类型判断 "[object 数据类型]"
Object.prototype.toString.call(''); // [object String]
Object.prototype.toString.call(1); // [object Number]
Object.prototype.toString.call(true);// [object Boolean]
Object.prototype.toString.call(Symbol());//[object Symbol]
Object.prototype.toString.call(undefined);// [object Undefined]
Object.prototype.toString.call(null);// [object Null]
Object.prototype.toString.call(new Function());// [object Function]
Object.prototype.toString.call(new Date());// [object Date]
Object.prototype.toString.call([]);// [object Array]
Object.prototype.toString.call(new RegExp());// [object RegExp]
Object.prototype.toString.call(new Error());// [object Error]
Object.prototype.toString.call(document);// [object HTMLDocument]
Object.prototype.toString.call(window);//[object global] window 是全局对象global 的引⽤
- Array.isArray() 数组API
- Number.isNaN() 是不是 不是一个数 NaN ===> not a number
手写 Object.toType(a) 方法判断 js 数据类型
// Object.toType(a) ==> "数据类型"
function toType(data) {
if (typeof data !== 'object') return typeof data;
if (typeof data === 'object' && data == null) return 'null';
let obj = {},
type = obj.toString.call(data),
result;
type.replace(/\[object (\w+)\]/, (q, p) => {
result = p.toLowerCase();
})
return result;
}