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;   //解除对象引用,等待垃圾回收
### 下载 Popper.min.js 文件的方法 对于希望获取 `popper.min.js` 的开发者来说,可以通过多种方式来实现这一目标。通常情况下,推荐通过官方渠道或可靠的分发网络 (CDN) 来获得最新的稳定版文件。 #### 使用 CDN 获取 Popper.min.js 最简单的方式之一是从流行的 CDN 中加载所需的 JavaScript 库。这不仅简化了集成过程,还可能提高性能,因为许多用户已经缓存了来自这些服务提供商的内容。例如: ```html <script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2/dist/umd/popper.min.js"></script> ``` 这种方式不需要手动下载文件到本地服务器;只需将上述 `<script>` 标签添加至 HTML 文档中的适当位置即可立即使用 Popper 功能[^1]。 #### 从 npm 或 yarn 安装 如果项目采用模块化构建工具链,则可以直接利用包管理器如 npm 或 Yarn 进行安装。命令如下所示: ```bash npm install @popperjs/core # 或者 yarn add @popperjs/core ``` 之后可以根据具体需求引入特定功能模块,而不是整个库,从而减少打包后的体积并优化加载速度[^2]。 #### 访问 GitHub 发布页面下载压缩包 另一种方法是访问 Popper.js 的 [GitHub Releases](https://github.com/popperjs/popper-core/releases) 页面,在这里可以选择不同版本的 tarball 或 zip 归档进行下载解压操作。这种方法适合那些偏好离线工作环境或是想要定制编译选项的人群[^3]。 #### 手动克隆仓库 最后一种较为少见但也可行的办法便是直接克隆完整的 Git 存储库副本。这样可以获得开发分支以及历史记录等更多信息,适用于贡献代码或者深入学习内部机制的情况。 ```bash git clone https://github.com/popperjs/popper-core.git cd popper-core ``` 完成以上任一途径后便能成功取得所需版本的 Popper.min.js 文件,并将其应用于个人项目之中[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值