1.原始类型存储简单数据值,引用类型存储对象,其本质是指向内存位置的应用。编程
注:其余编程语言用栈存储原始类型,用堆存储引用类型。JavaScript原始值被保存在变量对象内,而引用值则做为一个指针保存在变量对象内,该指针指向实际对象在内存中的存储位置。数组
2.原始类型:boolean,number,string,null,undefined。原始类型的变量直接保存原始值(而不是一个指向对象的指针),也就是说,当你将原始值赋值给一个变量时,该值被复制到变量中,每个变量都有它本身的一份数据拷贝。框架
var name = '张三'; var age = 18; var show = true; var object = null; var flag = undefined; // 一个变量的改变并不会影响到其余变量 var color1 = 'red'; var color2 = color1; console.log(color1); // red console.log(color2); // red color2 = 'blue'; console.log(color1); // red console.log(color2); // blue
3.引用类型:引用类型不在变量中保存对象,因此例子中的object变量实际上并不包含对象的实例,而是一个指向内存中实际对象所在位置的指针(或者说是引用)。这就意味着,当你将一个对象赋值给变量时,实际上赋值给这个变量的是一个指针。也就是说,这两个变量指向内存中的同一个对象。编程语言
var object = new Object(); //保存指向内存中实际对象所在位置的指针
4.鉴别引用类型函数
instanceof操做符以一个对象和一个构造函数为参数。若是对象是构造函数所指定的类型的一个实例,instanceof返回true;不然返回false。intanceof操做符可鉴别继承类型,意味着全部的引用类型都继承Object。指针
var items = []; var object = {}; function reflect(value){ return value; } console.log(items instanceof Array); // true console.log(object instanceof Object); // true console.log(reflect instanceof Function); // true
5.鉴别数组
当JavaScript的值在同一个页面不一样框架之间传来传去,再用instanceof来鉴别引用类型的时候,就可能出现问题,由于每个框架都有它本身的全局上下文--Object、Array以及其余内建类型的版本。因此,当你把数组从一个框架传到另外一个框架时,instanceof就没法识别,由于该数组是来自不一样框架的Array的实例。因此这个时候,得用Array.isArray()方法来鉴别数组,该方法只兼容IE9及以上。code
6.原始封装类型
原始封装类型共有3种,(String,Number和Boolean)。这些特殊引用类型的存在使得原始引用类型用起来和对象同样方便。例如:对象
var name = '张三'; var firstChar = name.charAt(0); console.log(firstChar); // 张 // 背后发生的事情 var name = '张三'; var temp = new String(name); var firstChar = temp.charAt(0); temp = null; console.log(firstChar); // 张 var name = '张三'; name.last = '王五'; console.log(name.last); // undefined // 背后发生的事情 var name = '张三'; var temp = new String(name); temp.last = '王五'; temp = null; var temp = new String(name); console.log(temp.last); // undefined temp = null;