javascript中的引用类型 和 普通类型

来源:互联网 发布:淘宝买钢珠警察会查么 编辑:程序博客网 时间:2024/05/29 02:31

1、 基本的赋值

例子1:

var arr1 = [1,2,3,4];var arr2 = arr1;arr2[2] = 10;console.log(arr1);  // [1,2,10,4]

例子2:

var obj1 = {    a:1,    b:2,    c:3};var obj2 = obj1;obj2['b'] = 10;//或者 obj2.b = 10;console.log(obj1); //{a: 1, b: 10, c: 3}

小结:
javascript中数据类型有Number 、 Boolean 、 undefined 、 Object、 Function 、 String 、 Null、RegExp、Date等等,其中更分为基本类型(值类型)引用类型

两者的区别:基本类型的数据是存放在栈内存中的,而引用类型的数据是存放在堆内存中的

其中基本类型包含:Number Boolean String undefined null…

引用类型:Object

javascript中除了上面的基本类型(number,string,boolean,null,undefined)之外就是引用类型了,也可以说是就是对象了。对象是属性和方法的集合。
也就是说引用类型可以拥有属性和方法,属性又可以包含基本类型和引用类型。

引用类型值保存在内存中,而JS是不能直接访问内存的,所以对于引用类型,操作的不是实际的对象而是对象的引用。

因此,引用类型的赋值其实是对象保存在栈区地址指针的赋值,因此两个变量指向同一个对象,任何的操作都会相互影响

==注:string在ECMAScript中不是引用类型,和其他许多语言不同。==

拓展:

栈(stack):有编译器自动分配和释放,存放函数的参数、局部变量、临时变量、函数返回地址等;
堆(heap):一般有程序员分配和释放,如果没有手动释放,在程序结束时可能由操作系统自动释放


2、原型链的继承:(引用类型的属性被所有实例共享)

function Parent(){    this.name = ['hello','world'];}function Child(){}Child.prototype = new Parent;//或者Child.prototype = new Parent();var child1 =  new Child();child1.name.push('html5'); //["hello", "world", "html5"]console.log(child1.name);var child2 = new Child();console.log(child2.name); //["hello", "world", "html5"]

3、原型式继承

将传入的对象作为 创建的对象的原型(ES 5中Object.create)的模拟实现

function createObj( obj ){    function Fun(){};    Fun.prototype = obj;    return new Fun();}
function createObj( obj ){    function Fun(){};    Fun.prototype = obj;    return new Fun();}var Person = {    name:'hello',    friends:['css3','html5']}var p1 = createObj(Person);var p2 = createObj(Person);p1.name = 'world';console.log(p2.name); //hellop1.friends.push('javascript');console.log(p2.friends);    //["css3", "html5", "javascript"]

与原型链继承相似