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

众所周知,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);  //20
alert(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不是引用同一个堆中的变量

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值