JavaScript中的变量与数据讨论

JavaScript中的变量与数据(高阶版)

一、var声明变量

我们在初学习js的变量时,一般都会用var做变量声明,即var n=1;或许我们也就按照这种格式用了,并不清楚var的一些需要注意的点。这里就做一个总结:
1.变量的提升:使用var 声明的变量可以进行提升 ,提升就是把加var的变量提到最前面。JS代码在执行之前有一个预解析,预解析的时候做了两件事,把加var的变量提升到了代码段的最前面,提升的时候仅仅是提升了声明。 执行下面代码:

console.log(a);
var a = 666;
console.log(a);
复制代码

显示的结果会是:

按照代码的正常执行顺序,因为未声明a这个变量,所以应该报错,但事实会输出undefined、666这两个数据。其实这就是程序在预解析时做了变量提升,也即是按照这种方式:

var a;
console.log(a);
var a = 666;
console.log(a);
复制代码

2.局部变量与全局变量:在JS中全局变量和局部变量的分界点是函数。使用var声明变量时,全局变量和局部变量的区别局在与是否在函数内。若在一个函数内使用var声明变量,那么这个变量就是局部变量,反之则是全局变量,这也是var变量是全局变量和局部变量的唯一界限。 举个例子:

for(var i=0; i<10; i++){
    }
console.log(i)
复制代码

显示结果会是:

在其他的编程语言中如果执行这样的代码就应该报错了,可是这里却没有。比如在C语言中{}会形成一个块级作用域。
3.同名变量,那么后面的变量会覆盖前面的变量,而且var可以省略 4.在ES6出来后,又定义了两个关键字,一个叫let (类似var,但它能形成一个块级作用域,一个{}就是一个块级作用域。在我们举的第二个例子中{}就是一个块级作用域。let声明的变量不能提升以及同名变量不可重复赋值), 一个叫const(用来声明一个常量,这个常量的值,不能随便改变)。所以我们一般会选择使用let const这两个。

二、数据与内存问题

众做周知,内存是我们在执行程序时,用于存放变量、对象、常量的物理空间。js中内存空间可分为三种:栈(stack)、堆(heap)
栈:存放基本数据类型,即变量,常量。例如:string、number、boolean、null、undefined
堆:存放引用数据类型,即复杂对象,特点:不能被直接访问,更不能直接操作堆空间,只能引用访问、操作。释放引用,会被浏览器自动垃圾回收,释放内存空间。 在JS中有两个特殊的对象:数组 array;函数 funciton
1.对于基本数据类型,其值存于栈中,声明的变量名就代表着这个变量的地址,其中的值就是所赋的值 举个例子:

在这个例子中,Var a = 10; var b = a;a=110; 上面的代码可以这样理解:将a对应的内存中的值取出来复制了一份,同时开辟新空间把值赋给b,此时b就是10。再为110开辟新空间,然后让a指向这个新地址,销毁最初的空间。此时a和b这两个内存空间是独立的,对一个内存空间值的改变不会影响另一个内容空间。
2.对于引用数据类型,会把值存储在堆中,把地址放在栈中 举个例子:
在这个例子中,数组[1,2]被放在堆中,其地址被存储在了栈中,执行var b=a时,其实也就是把数组的内存地址复制了一份给b,这时可以看出a与b的指向数组一致,所以在b[0]=110时,原来存储在数组中原来位置的1会被110覆盖,这点跟栈中不同。
3.
在这个例子中,a=[1,2,3],对a重新进行了赋值,所以它的地址也会做出改变。

转载于:https://juejin.im/post/5ce51159f265da1bbc6fabf6

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值