Appearance
变量类型
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 其他的全部都是 objecttypeof 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
中所有数据类型都继承了Object
,Array
也继承了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}
总结:值类型:复制的是内容,不会影响原数据;引用类型复制的是引用,指向了同一个 内存地址,会影响原数据