ECMAScript有6中简单数据类型(也称为原始类型):undefined
、null
、boolean
、number
、string
、symbol
Symbol
是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); // string
console.log(typeof age); // number
console.log(typeof haveGirlFriend); // boolean
console.log(typeof skills); // object 数组也是一个特殊的object
console.log(typeof hobby); // object
console.log(typeof deposit); // object 因为特殊值null被认为是一个对空对象的引用,所以返回值为null
console.log(typeof func); // function
console.log(typeof symbolVal); // symbol
console.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) // true
let car = new String('Mercedes Benz')
console.log(car instanceof String) // true
let 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); // undefined
let name = undefined; // 恒等于 let name;
Tips: 包含
undefined
值的变量跟未定义变量是有区别的