一、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
注意: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。
语法如下:
object instanceof constructor
其中 object
是某个实例对象,constructor是
某个构造函数或者说叫做一个类,结果是true或者false
注意:
(1)对于基本数据类型来说,字面量方式创建出来的结果和实例方式创建的返回结果是不同的:严格来说,只要通过实例创建出来的结果才能算是标准的对象数据类型,而对于字面量产生的值的方式不是严谨的实例,由于js作为一种弱类型语言具有松散特点,导致了Number.prototype上提供的方法只要在当前实例的原型链上,我们用其检测出来的结果都是 true。在类的原型继承中,我们最后检测出来的结果未必准确。这也不难知道,每一种程序语言都有严格的一套语法规范,因为程序不难像人一样一眼能看出来。
这个验证似乎在传达着:微服私访的皇帝老儿我就是不相信你是皇帝,但是你从皇宫带着保镖走出来的皇帝一定是真皇帝
(2) 不能检测 null 和 undefined
(3) 原型链可以重构,导致结果不准确
3.constructor:constructor 属性返回对创建此对象的数组函数的引用。
undefined、null没有contructor属性
语法
object.constructor
4.Object.prototype.toString.call()
三、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 原型与原型链终极详解