Skip to content
On this page

变量类型

ECMAScript 中定义了 6 种原始类型:

  • Boolean
  • String
  • Number
  • Null
  • Undefined
  • Symbol(ES6 新定义)

JS 的数据类型分类和判断

typeof(仅支持基本类型):undefined boolean number string object function、symbol

  • typeof null结果是 object ,实际这是 typeof 的一个 bug,null 是原始值,非引 用类型
  • typeof [1, 2]结果是 object,结果中没有 array 这一项,引用类型除了 function 其他的全部都是 object
  • typeof Symbol() 用 typeof 获取 symbol 类型的值得到的是symbol,这是 ES6 新 增的知识点

instanceof(无法准确判断对象实例的类型)

原理:instanceof 在查找的过程中会遍历左边变量的原型链,直到找到右边变量的 prototype,如果查找失败,则会返回 false。

用于实例和构造函数的对应。例如判断一个变量是否是数组,使用 typeof 无法判断,但可 以使用[1, 2] instanceof Array来判断。因为,[1, 2]是数组,它的构造函数就是 Array。

[] instanceof Array // true
[] instanceof Object // true,因为 Object 也在数组的原型链上,所以判断并非符合我们的预期可以说

Object.prototype.toString.call()

  • toString():js 中所有数据类型都继承了 ObjectArray 也继承了 Object, 但是 Array 会重写从 Object 上继承过来的 toString 方法

    •   var arr=[aa,bb,cc];
        arr.toString() //输出“aa,bb,cc”
      
  • toString.call() 是防止被重写

    •   let a = "b"
        let b = true
        let c = '123'
        let d = 123
        function e(){}
        let f = undefined
        let g = null
        let h = /[a-z]/
        let i = {}
        let k = [1,2,3]
      
        Object.prototype.toString.call(a)   '[object String]'
        Object.prototype.toString.call(b)   '[object Boolean]'
        Object.prototype.toString.call(c)   '[object String]'
        Object.prototype.toString.call(d)   '[object Number]'
        Object.prototype.toString.call(e)   '[object Function]'
        Object.prototype.toString.call(f)   '[object Undefined]'
        Object.prototype.toString.call(g)   '[object Null]'
        Object.prototype.toString.call(h)   '[object RegExp]'
        Object.prototype.toString.call(i)   '[object Object]'
        Object.prototype.toString.call(k)   '[object Array]'
      

值类型 vs 引用类型

引用类型引用类型统称为 object 类型,细分的话有:`Object 类型、Array 类型、Date 类型、RegExp 类型、Function 类型等

  • 值类型

var a = 10
var b = a
b = 20
console.log(a)  // 10
console.log(b)  // 20
  • 引用类型
// 引用类型
var a = {x: 10, y: 20}
var b = a
b.x = 100
b.y = 200
console.log(a)  // {x: 100, y: 200}
console.log(b)  // {x: 100, y: 200}

总结:值类型:复制的是内容,不会影响原数据;引用类型复制的是引用,指向了同一个 内存地址,会影响原数据