JavaScript- 数据类型
分了2大类型:简单数据类型、复杂(引用)数据类型
涉及到数据类型的情况下,我们可以联想到typescript,ts是强类型语言,变量会进行类型检查,变量类型限制死,不能随便更改;
而js是弱类型语言,变量类型没限制死,可以随时改变
1、简单数据类型介绍
简单数据类型也叫做基本数据类型、值类型,因为起单纯存储值。
-
Number:数值型(数字型),参与数学运算做数字的标识 ,例子:1,3,4
-
String:字符串型,用来表示文字的
''和""和
``'jessica'、 "jessica"、 `jessica` (1左边的那个键)
-
Boolean:布尔类型
true和false
2种状态 -
undefined:未定义类型,代表未定义(只声明没赋值)
-
null :空值类型,代表定义未赋值
-
NaN:数字值(number),表示不是一个合法的数字
-
// 怎么产生的? Number('abc'); // NaN Number('undefined') // NaN
-
注意点:NaN是唯一一个与自己不相等的值 ;
-
如何辨别NaN;isNaN(NaN) // true;
-
-
Symbol(符号,ES6新增):Symbol是一种新的基本数据类型,用于表示独一无二的值。它可以用作对象属性的键,以确保属性的唯一性。
2、复杂数据类型介绍
复杂数据类型也叫引用数据类型,它可以通过new关键字去创建新的实例
-
Object:对象类型,表示一组数据、功能相关的内容,树状结构,每个键值对应属性名和属性值;
-
Array:数组类型,有序的数据集合,也可以为树状结构,叫多维数组,有对应的长度、索引;
-
Function:函数类型,表示可以执行的代码块,可以接收参数也可以返回内容;
以下为ES6新引入的数据类型:
-
Set(集合):Set是一种新的数据结构,它类似于数组,但是成员的值都是唯一的,没有重复的值。
-
Map(映射):Map是一种新的数据结构,它类似于对象,但是键可以是任意类型,而不仅限于字符串。
-
Promise(承诺):Promise是一种用于处理异步操作的对象。它表示一个异步操作的最终完成或失败,并可以返回结果或错误信息。
-
Proxy(代理):Proxy是一种用于创建对象的代理,可以拦截并自定义对象的操作。它可以用于实现属性的拦截、验证、修改等功能。
-
Class(类):ES6引入了class关键字,用于定义类。类是一种面向对象编程的基本概念,可以用于创建对象和定义对象的行为。
3、如何检测数据类型
简单数据类型:
- typeof(数据/变量名): 返回简单数据类型(除了null)、函数类型(string、boolean、function等)只能准确判断简单数据类型和函数(函数其实是对象,并不属于另一种数据类型,但也能够使用 typeof 进行区分),无法精确判断出引用数据类型(统统返回 object)
复杂数据类型:
-
被检测变量.instanceof(引用类型(Boolean)):返回布尔值,准确判断复杂数据类型
instanceof运算符返回一个布尔值,可以用于检测构造函数的 prototype 属性是否出现在某个实例对象的原型链上,通俗说就是用于判断某个实例是否属于某构造函数。再通俗一点就是,只要右边变量的prototype在左边变量的原型链上就返回 true,否则返回 false。
//如何实现instanceof函数, // arr instanceOf Array ====>返回布尔类型 function(left,right){ if(typeOf left !== object ||left === null ) return false; let pro = Object.getPrototypeOf(left); while(true){ if(pro === null) return null; if(pro === right.prototype) return true; pro = pro.getPrototypeOf(pro); } }
全部类型:Object.prototype.toString.call(),返回类型
4、typeof 和 instanceof的区别总结
- typeof ,但只能准确判断基本数据类型(null除外),无法精确判断出引用数据类型(function 除外)
- instanceof通过判断原型,但只可以准确判断引用数据类型,但是不能正确判断原始数据类型,返回 true或 false
- Object.prototype.toString.call()方法可以作为通用检测数据类型