JS进阶一

一 基本类型
1. 数字, 字符串, 布尔, undefined, null
2. 值不可修改
3. 基本类型的' . '方法,实际使用的是其包装对象的方法:
比如 '123'.replace('1', ''),对应String的replace()函数;
4. 值保存在栈内存中, 按值访问
二 引用类型
1. {}, [], Date
2. 值可修改
3. 地址保存在栈内存,值保存在堆内存中, 按引用访问

 

 

 



变量比较:

两个基本类型的数据比较,只要数据是一样的,保存两个数据的变量就是相等(===)的;

两个引用类型的数据比较,比如两个对象,即使两个对象中的内容是一样的,保存两个对象的变量是不相等(===)的,因为引用类型的数据是保存在堆内存中,变量保存的是其地址,两个对象的地址是不相同的

 

两个等号是比较值是否相等的,适用于基本类型。而数组是引用类型,即使是两个空数组,地址也是不相同的,所以值并不相等,还有两个空对象也是不相等的。

 

 1 <script>
 2     //两个引用类型的数据比较,比如两个对象,即使两个对象中的内容是一样的,
 3     //保存两个对象的变量是不相等(===)的,因为引用类型的数据是保存在堆内存中,
 4     //变量保存的是其地址,两个对象的地址是不相同的
 5         var xm={
 6             age:18,
 7             score:4,
 8         };
 9         var xh={
10             age:18,
11             score:4
12         }
13         console.log(xm===xh);//false
14    </script>
有些情况,我们是只想看两个对象/数组里的属性和方法是否相同的,不管其地址是否相同,这样如何处理呢?
只有通过遍历来查看两个对象/数组,这样可以查看两个对象的内容是否相同的;
 1 <script>
 2     //检测两个对象内容是否相同
 3       function equalObjs(a,b){
 4           for(var p in a){
 5               if(a[p]!==b[p]) return false;
 6           }
 7           return true;
 8       }
 9       console.log(equalObjs(xm,xh));//true
10 </script>
 1 <script>
 2     //查看两个数组内容是否相等
 3     function euqalArrays(a,b){
 4         if(a.length!==b.length) return false;
 5         for(var i=0;i<a.length;i++){
 6             if(a[i]!==b[i]) return false
 7         }
 8         return true;
 9     }
10 </script>

复制变量的值

变量中存储的是基本类型的数据时:
将一个变量复制给另一个变量,如果其中一个变量的数据改变,另一个变量存的数据时不受影响的,即不改变
变量中存储的是引用类型的数据时:
将一个变量复制给另一个变量,如果其中一个变量的数据改变,另一个变量存的数据将也更着改变,因为引用类型的数据,其变量存的是地址,复制后,两个变量存的都是一个引用类型的地址,当引用类型的数据改变后,地址并没有变化,只是地址指向的堆内存中的数据发生了变化,所以两个变量中的属性和方法会同时变化。
如果已有一个对象,想再创建一个新对象,但是新对象只是长得像,并不和已有对象是同一个对象,这样可以通过for in遍历来将已有的对象中的属性赋值给新创建的属性中,
这样的方法只可以对方法中的基本类型有效,但是这样的方法对方法中的引用类型数据(比如数组,对象)没有效果,因为这样遍历的话,是将其中其中一个引用类型的地址复制给另一个,这样是不合理的,因为这样的话,两个对象就不是完全独立得了
jQuery中的 $.extend()既可以进行浅拷贝也可以进行深拷贝。
 1 <script>
 2     //浅拷贝 只可以对方法中的基本类型有效,但是这样的方法对方法中的引用类型数据(比如数组,对象)没有效果
 3     var xm={
 4         age:18,
 5         score:4
 6     }
 7     function copyObj(obj){
 8         var newObj={};
 9         for(var p in obj){
10             newObj[p]=obj[p];
11         }
12         return newObj;
13     }
14     xh=copyObj(xm);
15     console.log(xh);//{age:18,score:4}
16     console.log(xm===xh);//false    
17 </script>
检测数据类型作用;
type of(数字类型)
instanceof(引用类型) 都是运算符 对象不是数组的实例
1 <script>
2     console.log([] instanceof Object);//true
3     console.log([] instanceof Array);//true
4     console.log({} instanceof Object);//true
5     console.log({} instanceof Array);//false
6 </script>
1 function test(a,b){//a,b就是形参
2 return a+b;
3 }
4 fn(1,2);//1,2就是实参
5 //函数里的参数传参不管是值类型还是引用类型都是按值传递。

 

 1 <script>
 2 function setName(obj){
 3     obj.name="xm";
 4     obj={};//这是的obj={};指向了一个空对象,"="是赋值的意思,相当于obj已经生成了一个新的引用类型
 5     obj.name="xh";
 6 }
 7     var person={};
 8     setName(person);
 9     console.log(person.name);//xm
10     obj=person
11 </script>

 

 

 

 


 

 
posted @ 2019-10-14 16:22  还有什么值得拥有  阅读(346)  评论(0编辑  收藏  举报