数据类型
基本类型
存储在栈 (stack) 中的简单数据段, 它们的值直接存储在变量访问的位置, 可以直接访问.
说明
原始类型占据的空间是固定的, 所以可将他们存储在较小的内存区域 - 栈中. 这样存储便于迅速查寻变量的值.
包括
Number,String ,Boolean,Null 和 Undefined
复制操作
在将一个保存着原始值的变量复制给另一个变量时, 会将原始值的副本赋值给新变量, 它们是完全独立的, 只不是值相同而已.
引用类型
存储在堆 (heap) 中的对象, 存储在变量处的值是一个指针(point), 指向存储对象的内存地址. 访问对象时按引用访问, 先获取对象在堆内存中的地址, 再按地址找到值.
说明
引用值的大小会改变, 所以不能把它放在栈中, 否则会降低变量查寻的速度. 相反, 放在变量的栈空间中的值是该对象存储在堆中的地址. 地址的大小是固定的, 所以把它存储在栈中对变量性能无任何负面影响.
包括
Object,Array,Function 等
复制操作
在将一个保存着对象内存地址的变量复制给另一个变量时, 会把这个内存地址赋值给新变量, 也就是说这两个变量都指向了堆内存中的同一个对象, 它们将相互影响, 其中一个变化会同步到另一个.
数据类型的判断
typeof
一元运算, 放在一个运算数之前, 运算数可以是任意类型, 常用来判断数据是否为基本类型.
它返回一个字符串, 该字符串说明运算符的类型, 包括: number, boolean, string, function, object, undefined.
- typeof '' // string
- typeof 1 // number
- typeof true // boolean
- typeof undefined // undefined
- typeof function(){} // function
- typeof [] // object
- typeof {} // object
以上结果都比较符合我们的预期, 再来看一下 null
console.log(typeof null) // object
神奇, 为什么 null 作为一个基本类型, 结果却是 object, 在JavaScript 高级程序设计(第 2 版)可以找到一个解释.
从逻辑角度来看, null 值表示一个空对象指针, 而这正是使用 typeof 操作符检测 null 值时会返回 "object" 的原因.
不得不说这是一个比较有争议的点, 要知道毕竟它爸设计他只用了 10 天, 这里有一些 null 的讨论 null-javascript https://developer.mozilla.org/zh-CN/docs/web/JavaScript/Reference/Global_Objects/null .
instanceof
二元运算, A instanceof B,A 必须是一个合法的 javascript 对象, B 必须是一个合法的 javascript 函数. 主要用来检测引用类型.
- [] instanceof Array // true
- {} instanceof Object // true
- /\d/ instanceof RegExp // true
- function(){} instanceof Object // true
- function(){} instanceof Function // true
现在有 L instanceof R, 其实表示
L.__proto__.__proto__ ..... === R.prototype
, 也就是沿着 L 的 __proto__ 一直寻找到原型链末端, 直到等于 R.prototype 为止, 否则返回 false.
那么我们也就知道了下面这些:
- Function instanceof Object // true
- Object instanceof Function // true
- Function instanceof Function //true
- Object instanceof Object // true
- Number instanceof Number //false
- Object.prototype.toString
这是对象的一个原生原型扩展函数, 用来精确的区分数据类型
- var type = Object.prototype.toString
- type.call('') // object String
- type.call([]) // object Array
- type.call({}) // object Object
- type.call(false) // object Boolean
- type.call(null) // object Null
- type.call(undefined) // object Undefined
来源: http://www.jianshu.com/p/24597756e7a5