前端基础:赋值、比较和传递

83 阅读2分钟

数据类型

引用类型:
    内存空间分为两种:
            1.栈内存:
                (1)存储的值大小固定
                (2)空间较小
                (3)相互之间操作就保存
                (4)由系统自由分配存储空间
	
            2.堆内存:
                (1)存储的值大小不定,可动态调整
                (2)空间较大,运行效率低
                (3)无法直接操作其内存存储,使用引用地址读取
                (4)通过代码进行分配空间
					
        例子:
            //引用类型的值实际存储在栈内存中
            //它在栈中只存储一个固定长度的地址
            //这个地址指向堆内存中的值
            
                var obj1 = {name:"ConardLi"};
                //obj1 = 0X000001
                var obj2 = {age:18};
                //obj2 = 0X000002
                var obj3 = function(){...};
                //obj3 = 0X000003
                var obj4 = [1,2,3,4,5,6,7,8,9];
                //obj4 = 0X000004
                
            //引用类型可以轻易改变
                obj1.name = "ConardLi6";
                obj2.age = 19;
                obj4.length = 0;
                console.log(obj1);//{name:"ConardLi6"}
                console.log(obj2);//{age:19}
                console.log(obj4);//[]

赋值

赋值:
    原始类型的赋值(赋的是值):
                var name = "ConardLi";
                var name2 = name;
                name2 = 'code秘密花园';
                console.log(name);//ConardLi
                
    引用类型的赋值(赋的是地址):
                var obj = {name:"ConardLi"};
                var obj2 = obj;
                obj2.name = 'code秘密花园';
                console.log(obj.name);//'code秘密花园

比较

    比较:	
        原始类型的比较(只要变量值一样,比较结果为true)
                var name ='ConardLi';
                var name2 = 'ConardLi';
                console.log(name === name2);//true
                
        引用类型的比较(尽管变量值一样,只要地址不一样,就返回false)
                var obj = {name:"ConardLi"};
                var obj2 = {name:'ConardLi'};
                console.log(obj === obj2);//false

传递

    传递:
        //ECMAScript中所有的函数的参数都是按值传递的
        //原始类型传递的就是自身
        //引用类型传递时对应栈空间的地址
    
    原始类型传递
        let nmae = 'ConardLi';
        function chageValue(name){
            //等效于在函数内var name = 'ConardLi'
            name = 'code秘密花园';
            }
            
        changeValue(name);
        console.log(name);//'ConardLi'
        //函数参数传递的是变量的值
        //对应两个栈空间,分别独立
        
    引用类型传递1:
        let obj = {name:"ConardLi"};
        function changeValue(obj){
            //等效于在函数内var obj = XAF0000
            obj.name = 'code秘密花园';
            }
            changeValue(obj);
            console.log(obj.name);//code秘密花园
            //函数参数传递的是变量对应的地址
            //所以函数体中去修改时,也会对原变量的值发生变化(它们都指向这个地址)
			
    引用类型传递2:
        let obj = {};
        function changeValue(obj){
            obj.name = 'ConardLi';
            obj = {name:'code秘密花园'};
            console.log(obj.name);
            }
            
        chengValue(obj);//code秘密花园
        console.log(obj.name);//ConardLi