ECMAScript有6中简单数据类型(也称为原始类型):undefinednullbooleannumberstringsymbol
Symbol是ECMAScript6新增的还有一种复杂的数据类型:object;object是一种无序键值对的几何

typeof 操作符

因为ECMAScript的类型系统时松散的,所以需要一种给手段来确定任意变量的数据类型;typeof就是为此而生;返回下列字符串的相关说明:

  • undefined: 表示未定义
  • boolean: 表示值为布尔值
  • string:表示值为字符串
  • number:表示值为数值
  • object:表示值为对象(而不是函数)或者null
  • function:表示值为函数
  • symbol:表示值为符号
  1. <script>
  2. const name = 'Forest';
  3. const age = 21;
  4. const haveGirlFriend = false;
  5. const skills = ['html5', 'css3', 'javascript', 'git', 'vue', 'react', 'node', '微信小程序', '微信云开发', '微信公众号开发', 'go', 'mongodb', 'mysql', 'redis', 'docker', 'jenkins'];
  6. const hobby = {
  7. ball: ['篮球', '乒乓球'],
  8. read: {name: 'javascript高级程序设计', version: '第四版'}
  9. }
  10. const func = () => hobby['read']
  11. const symbolVal = Symbol(name);
  12. const deposit = null;
  13. console.log(typeof name); // string
  14. console.log(typeof age); // number
  15. console.log(typeof haveGirlFriend); // boolean
  16. console.log(typeof skills); // object 数组也是一个特殊的object
  17. console.log(typeof hobby); // object
  18. console.log(typeof deposit); // object 因为特殊值null被认为是一个对空对象的引用,所以返回值为null
  19. console.log(typeof func); // function
  20. console.log(typeof symbolVal); // symbol
  21. console.log(typeof girlFriend); // undefined
  22. </script>

在JavaScript中判断类型的方法可不止typeof, 还可以使用instanceofObject.prototype.toString

instance判断值的类型

instanceof 的方法通过new 一个对象,这个新对象就是它原型链继承上面的对象了,通过 instanceof 我们能判断这个对象是否是之前那个构造函数生成的对象,这样就基本可以判断出这个新对象的数据类型

  1. let Car = function() {}
  2. let benz = new Car()
  3. console.log(benz instanceof Car) // true
  4. let car = new String('Mercedes Benz')
  5. console.log(car instanceof String) // true
  6. let str = 'Covid-19'
  7. console.log(str instanceof String) // false

Tips:

  • instanceof 可以准确地判断复杂引用数据类型,但是不能正确判断基础数据类型;
  • 而 typeof 也存在弊端,它虽然可以判断基础数据类型(null 除外),但是引用数据类型中,除了 function 类型以外,其他的也无法判断。

Object.prototype.toString()

toString() 是 Object 的原型方法,调用该方法,可以统一返回格式为[object Xxx] 的字符串,其中 Xxx就是对象的类型。对于 Object 对象,直接调用 toString() 就能返回 [object Object];而对于其他对象,则需要通过 call 来调用,才能返回正确的类型信息。

  1. console.log(Object.prototype.toString({})) // [object Object]
  2. console.log(Object.prototype.toString.call({}) ) // [object Object]
  3. console.log(Object.prototype.toString.call(1) ) // [object Number]
  4. console.log(Object.prototype.toString.call('1')) // [object String]
  5. console.log(Object.prototype.toString.call(true)) // [object Boolean]
  6. console.log(Object.prototype.toString.call(function(){})) // [object Function]
  7. console.log(Object.prototype.toString.call(null)) // [object Null]
  8. console.log(Object.prototype.toString.call(undefined)) // [object Undefined]
  9. console.log(Object.prototype.toString.call(/123/g)) // [object RegExp]
  10. console.log(Object.prototype.toString.call(new Date())) // [object Date]
  11. console.log(Object.prototype.toString.call([])) // [object Array]
  12. console.log(Object.prototype.toString.call(document)) // [object HTMLDocument]
  13. console.log(Object.prototype.toString.call(window)) // [object Window]

Object.prototype.toString.call() 可以很好地判断引用类型,甚至可以把 document 和 window 都区分开来。但是在写判断条件的时候一定要注意,使用这个方法最后返回统一字符串格式为 “[object Xxx]” ,而这里字符串里面的 “Xxx” ,第一个首字母要大写(注意:使用 typeof 返回的是小写)

undefined类型

undefined是一个特殊的类型呢,只有varlet声明的变量但没有初始化值时,就相当于给变量赋予了undefined

  1. let name;
  2. console.log(name); // undefined
  3. let name = undefined; // 恒等于 let name;

Tips: 包含undefined值的变量跟未定义变量是有区别的