详谈JS中的数据类型

一.js中的数据类型

首先,js的数据类型分为以下两种,基本数据类型和引用数据类型.

基本数据类型(又称为简单数据类型)

number:NaN infinity

string:正常字符串/模板字符串

Boolean: true或false

null:空

undefined:未定义

symbol:唯一值(es6新增)bigInt:大数字(es10新增)

引用数据类型(又称复杂数据类型)

在js中,object是一个基类

object

Array

function

RegExp

Date

symbol的解释

//对symbol的解释 代表的是唯一值 
    //简单来说:放声明的同一个变量,再次被赋值的时候,数据会被迭代,这时候就是用到了symbol
    
    console.log('111' === '111') //true
    console.log(Symbol('111') === Symbol('111'));  //false
   //举例
let obj={
    age:11,
    symbol(age):12
}


二.检验数据类型的方法

1.typeof

基本数据类型中的number string boolean undefined以及引用数据类型中的function,可以使用typeof检验数据类型,分别返回对应的数据类型的小写字符

注意:基本数据类型中的null,引用数据类型中的Array Object Date RegExp不可以使用typeof检测,都会返回小写的object

   //验证简单数据类型,返回值是 类型所对应的 小写字母
    console.log(typeof false); //boolean
    console.log(typeof 100);   //number
    console.log(typeof 'String'); //string
    console.log(typeof undefined); //undefined
    //
    //验证复杂数据的类型
    console.log(typeof {}); //object
    console.log(typeof null);  //打印出的是 object
    console.log(typeof function () { }); //function

提出问题:为什么使用typeof检测null是返回的是object?

浏览器是使用c++语言写的,电脑本身是机器语言,所有的数据类型在计算机中都以二进制方式存储的; typeof只判断二进制的前三位
整数:1
字符串:100
布尔值:110
对象:000
null:00000
undefined:-2^30

2.instanceof

使用此方法检测数据类型的话,需要知道要检测的数据属于哪种数据类型;

返回的值为布尔值;常被用来检测数组类型的数据;

 console.log([1, 2, 3, 4] instanceof Array);  //true

 console.log({ name: '浏览' } instanceof Object);//true

注意:若用于判断传来的数据时数组还是对象的话,代码如下

eg:

数据.instanceof Object    //无论数据时数组还是对象,返回值都为true;毕竟 ''万物皆对象嘛''

所以应写为

数据.instanceof Array?[]:{};

3.constructor

constructor是prototype对象上的属性,指向构造函数,根据实例对象寻找属性的顺序,若实例对象上没有实例属性或方法时,就去原型链上寻找,因此,实例对象也是能使用constructor属性的.

要判断的数据类型的变量.constructor 返回值是一个构造函数

注意:undefined和null没有constructor属性

用法如下:

let func = function () { console.log(111); }

console.log(func.constructor == Function);  //打印的是true

4.Object.prototype.toString.call()

在平常的使用中,使用此法可以判断任意的数据类型,返回值为[Object 对应的数据类型]

console.log(Object.prototype.toString.call(123)); //[object Number]

console.log(Object.prototype.toString.call('fre')); //[object String]

要想只拿到对应的数据类型,可以采用以下方式

Object.prototype.toString.call(obj).replace(/^\[object (\S+)\]$/, '$1')

或

Object.prototype.toString.call(obj).replace(/\[object ([a-zA-Z]{0,})\]/, '$1')

注意:

1.正则不能加'',否则不起效果,仍为[object 对应的数据类型]

2.object与()之间要有空格

5.Jquery.type()

作为简单的了解,使用此方法检测undefined和null时,返回的是相应的'undefined'和'null'

 console.log(Jquery.type('string'))  //返回的是string


三.基本数据类型和引用数据类型的区别

基本数据类型是原始值,直接存储在栈内存中

引用数据类型,它的值在堆内存中开辟了一块新的内存空间,我们通过变量来复制一个引用数据类型的时候,其实就是把这个开辟的空间的地址进行了一个赋值

运行机制== 堆栈内存

堆内存 Heap 用来存放数据

栈内存 Stack 用来执行数据

执行上下文 Execution Context Stack

当浏览器开始加载页面时,首先会分配一块内存,用来指向代码,这一块是栈内存

详谈JS中的数据类型

成员访问

在一个对象中使用点的形式去读取某一个属性的值,这种操作方法叫做成员访问

注意:成员访问要高于声明变量

正常代码  从右向左执行; 但成员访问的优先级最高
a.x=a=12
执行顺序
a.x=12
a=12

举个例子来说明

详谈JS中的数据类型

 四.手动封装一个检测数据类型的方法

let objs = {
            name: 'kdowk',
            age: 15
        }
        //1.借用typeof进行分装
        function isObject(obj) {
            let type = typeof obj  //判断传来的数据的类型

            if (type !== "object") {  //不是object的即是简单数据类型的直接进行判断
                return type
            } else {
                return Object.prototype.toString.call(obj).replace(/\[object ([a-zA-Z]{0,})\]/, '$1')
            }

        }
        Object.isObject = isObject
        console.log(Object.isObject(objs));//对象
        console.log(Object.isObject(111));//数字
        console.log(Object.isObject("objs")); //字符串
        console.log(Object.isObject(function () { })); //函数

上一篇:数位DP


下一篇:【STM32】STM32CubeMX HAL库 DMA[1]引言