ECMAScript有6中简单数据类型(也称为原始类型):undefined、null、boolean、number、string、symbolSymbol是ECMAScript6新增的还有一种复杂的数据类型:object;object是一种无序键值对的几何
typeof 操作符
因为ECMAScript的类型系统时松散的,所以需要一种给手段来确定任意变量的数据类型;typeof就是为此而生;返回下列字符串的相关说明:
undefined: 表示未定义boolean: 表示值为布尔值string:表示值为字符串number:表示值为数值object:表示值为对象(而不是函数)或者nullfunction:表示值为函数symbol:表示值为符号
<script>const name = 'Forest';const age = 21;const haveGirlFriend = false;const skills = ['html5', 'css3', 'javascript', 'git', 'vue', 'react', 'node', '微信小程序', '微信云开发', '微信公众号开发', 'go', 'mongodb', 'mysql', 'redis', 'docker', 'jenkins'];const hobby = {ball: ['篮球', '乒乓球'],read: {name: 'javascript高级程序设计', version: '第四版'}}const func = () => hobby['read']const symbolVal = Symbol(name);const deposit = null;console.log(typeof name); // stringconsole.log(typeof age); // numberconsole.log(typeof haveGirlFriend); // booleanconsole.log(typeof skills); // object 数组也是一个特殊的objectconsole.log(typeof hobby); // objectconsole.log(typeof deposit); // object 因为特殊值null被认为是一个对空对象的引用,所以返回值为nullconsole.log(typeof func); // functionconsole.log(typeof symbolVal); // symbolconsole.log(typeof girlFriend); // undefined</script>
在JavaScript中判断类型的方法可不止
typeof, 还可以使用instanceof、Object.prototype.toString
instance判断值的类型
instanceof 的方法通过new 一个对象,这个新对象就是它原型链继承上面的对象了,通过 instanceof 我们能判断这个对象是否是之前那个构造函数生成的对象,这样就基本可以判断出这个新对象的数据类型
let Car = function() {}let benz = new Car()console.log(benz instanceof Car) // truelet car = new String('Mercedes Benz')console.log(car instanceof String) // truelet str = 'Covid-19'console.log(str instanceof String) // false
Tips:
- instanceof 可以准确地判断复杂引用数据类型,但是不能正确判断基础数据类型;
- 而 typeof 也存在弊端,它虽然可以判断基础数据类型(null 除外),但是引用数据类型中,除了 function 类型以外,其他的也无法判断。
Object.prototype.toString()
toString() 是 Object 的原型方法,调用该方法,可以统一返回格式为[object Xxx] 的字符串,其中 Xxx就是对象的类型。对于 Object 对象,直接调用 toString() 就能返回 [object Object];而对于其他对象,则需要通过 call 来调用,才能返回正确的类型信息。
console.log(Object.prototype.toString({})) // [object Object]console.log(Object.prototype.toString.call({}) ) // [object Object]console.log(Object.prototype.toString.call(1) ) // [object Number]console.log(Object.prototype.toString.call('1')) // [object String]console.log(Object.prototype.toString.call(true)) // [object Boolean]console.log(Object.prototype.toString.call(function(){})) // [object Function]console.log(Object.prototype.toString.call(null)) // [object Null]console.log(Object.prototype.toString.call(undefined)) // [object Undefined]console.log(Object.prototype.toString.call(/123/g)) // [object RegExp]console.log(Object.prototype.toString.call(new Date())) // [object Date]console.log(Object.prototype.toString.call([])) // [object Array]console.log(Object.prototype.toString.call(document)) // [object HTMLDocument]console.log(Object.prototype.toString.call(window)) // [object Window]
Object.prototype.toString.call() 可以很好地判断引用类型,甚至可以把 document 和 window 都区分开来。但是在写判断条件的时候一定要注意,使用这个方法最后返回统一字符串格式为 “[object Xxx]” ,而这里字符串里面的 “Xxx” ,第一个首字母要大写(注意:使用 typeof 返回的是小写)
undefined类型
undefined是一个特殊的类型呢,只有var和let声明的变量但没有初始化值时,就相当于给变量赋予了undefined值
let name;console.log(name); // undefinedlet name = undefined; // 恒等于 let name;
Tips: 包含
undefined值的变量跟未定义变量是有区别的
