Javascript高级程序设计_3

Posted on 2018-01-13 12:25  Jonathan_C  阅读(123)  评论(0)    收藏  举报

 

  • ECMAScript包含两种数据类型,基本类型和引用类型。基本类型就是之前说的这几类:Undefined,Boolean,Null, Number, String。引用类型主要是指Object,像Java中的类。引用类型的对象,一般是保存在内存中的值。所以JS无法直接操作内存中的地址,而是操作对象的引用。
  • 引用类型当创建之后,可以修改、删除、添加其属性和方法。
  • 引用类型和基本类型的在内存中的区别:
  1. 基本类型复制的时候,用一个变量初始化另一个变量,会在栈中建立另一个对象和同样的一个值。

  

        var num1=5;
        var num2=num1;

    2. 对于引用类型,将一个变量对象复制到另一个变量对象时,同样会有一个新的值在栈中产生,但是这个值的副本是一个指针,指向堆内存中的同一个对象。

 

1         var obj1=new Object();
2         obj1.name="AAA";
3         var obj2=obj1;//复制到obj2
4         document.write(obj2.name);//obj2可以同时访问堆中的Object()对象

    

  •    对于函数来说,传递参数的时候,所有的参数是按值传递。基本类型不多说,对于引用类型来说,可以这样理解下面的代码:
1         function setNum(obj){
2             obj.name="AAA";
3         }
4         var person=new Object();
5         setNum(person);
6         document.write(person.name);

  • instanceof 用于检测某个值是哪一种类型的对象,返回值为布尔类型。
1         var obj3=new Object();
2         document.write(obj3 instanceof Object);
  • 执行环境和作用域:
  1. 全局的执行环节,默认为window对象,所有的全局变量都会作为window的对象和属性创建的。当关闭网页或浏览器时,被自动销毁。
  2. 创建对象的时候会产生作用域链。可以这样理解:执行的环境,或者说作用域,是通过作用域链进行有序的线性排列。每个环境可以向上搜索作用域链,查询变量和函数,但是不能向下进行!!!
  3. 作用域的范围不是由{ }花括号决定的,而是由函数来决定的。在函数中,如果定义一个变量,不带var的话,则该变量为全局变量。
1         var color="red";
2         function change(){
3             var color="blue";
4             return color;
5         }
6         document.write(change());//blue

   这里通过var标识符,在函数return color的时候,它会首先查找自身是否有这个color变量,通过var来查找,一旦找到,则返回。

   尝试和下面的代码比较,顺便了解一下this作用域

1         var color="red"
2         function change(){
3             var color="blue";
4             return this.color;
5         }
6         console.log(change());//red

   change()函数的调用者为window,所以this指向window,所以color=“red”作为window作用域下定义的属性会被先调用。  

  • 垃圾收集:垃圾收集器会给所有内存中的变量一个标记,然后当这些变量不再环境中,或者不再被环境中的变量所引用的时候,则这些变量将会被销除。
  • 释放内存:将全局变量设置为null,称为“解除引用”。