js 基本类型与引用类型的区别
ECMAScirpt 变量有两种不同的数据类型:基本类型,引用类型。也有其他的叫法,比如原始类型和对象类型,拥有方法的类型和不能拥有方法的类型,还可以分为可变类型和不可变类型,其实这些叫法都是依据这两种的类型特点来命名的。 一、基本类型 基本的数据类型有:`undefined,boolean,number,string,null.基本类型的访问是按值访问的,就是说你可以操作保存在变量中的实际的值。
<font size="3" color="#000000">var name = 'jozo'; name.toUpperCase(); // 输出 'JOZO' console.log(name); // 输出 'jozo'</font> 会发现原始的name并未发生改变,而是调用了toUpperCase()方法后返回的是一个新的字符串。
<font size="3" color="#000000">var person = 'jozo'; person.age = 22; person.method = function(){//...}; console.log(person.age); // undefined console.log(person.method); // undefined</font> 通过上面代码可知,我们不能给基本类型添加属性和方法,再次说明基本类型时不可变得;
<font size="3" color="#000000">var a = 1; var b = true; console.log(a == b);//true</font> 它们不是相等吗?其实这是类型转换和 == 运算符的知识了,也就是说在用==比较两个不同类型的变量时会进行一些类型转换。像上面的比较先会把true转换为数字1再和数字1进行比较,结果就是true了。 这是当比较的两个值的类型不同的时候==运算符会进行类型转换,但是当两个值的类型相同的时候,即使是==也相当于是===。 <font size="3" color="#000000">var a = 'jozo'; var b = 'jozo'; console.log(a === b);//true</font> 3.基本类型的变量是存放在栈区的(栈区指内存里的栈内存)
<font size="3" color="#000000">var name = 'jozo'; var city = 'guangzhou'; var age = 22;</font> 那么它的存储结构如下图: 栈区包括了 变量的标识符和变量的值。
<font size="3" color="#000000">var person = {};//创建个控对象 --引用类型 person.name = 'jozo'; person.age = 22; person.sayName = function(){console.log(person.name);} person.sayName();// 'jozo' delete person.name; //删除person对象的name属性 person.sayName(); // undefined</font> 上面代码说明引用类型可以拥有属性和方法,并且是可以动态改变的。
<font size="3" color="#000000">var person1 = {name:'jozo'}; var person2 = {name:'xiaom'}; var person3 = {name:'xiaoq'};</font> 则这三个对象的在内存中保存的情况如下图: 3.引用类型的比较是引用的比较 <font size="3" color="#000000">var person1 = '{}'; var person2 = '{}'; console.log(person1 == person2); // true</font> 上面讲基本类型的比较的时候提到了当两个比较值的类型相同的时候,相当于是用 === ,所以输出是true了。再看看: <font size="3" color="#000000">var person1 = {}; var person2 = {}; console.log(person1 == person2); // false</font> 可能你已经看出破绽了,上面比较的是两个字符串,而下面比较的是两个对象,为什么长的一模一样的对象就不相等了呢? 所以这两个是完全不同的对象,所以返回false;
<font size="3" color="#000000">var a = 10; var b = a; a ++ ; console.log(a); // 11 console.log(b); // 10</font> 此时,a中保存的值为 10 ,当使用 a 来初始化 b 时,b 中保存的值也为10,但b中的10与a中的是完全独立的,该值只是a中的值的一个副本,此后,这两个变量可以参加任何操作而相互不受影响。 4.对象引用 <font size="3" color="#000000">var a = {}; // a保存了一个空对象的实例 var b = a; // a和b都指向了这个空对象 a.name = 'jozo'; console.log(a.name); // 'jozo' console.log(b.name); // 'jozo' b.age = 22; console.log(b.age);// 22 console.log(a.age);// 22 console.log(a == b);// true</font> 它们的关系如下图: 1 因此,引用类型的赋值其实是对象保存在栈区地址指针的赋值,因此两个变量指向同一个对象,任何的操作都会相互影响。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |