两种变量类型

基本类型: undefined、Null、Boolean、Number、String五种 (简单的数据段);
引用类型: object (由多个值构成),也就是我们说的"对象"

两种变量的赋值原理

基本类型的变量分配的是一个固定地址的存储空间,通过对这个存储空间写入数据来赋值,这个地址是唯一且不变的。
引用类型的变量分配的是一个用于存放地址的地址包而不是存储空间,这个指针包

变量间的赋值

基本类型变量间的赋值 :

将前一变量赋值给后一变量时,只是将前一个变量当前的副本赋给后一个变量,之后变量改变互不影响,如下:

var a=3
var b=a
    a=4
console.log(b)//之后a变量改变成4,b并不受影响,仍然是3

引用类型变量间的赋值 :

将前一变量赋值给后一变量时,是将前一个变量的指针给后一个变量,两个变量用的是同一个指针,指向的是同一个地址,是同一个值。无论哪个变量对这同一个值进行改变,都将同时改变两个变量的值,两个变量相互影响,如下:

var a={d:3}
var b=a
    a.d=4
console.log(b.d)//给a.d指向的值更改为4,b.d的值也是4

由上可知:基本类型变量间的赋值是赋变量的副本,也叫按值传递;而引用类型变量间的赋值是赋变量的指针,也叫引用传递。

引用类型变量属性的赋值 :

每条属性对应的是一个指针与它所指的地址存储的值。
引用类型变量属性的赋值是按值传递,

变量的多次定义

多次定义

在不同作用域里可以多次定义,互不影响
在同一作用域里,第二次定义无效
如下:
var a=3
var a

函数中的形参

如下:

var a=3
function b(a) {   //形参a在函数外已变量定义
    console.log(a)
  }
b(a)

ps: 这是一件很蠢的事,形参的命名要避免象上面这样以同级的变量名来命名,否则会对函数外的变量造成无法预料的后果。
js对形参在变量对象中是如何保存的呢,请看规范:

其实行参跟局部变量是同一个东西,都是保存在函数内部的变量


百分之一百零八
15 声望3 粉丝