JavaScript变量,作用域与内存问题(笔记)

来源:互联网 发布:淘宝信誉如何提升 编辑:程序博客网 时间:2024/06/03 22:44
众所周知,JavaScript有五种简单数据类型:Undefiend , Null , Boolean , Number 和String。还有一种复杂数据类型—Object。尤值一提的是JavaScript中Boolean值,true不一定等于1,而false也不一定等于0;
在JavaScript程序设计中,我们经常会碰到以下几种定义值,变量的情况。

1.引用类型值


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

如果没有参数,括号亦可省略,如:

var person = new Object;

2.基本类型值
var name = "jkcaptain";name.age ="27";alert(name.age); //Undefiend

 所以我们不能给基本类型值添加属性,尽管这样做不会导致报错。


JavaScript中的复制变量值
当复制的变量类型是基本数据类型时,会在栈中创建一个新值,然后把该值复制到新变量分配的位置上。如:

var num1 = 5;var num2 = num1; //5


此时num1变化不会牵扯到num2.也就是说两个变量数值变化不会互生影响。

当一个变量从另一个变量复制引用类型的值时,同样的会将栈中的值复制一份到新的变量空间中。从本质上来讲,复制过去的不是值,是指针。而这个指针指向堆里的一个对象
所以复制操作结束后,两个指针指向同一个变量。故而只要其中一个变量变化,就都会受到影响。如:

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

JavaScript传递参数,与值的复制大同小异

向参数传递基本数据类型的值时,被传递的值会复制给一个局部变量(即函数的参数).如

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

但是,当参数传递为引用类型的值时,就不可同样对待了.因为程序会把当前值的指针作为参数,传递给函数内部的参数。此时,内外部参数的指针都指向堆中的同一个值(效仿值的复制)。如

function setName(obj){      obj.name = "JkCaptain";}var person = new Object();setName(person);alert(person.name);  //JkCaptain;

以下一段程式更可直观的反应出引用类型值的指针传递

function setName(obj){       obj.name = "JkCaptain";       var obj = new Object();//new一个新变量,指针与上述obj的指针不同。实际上,在函数中重写obj时,这个变量引用的就是一个局部变量了,函数执行完后会被立即销毁       obj.name = "jieke";}var obj = new Object();setName(obj);alert(obj.name); //JkCaptain  由此可见函数中内部声明的obj与此obj不是引用同一个堆中的变量

作用域问题:暂略;
内存问题:暂略;