首页 > 其他 > 详细

变量小随笔

时间:2016-01-08 22:06:42      阅读:136      评论:0      收藏:0      [点我收藏+]

变量

  JavaScript是一门弱类型语言,它对变量的声明只需要一个var,与强类型语言如(Java)需要再声明变量的同时还必须为变量指明类型;

   Javascript变量分为如下两种类型

     1、基本类型值:Undefined,Null,Boolean,Number,String

     2、引用类型值

   基本类型值是按值访问的,因为可以操作保存在变量中的实际的值;

   引用类型值是保存在内存中的对象,但JS并不能直接访问内存中的位置,所以实际操作的是对象的引用,因此引用类型的值是按引用访问的。

       a、动态属性:

    创建一个变量只需要用var声明即可,但是当值保存到变量中之后,对于如上两种类型的变量的操作是不一样的:

    比如:

      (1)  var person = new Object();

        person.name = "jack";

        alert(person.name)  //输出jack

      (2) var person = "jack";

        person.age = "12";

        alert(person.age) // undefined;

      由此可见:JS只能给引用类型值动态的添加属性;    

   b、复制变量值:

    复制变量值也是有很大不同的:

    基本类型值:复制给另外一个变量时,相当于在内存中创建了一个新值,两个变量之间是没有任何关系的;

    引用类型值:复制给另外一个变量时,只是复制了对于该对象的引用,并没有生成新的值;

    比如:

      (1) var name = "jack"

        var person = name;

        var person = "rose";

        alert(name + "," + person) // jack,rose

        

      (2) var obj1 = new Object();

        var obj2 = obj1;

        obj2.name = "jack";

        alert(obj1.name) // jack

      obj1 与 obj2 同时指向了内存中的同一个Object对象;

 

   c、传递参数   

    JS中所有的函数的参数都是按值传递的;

    但是需要注意的是,当参数类型是基本类型的值时候,就跟基本类型变量值的复制一样,两个变量之间没有关联;如果参数是引用类型的值时,会把这个值在内存中的地址复制给一个局部变量,创建的是副本,并且局部变量的变化会反应在函数的外部;

    比如:

      (1)  function addT(num){

          num += 10;

          return num;

        }

        var count = 20 ;

        var   result = addT(count);

        alert(count) //20;

        alert(result) //30; 

      (2) function setName(obj){

          obj.name = "jack"

        } 

        var person = new Object();

        setName(person);

        alert(person.name) // "jack"

      (2)中代码会让人产生误解,因为局部作用域修改的值在全局作用域中显示出来了,这难道不是说明参数是按引用传递的么;其实不是,如下代码

      (3) 

        function setName(obj){

          obj.name = "jack"

          obj = new Object();

          obj.name = "rose"

        } 

        var person = new Object();

        setName(person);

        alert(person.name) // "jack" 

      很不如人意:rose并没有出现,如果参数是按照引用传递的话,那么应该输出rose;其实当执行obj = new Object()的时候重写了obj ,这个obj变成了局部变量;

      之所以前面一个obj局部改变值能在全局作用域中反应,完全是因为JS参数传递的值类型决定的;

 

   d、检测类型

    要检测一个变量是不是基本数据类型,typeof是最佳的工具:

      var s = "jack";

      var b = true;

      var i = 22;

      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 o) //object

    对于引用类型则使用 instanceof (variable instanceof constructor);任何引用类型的值都是Object的实例,所以任何引用类型的值instanceof Object 都返回true;

    检测基本类型的值的时候 都返回false;

 

 

    

变量小随笔

原文:http://www.cnblogs.com/zjw1993/p/5114664.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!