基本类型(null、undefined、boolean、number、string)和引用类型(Object 对象)

1  基本类型:只能不存一个值,一种类型;从一个变量向另一个变量复制基本类型的值,会在变量对象上创建一个新值,然后把该值复制到为新变量分配的位置上,var num1 = 5;var num2 = num1;这样num1和num2 是完全独立的,操作互不影响。

2  引用类型:创建一个对象,可以添加、修改、删除属性和方法;当一个变量向另一个变量复制引用类型值时,同样也会将存储在变量对象中的值复制一份放到为新变量分配的空间中,不同的是,这个值的副本实际上是一个指针,而这个指针指向存储在堆中的一个对象,复制操作结束后,两个变量实际上将引用同一个对象。因此,改变其中一个变量,就会影响另一个变量。var obj1 = new Object(); var obj2 = obj1; obj1.name = "summer";alert(obj2.name);//'输出 summer。

3  (函数)参数传递:基本类型的传递如同基本类型变量的复制一样,而引用类型值的传递,则如同引用类型变量的复制一样。在向参数传递基本类型的值时,被传递的值会被复制给一个局部变量,而在向参数传递引用类型的值时,会把这个值在内存中放入地址复制给一个局部变量,因此这个局部变量的变化会反应在函数的外部。

实例A:

functionaddTen(){

                num +=10;

return num;

}

     var count = 20;

var result = addTen(count);

alert(cont);//20,没变化

alert(result);//30

由于传递的是基本类型值,所以传递后函数参数和外部变量相互独立,互不影响;

实例B:

  function setName(obj){

    obj.name = 'summer';

  }

  var person = new Object();

setName(person);

  alert(person.name);// 'summer'

由于传递的是引用类型值,所以传递后函数参数和外部变量指向相同的内存地址,引用的是同一个对象;换句话说,即使这个变量是按值传递的,obj 也会按引用来访问同一个对象。于是,当在函数内部为obj 添加name 属性后,函数外部的person 也将有所反应,因为person 指向的对象在堆内存中只有一个,而且是全局对象。很多开发人员错误的认为:在局部作用域中修改的对象会在全局作用域中反映出来,就说明参数是按引用传递的,可是请看下面的例子,

实例C:

  function setName(){

    obj.name = 'summer';

    obj = new Object();

    obj.name = 'winter';

  }

  var person = new Object();

  setName(person);

  alert(person.name);//  'summer'

这个和实例B 的区别是函数中为obj 重新定义了一个对象,以及重新设置 name属性的值。  如果person  是按引用传递的,那么person 就会自动被修改为指向其name属性值为"winter" 的新对象,但是原始的引用仍然保持不变。这说明,当在函数内部重写obj 时,这个变量引用的就是一个局部对象了,而这个局部对象会在函数执行完毕后立即被销毁。

4 检测类型:检测一个变量是不是基本数据类型,typeof 是最佳工具。检测引用类型的值时,用instanceof ,返回true 或false。如

alert(person instanceof Object);

  alert(colors instanceof Array);

  alert(patten instanceof RegExp);

5 作用域:所有变量(包括基本类型和引用类型)都存在于一个执行环境(也称为作用域)当中,这个执行环境决定了变量的生命周期,以及哪一部分代码可以访问其中的变量。:

  执行环境有全局执行环境(也称为全局环境)和函数执行环境之分;

  每次进入一个新执行环境,都会创建一个用于搜索变量和函数的作用域链;

  函数的局部环境不仅有权访问函数作用域中的变量,而且有权访问其包含(父)环境,乃至全局环境;

  全局环境只能访问在全局环境中定义的变量和函数,而不能直接访问局部环境中的任何数据;

  变量的执行环境有助于确定应该何时释放内存;

6 内存问题:javascript 是一门具有自动垃圾收集机制的编程语言,开发人员不必关心内存分配和回收问题。

  离开作用域的值将被自动标记为可以回收,因此将在垃圾收集期间被删除;

  " 标记清除"是目前主流的垃圾收集算法,这种算法的思想是给当前不使用的值加上标记,然后再回收其内存;

  另一种垃圾收集算法是"引用计数",这种算法的思想是跟踪记录所有值被引用的次数。javascript引擎目前 都不再使用这种算法;但在IE 中访问非原生javascript 对象(如DOM元素)时,这种算法仍然可能会导致问题。

  当代码中存在循环引用现象时,"引用计数"算法就会导致问题。

  解除变量的引用不仅有助于消除引用现象,而且对垃圾收集也有好处。为了确保有效地回收内存,应该及时解除不再使用的全局对象、全局对象属性以及循环引用变量的引用。

  

javascript基本类型和引用类型,作用域和内存问题的更多相关文章

  1. JavaScript 基本类型和引用类型

    前言 ECMAScript变量可能包含两种不同数据类型的值:基本类型值和引用类型值.基本类型值指的是简单的数据段,而引用类型值指那些可能由多个值构成的对象. 基本类型 Undefined.Null.B ...

  2. 【转】Javascript基本类型和引用类型的区别

    根据[转贴]进一步补充 今天明白了一个困扰很久的问题:引用类型和基本类型的区别与联系要明白这个问题,首先需要理解堆栈的概念.那什么又是堆栈,有什么区别和联系呢?堆:首先堆是动态分配的,JVM并不会自动 ...

  3. 《JavaScript高级程序设计》读书笔记 ---基本类型和引用类型的值

    变量.作用域和内存问题 基本类型和引用类型的值ECMAScript 变量可能包含两种不同数据类型的值:基本类型值和引用类型值.基本类型值指的是简单的数据段,而引用类型值指那些可能由多个值构成的对象.在 ...

  4. javascript的基本类型和引用类型

    一.基本类型和引用类型 基本的数据类型有5个:undefined,boolean,number,string,null ? 1 2 3 4 5 typeof null; //"object& ...

  5. 基本类型和引用类型的值 [重温JavaScript基础(一)]

    前言: JavaScript 的变量与其他语言的变量有很大区别.JavaScript 变量松散类型的本质,决定了它只是在特定时间用于保存特定值的一个名字而已.由于不存在定义某个变量必须要保存何种数据类 ...

  6. Javascript之基本类型和引用类型

    ECMAScript变量可能包含两种不同数据类型的值:基本类型值和引用类型值,基本类型值指的是简单的数据段,而引用类型值指那些可能由多个值构成的对象. 在将一个值赋给变量时,解析器必须确定这个值是基本 ...

  7. [转]javascript中基本类型和引用类型的区别分析

    基本类型和引用类型 ECMAScript包含两个不同类型的值:基本类型值和引用类型值.基本类型值指的是简单的数据段:引用类型值指由多个值构成的对象.当我们把变量赋值给一个变量时,解析器首先要做的就是确 ...

  8. javascript中基本类型和引用类型的区别分析

    大多数人系统学习过的程序设计语言,在这些语言的学习过程中最早学到的几个要点之一就是值类型和引用类型的区别.下面我们来看一下在 JavaScript 中基本数据类型(Primitive Types)和引 ...

  9. javascript变量中基本类型和引用类型的详解解读

    前言: Javascript语言中的变量和其他语言的变量有很大区别,javascript松散类型的本质,决定了它只是在特定时间时间保存特定值得名字而已.由于不存在定义某个变量必须保存何种数据类型值的规 ...

随机推荐

  1. org.apache.catalina.LifecycleException报错解决方法

    严重: A child container failed during startjava.util.concurrent.ExecutionException: org.apache.catalin ...

  2. Hadoop 源代码组织结构

    Hadoop 2.X 包括 编译好的可以直接部署的文件hadoop-{VERSION}.tar.gz; 还有源代码文件hadoop-{VERSION}-src.tar.gz , 需要 Maven 编译 ...

  3. 挨踢职场求生法则-----我在IT职场打滚超过15年了,从小小的程序员做到常务副总

    摘要我在IT职场打滚超过15年了,从小小的程序员做到常务副总.相对于其它行业,IT职场应该算比较光明的了,但也陷阱重重,本文说说我的亲身体会,希望大家能在IT职场上战无不胜! 通用法则 法则1:忍耐是 ...

  4. Axure RP 7.0 标准教程(2)--基本介绍

    母版:用来放置一些相同元素的部件  两个页面都放入母版   一处更改 所有更改 添加图片:双击可以本地添加 ---------- 创建share.axure账号  https://share.axur ...

  5. Qt-MVC图形视图框架分解

    前面在<Qt-MVC图形视图框架出识>中我们了解了Qt图形视图框架中三个最基本的类,弄清他们的关系,本片小文,我们将对QGraphicsView,QGraphiceScene,QGraph ...

  6. 洛谷 - P2051 - 中国象棋 - 简单dp

    https://www.luogu.org/problemnew/show/P2051 一点都不简单的简单dp. 还是从旧行转移到新行,而不是考虑新行从哪些旧行转移吧. #include<bit ...

  7. 一款基于Bootstrap的js分页插件bootstrap-paginator使用实例

    Bootstrap Paginator是一款基于Bootstrap的js分页插件,功能很丰富.它提供了一系列的参数用来支持用户的定制,提供了公共的方法可随时获得插件状态的改变,以及事件来监听用户的动作 ...

  8. SPOJ PHT【二分】+SPOJ INUM【最小/大值重复】

    BC 两道其实都是水 没有完整地想好直接就码出事情.wa了一次以后要找bug,找完要把思路理的非常清楚 SPOJ PHT[二分] #include<bits/stdc++.h> using ...

  9. 如何实现一个无边框Form的移动和改变大小(二)

    接着上文:这里写链接内容 我们来说说一个比较复杂的实现, 效果如图: 注意为了能够凸显没有NC(NotClient)区域,我们额外用了3个panel分别放在窗体的左右和下部.用来模拟客户自己的控件. ...

  10. CF954I Yet Another String Matching Problem(FFT+并查集)

    给定两个字符串\(S,T\) 求\(S\)所有长度为\(|T|\)子串与\(T\)的距离 两个等长的串的距离定义为最少的,将某一个字符全部视作另外一个字符的次数. \(|T|<=|S|<= ...