文档章节

基本类型和引用类型,执行环境和作用域

蒙懵懵
 蒙懵懵
发布于 2016/04/13 15:53
字数 1776
阅读 28
收藏 0

一、理解基本类型和引用类型的值

ECMAScript变量包含两种不同数据类型的值:基本类型值 引用类型值

基本类型值指的是简单的数据段,而引用类型的值指那些可能由多个值构成的对象 

引用类型的值是保存在内存中的对象,javascript不允许直接访问内存中的位置,也就是不能直接操作对象的内存空间。在操作对象时,实际上是在操作对象的引用而不是实际的对象。引用类型的值是按引用访问的,基本类型是按值访问的,因为可以操作保存在变量中的实际的值。

  • 动态的属性

    定义基本类型值和引用类型值的方式是类似的:创建一个变量并为该变量赋值。但对保存到变量的不同类型值的操作是不一样的。对于引用类型的值,可以添加,改变和删除其属性和方法,但是,不能给基本类型的值添加属性等操作。

var person = new Object();  //引用类型值
person.name = "小明";
alert(person.name);         //小明

        
var name = "小明";           //基本类型值
name.age = 25;
alert(name.age);            //undefined
  • 复制变量值

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

var num1 = 2;
var num2 = num1;

        num2的值会是2,这个值只是num1的值的一个副本,与num1的值2是完全独立的,这两个变量可以参与任何操作而不会相互影响。

        当从一个变量向一个变量复制引用类型的值,同样也会将存储在变量对象中的值复制一份放到为新变量分配的空间中,但这个值的副本实际是个指针,而这个指针指向存在堆中的一个对象。也就是说,两个值实际上引用的是同一个对象。因此,改变其中一个变量,另一个变量也会受到影响。

var obj1 = new Object();
obj1.name= "one";
var obj2 = obj1;
alert(obj2.name); // one

obj2.name = "two";
alert(obj1.name); //two 

//改变了obj2.name,obj1.name也被改变
  • 传递参数

    把函数外部的值复制给函数内部的参数,就像把值从一个变量复制到另一个变量。访问变量有按值和按引用两种方式,而参数只能按值传递。

    在向参数传递基本类型的值时,被传递的值会被复制给一个局部变量(命名参数)。

    在向参数传递引用类型的值时,会把这的值在内存中的地址复制给一个局部变量,这个局部变量发生变化会反映在函数的外部。

function add(num){
    num += 10;
    return num;
}
var count = 20;
var result = add(count);
alert(count);   //20 
alert(result);  //30

        

        误区:在局部作用中修改的对象会在全局作用域中反映出来,就说明参数是按引用传递的 (X)

function setName(obj){
    obj.name = "Tom";
    obj = new Object(); //重新定义对象
    obj.name = "Jim";  //定义不同值的name属性
}
var person = new Object();
setName(person);
alert(person.name);  // Tom

//即使函数内部修改了参数的值,原始引用仍然保持不变

         如果person是按引用传递的,那么person就会自动被修改成为指向name属性为”Jim“的新对象,但是,在外部访问person.name时,值仍然是”Tom“


  • 检测类型

    检测一个变量是不是基本数据类型用 typeof 操作符,typeof操作符确定一个变量是字符串/数值/布尔值/undefined  ,

    如果变量值是一个对象或null,则返回“object” 

    instanceof操作符检测是个什么类型的对象,如果变量是给定引用类型对象,instanceof操作符就会返回true

A instanceof Object;
B instanceof Array;
C instanceof RegExp;
……

    在检测一个引用类型值和Object构造函数时,instanceof操作符始终会返回true,当然,如果使用instanceof操作符检测基本类型的值,则该操作符始终会返回false,因为基本类型不是对象 。




二、理解执行环境及作用域

    执行环境定义了变量或函数有权访问的其他数据,决定了他们各自的行为。

    每个执行环境都有一个与之关联的变量对象,环境中定义的所有变量和函数都保存在这个对象中。

    全局执行环境是最外围的一个执行环境。在web浏览器中,全局执行环境被认为是window对象,因此所有全局变量和函数都是作为window对象的属性和方法创建的,全局执行环境直到应用程序退出时才会被销毁。

    当代码在一个环境中执行时,会创建变量对象的一个作用域链。作用域链的用途,是保证 对执行环境有权访问的 所有变量和函数 的有序访问。

    

    var color = "blue";

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

        function swapColor(){
            var tempColor = anotherColor;
            anotherColor = color;
            color = tempColor;
            //这里可以访问color、anotherColor、temperColor
        }

        //这里可以访问color、anotherColor
        swapColor();
    }
    //这里只能访问color
    changeColor();

    以上代码涉及3个执行环境:全局环境,changeColor()的局部环境和swapColor()的局部环境。内部环境可以通过作用域链访问所有的外部环境,但外部环境不能访问内部环境的任何变量和函数。这些环境之间是有次序的,每个环境都可以向上搜索作用域链,以查询变量和函数名,但任何环境都不能通过向下搜索作用域链而进入另一个执行环境。


  • 延长作用域链

    当执行流进入下列任何一个语句时,作用域链就会得到加长:

    ◇ try-catch 语句的 catch 块

    ◇ with 语句

    这两个语句都会在作用域链的前端添加一个变量对象,对with语句来说,会将指定的对象添加到作用域链中。对catch语句来说,会创建一个新的变量对象,其中包含的是被抛出的错误对象的声明。

    详细说明


  • javascript没有块级作用域

    声明变量

function add(num1,num2){
        var sum = num1 +num2;  //局部变量
        return sum;
    }
    var result = add(10,20);
    alert(result);   //30
    alert(sum);      //访问错误

    虽然结果值从函数返回,但变量sum是局部变量,函数外部是访问不到的。若不用 var声明,那么sum自动加入全局环境,这样一来外部可以访问。

    查询标识符

    查询与给定名字的标识符,如果在局部环境中找到了该标识符,搜索过程停止,如果在局部环境中没有找到,则沿作用域向上搜索。直到找到为止。

var color = "blue";
    function getColor(){
        var color = "red";
        return color;
    }
    alert(getColor());   //red


   






© 著作权归作者所有

上一篇: Object类型
下一篇: JSON笔记整理
蒙懵懵
粉丝 4
博文 14
码字总数 8417
作品 0
深圳
私信 提问
JavaScript 学习笔记3

第四章 变量,作用域和内存问题 1.变量 可保存两种类型的值:基本类型值和引用类型值。 基本类型值源于五种基本数据类型。 基本类型值和引用类型值的对比: 1).基本类型值在内存中占据固定大...

candy-chocolate
2016/11/01
5
0
JS 底蕴之 变量、作用域和垃圾回收

基本类型和引用类型 在 JavaScript 中,数据类型可分为基本类型和引用类型, 基本类型有六种:Null,Undefined,String,Boolean,Number,Symbol; 而引用类型就是传说中的 Object 了。 其中...

Fly_001
2018/05/23
0
0
书薄记--JavaSctipt高级程序设计章四(变量,作用域和内存)

类java:基本类型,引用类型,复制变量值,内存分配,函数参数传递,垃圾收集。 特别的: 基本类型:Undefined,Null,Boolean,Number,String。 动态属性:可以动态添加和删除属性和方法,...

大东哥
2011/09/25
105
2
重学js之JavaScript变量、作用域和内存问题

注意: 本文章为 《重学js之JavaScript高级程序设计》系列第四章【变量、作用域和内存问题】。 关于《重学js之JavaScript高级程序设计》是重新回顾js基础的学习。 1. 基本类型和引用类型的值...

故事胶片
07/17
0
0
《JavaScript高级程序设计 第3版》-学习笔记-2

P31-P82页 1、相等不相等与全等不全等 相等不相等:先转换后比较。对于只有一个对象,调用valueOf方法得到基本类型值再按基本类型转换;如果两个都是对象,则比较他们是否是同一个对象(引用...

吕亚辉
2015/03/09
0
0

没有更多内容

加载失败,请刷新页面

加载更多

OpenStack 简介和几种安装方式总结

OpenStack :是一个由NASA和Rackspace合作研发并发起的,以Apache许可证授权的自由软件和开放源代码项目。项目目标是提供实施简单、可大规模扩展、丰富、标准统一的云计算管理平台。OpenSta...

小海bug
昨天
6
0
DDD(五)

1、引言 之前学习了解了DDD中实体这一概念,那么接下来需要了解的就是值对象、唯一标识。值对象,值就是数字1、2、3,字符串“1”,“2”,“3”,值时对象的特征,对象是一个事物的具体描述...

MrYuZixian
昨天
6
0
数据库中间件MyCat

什么是MyCat? 查看官网的介绍是这样说的 一个彻底开源的,面向企业应用开发的大数据库集群 支持事务、ACID、可以替代MySQL的加强版数据库 一个可以视为MySQL集群的企业级数据库,用来替代昂贵...

沉浮_
昨天
6
0
解决Mac下VSCode打开zsh乱码

1.乱码问题 iTerm2终端使用Zsh,并且配置Zsh主题,该主题主题需要安装字体来支持箭头效果,在iTerm2中设置这个字体,但是VSCode里这个箭头还是显示乱码。 iTerm2展示如下: VSCode展示如下: 2...

HelloDeveloper
昨天
7
0
常用物流快递单号查询接口种类及对接方法

目前快递查询接口有两种方式可以对接,一是和顺丰、圆通、中通、天天、韵达、德邦这些快递公司一一对接接口,二是和快递鸟这样第三方集成接口一次性对接多家常用快递。第一种耗费时间长,但是...

程序的小猿
昨天
10
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部