变量、作用域和内存问题 - 基本类型和用类型的值

基本类型和引用类型的值

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

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

  在将一个值赋给变量的时,解析器必须确定这个值是基本类型值还是引用类型值。其中5种基本数据类型:Undefined、Null、Boolean、Number、String。这5种基本数据类型是按值访问的,因此可以操作保存在变量中的实际的值。

  引用类型的值是保存在内存中的对象。与其他语言不同,javascript不允许直接访问内存中的位置,也就是说不能直接操作对象内存空间。在操作对象的时,实际上是在操作对象的引用而不是实际的对象,为此,引用类型的值是按引用访问的。

1.动态的属性

  定义基本类型值和引用类型值的方式是类似的:创建一个变量并为该变量赋值。但是,当这个值保存到变量中以后,对不同类型值可以执行的操作则大相径庭。对于引用类型的值,我们可以为其添加属性和方法,也可以改变和删除其属性和方法。请看下面例子:

var person=new Object();
person.name="Nicholas";
alert(person.name);//Nicholas

以上代码创建了一个对象并将其保存在了变量person中。然后,我们为该对象添加了一个名为name的属性,并将字符串值"Nicholas“赋给了这个属性。紧接着,又通过alert()函数访问可这个新属性。如果对象不被销毁或这个属性不被删除,则这个属性将一直存在。

  但是,我们不能给基本类型的值添加属性,尽管这样不会导致任何错误。例如:

var name=”Nicholas";
   name.age="27";
alert(name.age);//undefined

这个例子中,我们为字符串name定义了一个名为age的属性,并为该属性赋值27.但在下一行访问这个属性时,发现该属性不见了。这说明只能给引用类型值动态地添加属性,以便将来使用。

2.复制变量值

  除了保存的方式不同之外,从另一个变量像另一个变量复制基本类型值和引用类型值时,也存在不同。如果从一个变量向另一个变量复制基本类型的值,会在变量对象上创建一个新值,然后把该值复制到为新变量分配的位置上。

  当一个变量向另一个变量复制引用类型的值时,同样也会将存储在变量对象中的值复制一份放到为新变量分配的空间中。不同的是这个值的副本实际上是一个指针,而这个指针指向存储在堆中的一个对象。复制操作结束后,两个变量实际上将引用同一个对象。因此,改变其中一个变量,就会影响另一个变量,如下面例子所示:

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

3.传递参数

  ECMAScript中所有的函数参数都是按值传递的。也就是说,把函数外部的值复制给函数内部的参数,就和把值从一个变量复制到另一个变量一样。基本类型值的传递如同基本类型变量复制一样,而引用类型值的传递,则如同引用类型变量的复制一样。有不少开发人员在这一点上可能会感到困惑,因为访问变量有按值和按引用两种方式,而参数只能按值传递。

  在参数传递基本类型的值时,被传递的值会被复制给另一个局部变量(即命名参数,或者用ECMAScript的概念来说,就是arguments对象中的一个元素)。在向参数传递引用类型的值时,会把这个值在内存中的地址复制给一个局部变量,因此这个局部变量的变化会反映在函数的外部。请看下面这个例子:

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

4.检测类型

  要检测一变量是不是基本数据类型,typeof操作符是最佳的工具。说的具体一点typeof操作符是确定一个变量是字符串、数值、布尔值、还是undefined的最佳工具。如果变量的值是一个对象或null,则typeof操作符会像下面例子所示的那样返回"object“。

var s="Nicholas";
var b=true;
var i=11;
var u;
var n=null;
var o=new Object();
alert(typeof s);//string
alert(typeof b);//boolean
alert(typeof i);//number
alert(typeof u);//undefined
alert(typeof n);//object
alert(typeof o);//object

虽然在检测基本数据类型时typeof是非常得力的助手,但在检测引用类型的值时,这个操作符的用处不大。通常,我们并不是想知道某个值是对象,而是想知道它是什么类型的对象。为此,ECMAScript提供了instanceof操作符,其语法如下所示:

result=variable instanceof constructor

如果变量是给定的引用类型的实例,那么instanceof操作符就会返回true,请看下面的例子:

alert(person instanceof Object);//
时间: 2024-07-30 13:53:35

变量、作用域和内存问题 - 基本类型和用类型的值的相关文章

第一百零六节,JavaScript变量作用域及内存

JavaScript变量作用域及内存 学习要点: 1.变量及作用域 2.内存问题 JavaScript的变量与其他语言的变量有很大区别.JavaScript变量是松散型的(不强制类型)本质,决定了它只是在特定时间用于保存特定值的一个名字而已.由于不存在定义某个变量必须要保存何种数据类型值的规则,变量的值及其数据类型可以在脚本的生命周期内改变. 一.变量及作用域 1.基本类型和引用类型的值 ECMAScript变量可能包含两种不同的数据类型的值:基本类型值和引用类型值.基本类型值指的是那些保存在栈

javascript变量作用域与内存

第四章 变量作用域与内存基本类型 5种Undefined Null Boolean Number String 两种变量类型 基本类型与引用类型注意:String 再其他语言中是引用类型,再javascri中为基本类型即:这五种基本类型是按值访问的 引用类型是按照引用访问的 动态的属性对于一个引用类型,一个引用变量被赋值后,可以为其添加属性,也可以删除与修改其属性var o = new object();o.name = "qi"; //可以为引用变量添加属性 变量的复制基本类型的复制

Java中的基本类型和包装类型区别

首先看一下几个测试题,验证一下java中对基本类型和包装类型的理解,看看最后输出的答案对不对,答案在这篇博客中哦: // 第一题: 基本类型和包装类型 int a = 100; Integer b = 100; System.out.println(a == b); // 第二题: 两个包装类型 Integer c = 100; Integer d = 100; System.out.println(c == d); // 第三题 c = 200; d = 200; System.out.pri

基本类型和包装类型的区别

Java 的每个基本类型都对应了一个包装类型,比如说 int 的包装类型为 Integer,double 的包装类型为 Double.基本类型和包装类型的区别主要有以下 4 点. 01.包装类型可以为 null,而基本类型不可以 别小看这一点区别,它使得包装类型可以应用于 POJO 中,而基本类型则不行. POJO 是什么呢?这里稍微说明一下. POJO 的英文全称是 Plain Ordinary Java Object,翻译一下就是,简单无规则的 Java 对象,只有属性字段以及 setter

JavaScript变量作用域和内存问题(js高级程序设计总结)

1,变量 ECMAScript和JavaScript是等同的吗?个人认为是否定的.我的理解是这样的,ECMAScript是一套完整的标准或者说协议,而JavaScript是在浏览器上实现的一套脚本语言.也就是说,ECMAScript是JavaScript的父类标准.JavaScript是ECMAScript的具体实现.所有ECMAScript定义的数据类型或者语言特性实际上都是伪代码的形式规定的.当然如果可以,ECMAScript也可以有服务器实现,单片机实现(不一定恰当).如果说ECMAScr

第四章 变量 作用域和内存问题

4.1变量 变量包含2种类型的值: 基本类型的值: 即undefined,null, string,number,boolean.   按值访问,可以操作保存在变量中实际的值, 不能添加属性. var name = "Nicholas"; name.age = 27; console.log(name.age); //undefined 引用类型的值:多个值构成的对象.JS不允许直接操作对象的内存空间.给一个对象添加属性是,是在实际的对象中添加. 俩种类型值的区别: 1.保存方式不同:

JavaScript变量作用域和内存问题(二)

执行环境是js中特别重要的概念,是指变量或者函数可以访问其他数据,定义自己的行为.每个执行环境都有一个与之相对应的变量对象,执行环境中定义的所有变量和函数都保存在这个变量中,我们看不到这个变量,但是后台可以看到.     全局变量的执行环境是最外围的执行环境,在web浏览器中,全局执行环境就是window对象,所以所有的函数和全局变量都可以作为window对象的一个属性.其他执行环境都是在函数和变量执行完毕后销毁内存,变量和函数也随之销毁,而全局变量也是在关闭页面或浏览器的时候销毁.    “

读书笔记 - js高级程序设计 - 第四章 变量 作用域 和 内存问题

5种基本数据类型 可以直接对值操作 判断引用类型 var result = instanceof Array 执行环境 每个执行环境都有一个与之关联的变量对象,环境中定义的所有变量和函数都保存在这个对象中 执行环境的销毁 某个执行环境中的所有代码执行完毕后 该环境被销毁 保存在其中的所有变量了函数定义也会随之销毁 作用域链中的对象 全局执行环境的变更对象始终都是作用域链中的最后一个对象 没有块级作用域 if 和 for 内的变量 外部也可以访问 标记清除 不同浏览器 只不过垃圾时间的长短不同 引

第四章 变量作用域和内存问题--笔记6

JavaScript没有块级作用域 使用var声明的变量会自动被添加到最近的环境中,如:在函数内部,最近的环境就是函数的局部环境,在with语句中,最近的环境就函数环境.如果初始化变量时没有使用var,则该变量自动被添加到全局环境. 在某个环境中读取或写入某个标识符时,就会在从作用域链的前端开始逐级向下查找,直至找到即停止搜索.