JavaScript是一门弱类型语言,就意味着在声明变量时不需要指定数据类型,在程序运行过程中,类型会自动被确定。那要怎么确定用到变量是什么数据类型呢?我整理了几个方法,一起看看吧。
了解JS中的数据类型
基本数据类型
- Number:基于IEEE 754标准的双精度64位二进制格式的值。除了能够表示浮点数外,还有一些带符号的值:+Infinity,-Infinity和NaN。
- String:用于表示和操作字符序列。
- Boolean:布尔类型,只有true和false两个值。
- Null:特指对象的值未设置;在布尔运算中被认为是false。
- Undefined:一个没有被赋值的变量会有个默认值undefined;undefined是全局对象的一个属性。
- BigInt:使用BigInt可以安全地存储和操作大整数,常常通过在整数末尾附加 n 或者调用构造函数来创建。
- Symbol:是ES6新增的一种基本数据类型。是唯一并且不可变的原始值并且可以用来作为对象属性的键。
复杂数据类型
- Object:对象(object)是指内存中的可以被引用的一块区域。在 JavaScript 中,对象是唯一可变的值。包括基本的对象、函数(Function)、数组(Array)和内置对象Date等。
判断类型
一、typeof
示例:
typeof "5"; // string
typeof 5; // number
typeof null; // object
typeof undefined; // undefined
typeof true; // boolean
typeof Symbol('5'); // symbol
typeof 5n); // bigint
typeof new Object(); // bigint
typeof new Array([1,2]); // bigint
typeof new Date(); // bigint
typeof new Function(); // function
由上面例子可以看出:
- 基本类型中,除了null被认为是空对象,返回了object外,其余都返回的正确类型。
- 复杂类型中,除了函数返回的function,其余都是返回的object。
typeof可以判断(除null)基本数据类型,但是难以判断(除function)复杂数据类型
二、instanceof
语法:
object instanceof constructor
instanceof运算符用来检测constructor.prototype是否存在在于参数object的原型链上。
示例:
[1,2] instanceof Array; // true
[1,2] instanceof Object; // true
var myStr = "This is a string";
myStr instanceof String; // true
myStr instanceof Object; // true
var myDate = new Date();
myDate instanceof Date; // true
myDate instanceof Object; // true
myDate instanceof String; // false
注:空对象的判断问题
var myObj1 = {};
var myObj2 = Object.create(null);
var myObj3 = Object.create({});
myObj1 instanceof Object; // true
myObj2 instanceof Object; // false,Object.create(null)会造成创建的对象其__proto__指向为空
myObj3 instanceof Object; // true
由上面例子可以看出:
- instanceof只能用来判断变量的原型链上是否有构造函数的prototype属性,不一定能获取对象的具体类型。
- instanceof不适合判断原始类型的值
在不同的window或者iframe之间,不能使用instanceof
三、Object.prototype.toString.call
可以通过Object.prototype.toString方法返回类型字符串。但由于实例对象可能会重写toString方法,所以使用时要加上call。
示例:
Object.prototype.toString.call('5') // [object String]
Object.prototype.toString.call(5) // [object Number]
Object.prototype.toString.call([5]) // [object Array]
Object.prototype.toString.call(true) // [object Boolean]
Object.prototype.toString.call(undefined) // [objectUndefined]
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(new RegExp()); // [object RegExp]
Object.prototype.toString.call(new Error()); // [object Error]
四、constructor
每个实例对象都可通过constructor来访问它的构造函数,但是undefined和null是无效的对象,因此没有constructor属性。
示例:
[1,2].__proto__.constructor === Array; // true
"1".__proto__.constructor === String; // true
undefined.__proto__.constructor === Undefined; // Cannot read properties of undefined (reading '__proto__')
null.__proto__.constructor === Null; // Cannot read properties of undefined (reading '__proto__')
总结
- typeof适用于基本类型和function类型的检测,null和复杂数据类型无法判断。
- instanceof适用于判断某个对象是否是某一构造函数的实例.
- Object.prototype.toString.call可判断所有类型。
- constructor能判断除undefined和null之外的所有类型。