4.1-4.2 基本类型及引用类型,执行环境及作用域

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

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
时间: 2024-10-06 05:33:38

4.1-4.2 基本类型及引用类型,执行环境及作用域的相关文章

定义类+类实例化+属性+构造函数+匿名类型var+堆与栈+GC回收机制+值类型与引用类型

为了让编程更加清晰,把程序中的功能进行模块化划分,每个模块提供特定的功能,而且每个模块都是孤立的,这种模块化编程提供了非常大的多样性,大大增加了重用代码的机会. 面向对象编程也叫做OOP编程 简单来说面向对象编程就是结构化编程,对程序中的变量结构划分,让编程更清晰. 类的概念: 类实际上是创建对象的模板,每个对象都包含数据,并提供了处理和访问数据的方法. 类定义了类的每个对象(称为实例)可以包含什么数据和功能. 类中的数据和函数称为类的成员:数据成员        函数成员 数据成员: 数据成员

基本类型、引用类型、基本包装类型和单体内置对象

基本类型值指的是简单的数据段,而引用类型值指那些可能由多个值构成的对象.基本包装类型和单体内置对象都是特殊的引用类型. 一.基本类型 基本类型包含Undefined.Null.Boolean.Number.String 这5种.基本数据类型是按值访问的,因为可以操作保存在变量中的实际值. 基本类型保存在内存中的栈中,大小固定,复制其变量时会创建这个值的一个副本.用typeof方法可以确定一个值是哪种基本类型. 二.引用类型 引用类型包括Object .Array.  Date.  RegExp.

Java值类型和引用类型

[定义] 引用类型表示你操作的数据是同一个,也就是说当你传一个参数给另一个方法时,你在另一个方法中改变这个变量的值, 那么调用这个方法是传入的变量的值也将改变.值类型表示复制一个当前变量传给方法, 当你在这个方法中改变这个变量的值时,最初生命的变量的值不会变.通俗说法: 值类型就是现金,要用直接用:引用类型是存折,要用还得先去银行取现.----(摘自网上) [值类型] 也就是基本数据类型 基本数据类型常被称为四类八种 四类: 1,整型 2,浮点型 3,字符型4,逻辑型 八种: 1,整型3种 by

java 值类型和引用类型的区别

1. Java中值类型和引用类型的不同? [定义] 引用类型表示你操作的数据是同一个,也就是说当你传一个参数给另一个方法时,你在另一个方法中改变这个变量的值, 那么调用这个方法是传入的变量的值也将改变.值类型表示复制一个当前变量传给方法, 当你在这个方法中改变这个变量的值时,最初生命的变量的值不会变.通俗说法: 值类型就是现金,要用直接用:引用类型是存折,要用还得先去银行取现.----(摘自网上) [值类型] 也就是基本数据类型 基本数据类型常被称为四类八种 四类: 1,整型 2,浮点型 3,字

c# 值类型与引用类型 值传递与引用传递

值类型与引用类型: 值类型 :1.值类型大小固定.存储在栈上.  2.不能继承,只能实现接口 3.派生自valuetype int double char float byte bool enum struct decimal 引用类型:1.在栈上存储了一个地址实际存储在堆中,大小不固定. 2.数组.类.接口.委托 string 数组 类 接口 委托 值传递与引用传递: 值类型按值传递.值类型按引用传递.引用类型按值传递.引用类型按引用传递. 值传递:默认传递都是值传递 ,把栈中内容拷贝一份引用

值类型和引用类型的区别

数据项的类型定义了存储数据需要的内存大小,组成该类型的数据成员以及该类型能执行的函数.类型还决了对象在内存中的存储位置-栈或堆. 类型被分为:值类型和引用类型,这两种类型的对象在内存中的存储方式不同.值类型只需要一段单独的内存,用于存储实际的数据,引用类型需要两段内存:第一段存储实际的数据,它总是位于堆中,第二段是一个引用(即内存地址,不懂是不是就是直接寻址),指向数据在堆中的存放位置. 如果数据不是其他类型的成员,是独立的,比如方法代码块声明的临时变量int age ;如果是某一类型的成员,,

C#中值类型和引用类型

本文将介绍C#类型系统中的值类型和引用类型,以及两者之间的一些区别.同时,还会介绍一下装箱和拆箱操作. 值类型和引用类型 首先,我们看看在C#中哪些类型是值类型,哪些类型是引用类型. 值类型: 基础数据类型(string类型除外):包括整型.浮点型.十进制型.布尔型. 整型(sbyte.byte.char.short.ushort.int.uint.long.ulong ) 浮点型(float 和 double ) 十进制型(decimal ) 布尔型(bool ) 结构类型(struct) 枚

04.C#类型系统、值类型和引用类型(二章2.2-2.3)

今天要写的东西都是书中一些概念性的东西,就当抄笔记,以提问对话的方式将其写出来吧,说不定以后面试能有点谈资~~~ Q1.C#1系统类型包含哪三点特性? A1.C#1类型系统是静态的.显式的和安全的. Q2.为什么称为静态类型? A2.静态类型是用来描述表达式在编译时的类型,当声明一个类型的变量时,不能将变量指向其它类型的对象. Q3.显式类型和隐式类型的区别? A3.显式类型和隐式类型只有静态类型中的语言才有意义.显式类型需要显式声明一个变量的类型,而隐式类型则将类型的判断责任推给编译器,但是在

现金与存折---值类型和引用类型

在软考的时候也接触过值类型和引用类型,那时候应付做题还是可以的,可是考完之后再突然面对这两个词汇,又觉得迷茫无措了.现在想想,还是实践吧,当时只是简单的了解了其原理,没有用代码来实现,所以只能算是初步的,暂时的了解.这篇文章就是为了弥补初步的遗憾,进行深一步的学习. 理论联系实践,才是对现实的超越.就像门和钥匙一样,完美结合才有防窃和安全之功效.所以,该篇文章的主要思路也是从理论和实践两个方面分别对"值类型和引用类型"进行详细阐述. --------------------------