JavaScript数据类型
JavaScript基本数据类型/原始数据类型/值类型(六种)
Null   
Undefined   
String    
Number   
Boolean   
Symbol 
注:Symbol 是 ES6 引入了一种新的原始数据类型,表示独一无二的值。
注:在es10中加入了原始数据类型BigInt,现已被最新Chrome支持  
1 2 3 4 5
   | console.log(BigInt)  console.log(typeof 1n)  console.log(1n instanceof BigInt)  console.log(Object.prototype.toString.call(1n))  console.log(jQuery.type(1n)) 
   | 
 
BigInt MDN
引用数据类型/对象数据类型(一种)
Object   
Array   
Function   
Date   
RegExp 
注:除了Array、Function、Date、RegExp属于特殊的对象数据类型。
包装类型(三种)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
   | const Booln = new Boolean(true) console.log(Booln)  console.log(Booln === true)  console.log(typeof Booln)  console.log(Booln instanceof Object)  console.log(Object.prototype.toString.call(Booln))  console.log(Object.prototype.toString(Booln)) 
  const str = new String('123') console.log(str)  console.log(str === '123')  console.log(typeof str)  console.log(str instanceof Object)  console.log(Object.prototype.toString.call(str))  console.log(Object.prototype.toString(str)) 
  const num = new Number(123) console.log(num)  console.log(num === 123)  console.log(typeof num)  console.log(num instanceof Object)  console.log(Object.prototype.toString.call(num))  console.log(Object.prototype.toString(num)) 
   | 
 
1、引用类型和基本包装类型的区别就是对象的生存期;
2、自动创建的基本包装类型的对象,只存在于一行代码的执行瞬间,然后立即被销毁;
3、意味着我们不能在运行时为基本类型添加属性和方法。  
基本类型的字面量写法,很明显不能为基本类型添加属性和方法
1 2 3 4 5 6 7 8 9
   | const s1 = 'name.Lee' s1.name = 'lee' s1.age = function () {   return 100 } console.log(s1.substring(5))  console.log(typeof s1)  console.log(s1.name)  console.lgo(s1.age()) 
   | 
 
new运算符写法,既能添加方法属性,还能使用它的内置方法substring
1 2 3 4 5 6 7 8 9
   | const s2 = new String('name.Lee') s2.name = 'lee' s2.age = function () {   return 100 } console.log(s2.substring(5))  console.log(typeof s2)  console.log(s2.name)  console.log(s2.age()) 
  | 
 
null和undefined的区别
undefined与null的区别—阮一峰  
笔记:  
1、在!运算符处理后,自动转成true
1 2 3
   | console.log(!null)  console.log(!undefined)  console.log(!undefined === !null) 
   | 
 
2、相等,但是不全等  
1 2
   | console.log(null == undefined)  console.log(null === undefined) 
   | 
 
3、最初设计:null是一个表示”无”的对象,转数值为0;undefined是一个表示”无”的原始值,转数值为NaN。
1 2 3 4 5
   | console.log(Number(undefined))  console.log(Number(5 + undefined)) 
  console.log(Number(null))  console.log(Number(5 + null)) 
   | 
 
4、两者typeof区别:  
1 2
   | console.log(typeof undefined)  console.log(typeof null) 
   | 
 
5、现在的用法:
null:表示”没有对象”,即此处不应该有值。(表示被赋值过的对象,刻意把一个对象赋值为null,故意表示其为空,不应有值。)
(1)作为函数的参数,表示该函数的参数不是对象;
(2)作为对象原型链的终点。
undefined:表示”缺少值”,即此处应该有一个值,但是没有定义。
(1)变量被声明了,但没有赋值时,就等于undefined;
(2) 调用函数时,应该提供的参数没有提供,该参数等于undefined;
(3)对象没有赋值的属性,该属性的值为undefined;
(4)函数没有返回值时,默认返回undefined。  
判断JavaScript数据类型的方式(四种)
typeof   
instanceof     
toString   
jquery 
typeof
适用场景:
1 2 3 4 5 6
   | console.log(typeof undefined)  console.log(typeof 123)  console.log(typeof '123')  console.log(typeof true)  console.log(typeof Symbol())  console.log(typeof function () {}) 
   | 
 
不适用场景:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
   | console.log(typeof new Date())  console.log(typeof /^\d*$/)  console.log(typeof {})  console.log(typeof [])  console.log(typeof null)  ```  
  ##### 面试题:  
  ```javascript let foo = function bar() {   return 123 } console.log(typeof bar)  console.log(typeof foo)
  console.log(typeof foo()) 
   | 
 
instanceof
注:不适合做类型的判断。  
1 2 3 4 5 6 7 8 9 10 11 12 13
   | console.log([] instanceof Array)  console.log([] instanceof Object) 
  console.log(new Date() instanceof Date)  console.log(new Date() instanceof Object) 
  console.log(new RegExp() instanceof RegExp)  console.log(new RegExp() instanceof Object) 
  console.log(123 instanceof Number)  console.log(123 instanceof Object)  console.log('123' instanceof String)  console.log(false instanceof Boolean) 
   | 
 
toString、Object.prototype.toString.call()
toString:每一个引用类型都有toString方法,默认情况下。toString()方法被每个object对象继承。如果此方法在自定义中未被覆盖。toString()返回’[object type]’,type是对象的类型。
注:Object.prototype.toString.call() 是最常用判断类型的方法。
各个类型判断
1 2 3 4 5 6 7 8 9 10
   | console.log(Object.prototype.toString.call('123'))  console.log(Object.prototype.toString.call(123))  console.log(Object.prototype.toString.call(null))  console.log(Object.prototype.toString.call(undefined))  console.log(Object.prototype.toString.call(true))  console.log(Object.prototype.toString.call([]))  console.log(Object.prototype.toString.call({}))  console.log(Object.prototype.toString.call(function () {}))  console.log(Object.prototype.toString.call(Symbol()))  console.log(Object.prototype.toString.call(-1n)) 
  | 
 
特殊的
1 2 3 4 5 6 7 8 9
   | console.log(Object.prototype.toString.call(new String()))  console.log(Object.prototype.toString.call(new Object()))  console.log(Object.prototype.toString.call(new Date()))  console.log(Object.prototype.toString.call(new RegExp()))  console.log(Object.prototype.toString.call(new Array()))  console.log(Object.prototype.toString.call(new Error()))  console.log(Object.prototype.toString.call(Math))  console.log(Object.prototype.toString.call(JSON))  console.log(Object.prototype.toString.call(window)) 
   |