一. JS中的数据类型
- 基本数据类型:
String、Number、Boolean、Undefined、Null、Symbol - 引用数据类型:
Object
二. 数据类型判断方法
typeofinstanceofconstructor===Object.is()Array.isArray()isNaN()Object.prototype.toString()
typeof
对一个值使用typeof操作符的返回值(返回值类型为字符串)有以下几种:
- “undefined” — 值未定义
- “boolean” — 布尔值
- “string” — 字符串
- “number” — 数值
- “object” — 对象或null
- “function” — 函数
- “symbol” — Symbol
instanceof
检测某个变量是否是某个构造函数的实例。常用的一些JS原生引用类型有:
o instanceof Object— 变量o是否是Object类型的实例o instanceof Array— 变量o是否是Array类型的实例o instanceof RegExp— 变量o是否是RegExp类型的实例o instanceof Date— 变量o是否是Date类型的实例o instanceof Function— 变量o是否是Function类型的实例o instanceof Boolean— 变量o是否是Boolean类型的实例o instanceof String— 变量o是否是String类型的实例o instanceof Number— 变量o是否是Number类型的实例
constructor
constructor属性是对创建对象的构造函数的引用。
let a = '';
a.constructor === String; // true
a = 5;
a.constructor === Number; // true
new Date().constructor === Date; // true
===
判断两个操作数的数据类型和值是否完全一致。
"5" === 5— false
Object.is()
弥补了全等运算符===存在的两个怪异点:
+0 === -0— trueNaN === NaN— falseObject.is(+0, -0)— falseObject.is(NaN, NaN)— true
其他判断结果与===结果一致。
Array.isArray()
判断一个值是否是一个Array。解决了网页中存在多个iframe(即存在多个多个全局执行环境),instanceof无法判断Array类型的问题
Array.isArray([])— trueArray.isArray(Array.prototype)— true
示例代码:
// 获取窗口中最后一个框架中的Array构造函数
xArray = window.frames[window.frames.length-1].Array;
var arr = new xArray(1,2,3); // [1,2,3]
console.log(Array.isArray(arr)); // true
console.log(arr instanceof Array); // false
isNaN()
判断指定值是否为数字,是数字返回false,否则返回true。 isNaN() 在判断参数是否为数字之前,会首先使用 Number() 对参数进行数字类型的转换。所以 isNaN(value) 其实等效于:isNaN(Number(value))。当参数 value 能被 Number() 转换为数字时,结果返回 false,否则返回 true。
console.log(isNaN('100')) // false
console.log(isNaN('')) // false
console.log(isNaN('100px')) // true
console.log(isNaN(undefined)) // true
console.log(isNaN({})) // true
console.log(isNaN([])) // false
console.log(isNaN(null)) // false
Object.prototype.toString()
Object.prototype.toString.call(1) // "[object Number]"
Object.prototype.toString.call('hi') // "[object String]"
Object.prototype.toString.call({a:'hi'}) // "[object Object]"
Object.prototype.toString.call([1,'a']) // "[object Array]"
Object.prototype.toString.call(true) // "[object Boolean]"
Object.prototype.toString.call(() => {}) // "[object Function]"
Object.prototype.toString.call(null) // "[object Null]"
Object.prototype.toString.call(undefined) // "[object Undefined]"
Object.prototype.toString.call(Symbol(1)) // "[object Symbol]"