1

原始类型和引用类型

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及以上。

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;

时间小鱼
127 声望5 粉丝

成长的路上充满坎坷,要么跨过去,要么等死!