js之 变量、作用域


    1.基本类型和引用类型
        基本类型值指的是简单的数据段
        引用类型值指那些可能由多个值构成的对象
        基本类型:Undefined、Null、Number、String、Boolean
        引用类型:对象、数值、函数
        ***注意:javascript不允许直接访问内存中的位置,即不能直接操作对象的内存空间,在操作对象时,实际上是在操作对象的引用而不是实际对象,因此引用类型的值是按引用访问的。
        1.1 动态属性
            对于引用类型的值,我们可以为其添加属性和方法,也可以改变和删除其属性和方法,但对于基本类型的值则不可以这么做!

                var person=new Object();
                person.name="cc";
                console.log(person.name);  //"cc"
                var name="cc";
                name.age="20";
                console.log(name.age);  //undefined

        1.2 复制变量值
            基本类型复制:
                如果从一个变量向另一个变量复制基本类型的值,会在变量对象中创建一个新值,然后把该值复制到位新变量分配的位置上。

                var num1=5;
                var num2=num1;


            **:当用num1的值来初始化num2时,num2中也保存了值5.但num2中的值和num1的值是完全对立的。
            引用类型复制:
                当从一个变量向另一个变量复制引用类型的值时,将存储在变量对象中的值复制一份到为新变量分配的空间中。这个值的副本实际上是一个指针,而这个指针指向存储在堆中的一个对象,复制结束后,两个变量实际上将引用同一个对象。因此改变其中一个变量,就会影响另一个变量。
                    var obj1=new Object();
                    var obj2=obj1;
                    obj1.name="cc";
                    console.log(obj2.name);  //"cc"
        1.3 传递参数
            ECMAscript中所有函数的参数都是按值传递的。有人可能很困惑,因为访问变量有的按值和引用访问两种方式,但参数只能按值传递。
                在向参数传递基本类型的值时,被传递的值会被复制给一个局部变量(即命名参数,或者说是arguments对象中的一个元素)。在向参数传递引用类型的值时,会把这个值在内存中的地址复制给一个局部变量,因此这个局部变量的变化会反映在函数的外部.

                    function add(num){
                        num+=10;
                        return num;
                    }
                    var count=10;
                    var result=add(count);
                    console.log(count)     //10,没有影响
                    console.log(result)  //20
                ----------------------------------------
                    function setName(obj){
                        obj.name="cc";
                        obj =new Object();
                        obj.name="newCC";
                    }
                    var person=new Object();
                    setName(person);
                    console.log(person.name)  //"cc"


        1.4 检测类型
            基本数据类型检测:
                typeof
                例如:

var s="ss"  console.log(typeof s)  //"String"
 var o=new Object()  console.log(typeof o) //"Object"


                **:使用typeof 检测 null 会返回 "object";检测值是对象是返回"object"而不会返回是什么类型的对象
            引用类型的值检测

                 var result= variable instanceof constructor
                 var person =new Object();
                 console.log(person instanceof Object); // true
                 console.log(person instanceof Array);  //false


    2.执行环境及作用域
        执行环境:定义了变量或函数有权访问的其他数据,决定了他们各自的行为。
        作用域链:当代码在一个环境中执行时,会创建变量对象的一个作用域链,用途是保证对执行环境有权访问的所有变量和函数的有序访问。
        **:内部环境可以通过作用域链访问所有外部环境,但外部环境不能访问内部环境中的任何变量和函数。例如:

            var color="blue";
            function changeColor(){
                var anotherColor="red";

                function swapColors(){
                    var tempColor=anotherColor;
                    anotherColor=color;
                    color=tempColor;
                    //这里可以访问color 和anotherColor和tempColor
                }
                swapColors();
                //这里可以访问 color和 anotherColor,但不能访问tempColor
            }
                //这里只能访问color
            changeColor();


        2.1 没有块级作用域
            由花括号封闭的代码块都有自己的作用域,但在javascript中会让你感到意外:

                for(var i=0;i<10;i++){
                    doSomething(i);
                }
                console.log(i); //会打印出 10 


            ***:对于javascript来说,由for语句创建的变量i即使在for循环执行结束后,也依旧会存在于循环体外部环境中。
    3.垃圾收集
        3.1 标记清除
            垃圾收集器在运行的时候会给存储在内存中的所有变量都加上标记,然后,它会去除环境中的变量以及被环境中的变量引用的变量的标记。在此之后再被加上上标记的变量将被视为准备删除的变量。

猜你喜欢

转载自blog.csdn.net/qq_37674616/article/details/82085177