变量、作用域问题

基本类型和引用类型的值
  1. 访问变量
    1.1 基本数据类型:按值访问
    1.2. 引用类型:按引用访问,可动态添加属性和方法
  2. 复制变量值
    2.1 从一个变量向另一个变量复制基本类型的值:此后这两个变量可以参与任何操作而不会互相影响

    var num1 = 5;
    var num2 = num1;
    
    num2 = 10;
    
    alert(num2);    //10
    alert(num1);    //5

    2.2 从一个变量向另一个变量复制引用类型的值:两个变量实际上将引用同一个对象,因此改变其中一个变量,就会影响另一个

    var obj1 = new Object();
    var obj2 = obj1;
    obj1.name = "Leo";
    alert(obj2.name);   //"Leo"
  3. 传递参数
    3.1 所有函数的参数(不管是基本类型还是对象)都是按值传递的。(就和把值从一个变量复制到另一个变量一样。基本类型值的传递如同基本类型变量的复制一样,而引用类型值的传递,则如同引用类型变量的复制一样,请看2)

    //这是一个反映参数(对象)也是按值传递的例子
    function setName(obj)   
    {
        obj.name = "Leo";
        obj = new Object();
        obj.name = "Greg";
    }
    var person = new Object();      //创建对象并保存在变量person中
    setName(person);        //person作为参数按值传递到函数中
    alert(person.name);     //"Leo"。说明是按值传递的,如果是按引用,那么person.name就会被修改为"Greg"了。
  4. 检测类型(typeof vs instanceof
    4.1 typeof操作符是检测基本数据类型的得力助手:

    var s = "Leo";
    var b = true;
    var i = 22;
    var u;
    var n = null;
    var o = new Object();
    var f = function(){};
    var r = /\d+/;
    
    alert(typeof s);    //String
    alert(typeof b);    //Boolean
    alert(typeof i);    //Number
    alert(typeof u);    //undefined
    alert(typeof n);    //Object
    alert(typeof o);    //Object
    alert(typeof f);    //function
    alert(typeof r);    //Safari 5/Chrome 7-:function,IE/Firefox:object

    4.2 instanceof操作符:检测是什么类型的对象

    //基本语法
    result = variable instanceof constructor
    
    //ps:所有引用类型的值都是Object的实例,即在检测一个引用类型值和Object构造函数时始终会返回true
    
    //如果变量是给定引用类型的实例,则返回true
    alert(person instanceof Object);    //变量perosn是Object吗?
    alert(colors instanceof Array);     //变量colors是Array吗?
    alert(pattern instanceof RegExp);   //变量pattern是RegExp吗?
执行环境及作用域
  1. 延长作用域链
    当执行流进入下列任何一个语句时,作用域链就会得到加长:
    1.1 try-catch语句的catch块
    1.2 with语句(with语句的作用是将代码的作用域设置到一个特定的对象中)

  2. 没有块级作用域
    在其他类c的语言中,由花括号封闭的代码块 都有自己的作用域,而js是没有这种块级作用域的。两个例子:

    //example 1
    if(true)
    {
        var color = "blue";
    }
    alert(color);   //"blue"(然而如果是在c、c++或java中,color会在if语句执行完毕后被销毁)
    
    //example 2
    for(var i = 0; i < 10; i ++)
    {
        doSomething(i);
    }
    alert(i);   //10

    2.1 声明变量—参考基本概念(上)之数据类型中的“变量”知识点,另外注意:初始化变量之前一定要先声明变量,避免导致意外错误

    2.1 查询标识符
    搜索从局部环境开始,沿着作用域链向上,一旦找到则停止搜索,不再继续向上搜索。

垃圾收集
  1. 自动垃圾收集机制:按照固定的时间间隔,周期性地,找出不再继续使用的变量,然后释放其占用的内存。
  2. 标识无用变量的策略(垃圾收集的时间间隔因浏览器的实现而异)
    • 标记清除
      • 目前主流的垃圾收集算法。这种算法的思想是给当前不使用的值加上标记,然后再回收其内存
      • 离开作用域的值将被自动标记为可回收,因此将在垃圾收集期间被删除
    • 引用计数(不常见,会导致循环引用问题)
小结
  1. 基本类型值和引用类型值具有以下特点:
    • 基本类型值在内存中占据固定大小的空间,保存在
    • 引用类型的值是对象,保存在内存中
    • 从一个变量向另一个变量复制基本类型的值,会创建这个值的一个副本
    • 包含引用类型值的变量实际上包含的并不是对象本身,而是一个指向该对象的指针
    • 从一个变量向另一个变量复制引用类型的值,复制的其实是指针,因此两个变量最终都指向同一个对象
    • 确定一个值是哪种基本类型可以使用typeof操作符,而确定一个值是哪种引用类型 可以使用instanceof 操作符
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值