JavaScript学习(三) 变量 作用域和内存

本文深入探讨JavaScript中变量的基本类型值与引用类型值的区别,包括动态添加属性、复制变量值、传递参数等内容,并详细解释了作用域的概念,以及如何检测变量类型。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一 变量:
JavaScript的变量为松散型,并不是强制类型
不同的数据类型分为:基本类型值和引用类型值。

基本类型值:栈内存中简单数据段,即这种值完全保存在内存中的一个位置
引用类型值:保存在堆内存中的对象,即这种值保存的实际上只是一个指针,该指针指向内存中的另一个位置,该位置保存对象。

1.
基本类型值:Undefined,Null,BooleanNumberString
堆内存的大小不固定,可将内存地址保存在栈内存中。

2.动态添加属性
var box=new Object();
box.name='lee';      //添加一个属性
alert(box.name);

var box='Lee';       //基本数据类型,是字符串
box.age=28;          //不是引用类型,不能添加动态属性

3.复制变量值
var box='Lee';
var box2=box;
//它们两个完全独立,也就是说两个变量,分别操作时,互不影响。

var box=new Object(); //创建一个引用类型
box.name='Lee';       //新建一个属性
var box2=box;         //把引用地址赋值给box2


box.name='aaa';  //因指向同一个指针,此时box.name='aaa'


4.传递参数
所有的函数都是按值传递是我,言下之意就是说,参数不会按引用传递,虽然变量有基本类型和引用类型之分。

function box(num){
   num+=10;
   return num;
}
var num=50;
alert(box(num)); //打印60 按值传递
alert(num);      //50;
//如果是按引用传递,函数里面的num会成为类似全局变量,把外面的num替换掉,也就是说alert(num) 打印60;单js里面不打印。

function box(obj){  //将要传递一个引用类型的参数,但是不是按引用传递
   obj.name='Lee';
   var obj=new Object(); 
   obj.name='kkk';
   //必须通过传参才行,JS没有传递引用的功能
}
var obj=new Object();
box(obj);
aler(obj.name); //打印Lee,当方法内obj为kkk时,依然打印'Lee'

//按引用传递和传递引用类型是两个不同的概念

function box(obj){
   obj.name='Lee';
   var obj=new Object();  //函数内部又创建了一个对象
   obj.name='Mr';         //并没有替换掉原来的obj
}

最后得出结论:ECMAScript函数的参数都将是局部变量,也就是说,没有按引用传递。


5.检测类型
typeOf:检测一个变量的类型

数组和null都是Object,这时应采用intanceOf运算符来查看
box intanceOf Array   //是否是数组
box intanceOf RegExp  //是否是正则表达式

当使用intanceOf检查基本类型值时,它会返回false
作用域:

1.执行环境及作用域
执行环境定义了变量或函数有权访问其他的数据,决定了它们各自的行为
全局变量和函数都是作为window对象的属性和方法创建的

var box='blue';
function setBox(){  //window的属性和方法
  alert(box);      //全局变量可在函数里访问
}
setBox();         //执行方法


var box='Lee';
function setBox(){
   var box='red';   //局部变量
}
alert(setBox());    //打印blue
alert(box);         //打印'Lee'


var box='Lee';
function setBox(box){
   alert(box);
}
setBox('red');
alert(box);    //打印red,通过传参,也是局部,在setBox下


var box='Lee';
function setBox(){
  function setColor(){
      var b='kkk';
      alert(b);
      return 123;
  }
  return setColor();
}
alert(setBox());
//作用域链,不能使用setBox().setColor();



2.没有块级作用域
if(true){
   var box='Lee';
   //if语句的{}没有封闭作用域的功能
}

for(var i=0;i<10;i++){
    var box='Lee';
    //i和box依然是window下的
}

function box(){
   var num=10;   //局部变量
   num=10;       //全局变量,不建议使用
}

变量访问中,局部变量要比全局变量更快,因为不需要向上搜索作用域链
内存问题:

标记清除:给存储在内存中的变量加上标记,去除掉正在运行的变量标记,定期回收

var box={
   name='Lee';
}
box=null;   //解除对象引用,等待垃圾回收
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值