一、JS中有哪些数据类型?

Undefined、Null、String、Number、Boolean、Object、Symbol共7种


其中基本数据类型包括 Undefined、Null、Number、Boolean、String、Symbol (ES6 新增,表示独一无二的值),而引用数据类型统称为 Object 对象,主要包括对象、数组和函数

注意:Symbol是ES6才出现的,它是一种基本数据类型。​​Symbol()​​函数会返回symbol类型的值。该类型具有静态属性和静态方法 。每个从​​Symbol()​​返回的symbol值都是唯一的。一个symbol值能作为对象属性的标识符。

二、JS中数据类型有哪些判断的方法?

1.typeof

JS数据类型以及数据类型的判断方法_javascript

注意:null数组进行typeof操作符后,结果是object,原因在于,null和数组被当做一个空对象引用。

2.instanceof (推荐使用)

instanceof​ 运算符用于检测构造函数的 ​​prototype​​ 属性是否出现在某个实例对象的原型链上,换句话说就是:instanceof用来测试一个实例对象在其原型链中是否存在一个构造函数的prototype属性,存在即为真true,不存在即为false。

原理是instanceof 是通过原型链判断的,A instanceof B, 在A的原型链中层层查找,是否有原型和类(构造函数)的一个属性即B.prototype相等,如果一直找到A的原型链的顶端(null即Object.prototype.__proto__),仍然不等于B.prototype,那么返回false,否则返回true。

JS数据类型以及数据类型的判断方法_原型链_02

语法如下:

object instanceof constructor

其中 ​​object​​​ 是某个实例对象,​​constructor是​​某个构造函数或者说叫做一个类,结果是true或者false

// 定义构造函数
function C(){}
function D(){}

var a1 = new C();


a1 instanceof C; // true,因为 Object.getPrototypeOf(a1) === C.prototype


a1 instanceof D; // false,因为 D.prototype 不在 a1 的原型链上

a1 instanceof Object; // true,因为 Object.prototype.isPrototypeOf(a1) 返回 true
C.prototype instanceof Object // true,同上

C.prototype = {};
var a2 = new C();

a2 instanceof C; // true

a1 instanceof C; // false,C.prototype 指向了一个空对象,这个空对象不在 a1 的原型链上.

D.prototype = new C(); // 继承
var a3 = new D();
a3 instanceof D; // true
a3 instanceof C; // true 因为 C.prototype 现在在 a3 的原型链上

JS数据类型以及数据类型的判断方法_开发语言_03

注意:

(1)对于基本数据类型来说,字面量方式创建出来的结果和实例方式创建的返回结果是不同的:严格来说,只要通过实例创建出来的结果才能算是标准的对象数据类型,而对于字面量产生的值的方式不是严谨的实例,由于js作为一种弱类型语言具有松散特点,导致了Number.prototype上提供的方法只要在当前实例的原型链上,我们用其检测出来的结果都是 true。在类的原型继承中,我们最后检测出来的结果未必准确。这也不难知道,每一种程序语言都有严格的一套语法规范,因为程序不难像人一样一眼能看出来。

JS数据类型以及数据类型的判断方法_原型模式_04

这个验证似乎在传达着:微服私访的皇帝老儿我就是不相信你是皇帝,但是你从皇宫带着保镖走出来的皇帝一定是真皇帝

(2) 不能检测 null 和 undefined

(3) 原型链可以重构,导致结果不准确

3.constructor:constructor 属性返回对创建此对象的数组函数的引用。

undefined、null没有contructor属性

语法

object.constructor

4.Object.prototype.toString.call()

JS数据类型以及数据类型的判断方法_javascript_05

三、JS数据类型的使用问题:

1.const 定义的值是否可以改变?

四、参考连接

[1].​​JS之instanceof详解​​

[2].​​JavaScript 数据类型及object类型介绍​​

[3].​​JS中的六大数据类型​​

[4].​​JavaScript 有几种类型的值?​

[5].​​instanceof​

[6].​​Object.prototype.toString.call(obj)精确判断对象的类型​​

[7].​​js检测变量类型--typeof && instanceof​​

[8].​​最详尽的 JS 原型与原型链终极详解​​