先看一下定义、声明、初始化这三个东西的概念是什么:
定义:给变量分配存储空间,并赋值
声明:说明变量类型、名称(标识)
初始化:声明变量时给变量赋值
首先看,定义的两种表示方法:
表示方法1:
var x = 1;
经常听到有人称这句代码为声明变量,但其实这句代码属于——完整的创建变量并赋值,且以变量名为独有标识向内存申请空间。
再重新看最开始的三个概念,声明只能说明变量类型、名称,初始化是在声明时候赋值,这两个都不能向内存申请分配空间,这是定义的事儿。
所以这行代码虽然进行了变量的声明(说明变量类型Number、名称x)、初始化(x=1),但是他还向内存申请了空间,所以他是定义。
可以理解为:定义 = 声明 + 申请空间(不用+初始化,不初始化也可以实现定义,后文再说)
再看这行代码: var x = 1
x 是他声明的变量名称,x=1 是他初始化的变量值,但是他的变量类型说明在哪里呢?
注意,JavaScript是由变量值决定变量类型,即:
向变量赋什么类型的值,则变量就是什么类型的变量,这里向变量赋值 1 ,1是number类型,所以变量x就是number类型,所以其实已经隐性的完成了变量的声明——说明变量类型+变量名称
验证如下:
var x = 1
document.write(typeof x)//结果:number
有了变量的名称,就可以通过关键字向内存申请空间,如果没有变量名称,是无法向内存申请空间的,因为你无法将这块空间与其他的空间做出区分,也就无法使用这块空间,所以变量名称又叫标识,即空间的独有标识。
JavaScript 定义变量的关键字有let、var、const,const是定义特殊的变量—常量的关键字。、
再看回这行代码,他是使用关键字 var 向内存申请空间的。
到这里,我们已经将这行代码全部解析完毕,他实现了 声明 + 申请空间 ,所以他是一条完整的变量定义语句。
表示方法2 :
var y
这种语句的语义是:申请一块叫做y的空间。
空间y(变量y)没有进行初始化,那么他就没有自己的值 ? 不知道他的值的类型,也就不知道他的变量类型,所以他没有完成变量定义?
注意,JavaScript语言有一种基本数据类型叫做undefined,翻译作未定义。
当变量没有进行初始化的时候,系统会自动为变量赋值undefined,undefined的类型是undefined,所以未初始化的变量默认值都是undefined,默认变量类型都是undefined。
所以这行代码其实也完成了声明 + 申请空间 的定义全流程。
然后再看 声明的表示方式:
z = 3
这行代码没有关键字,所以没有向内存申请空间,他肯定不是定义,z是他的变量名称,3是他的值,3是number类型,所以变量z类型是number,说明了变量名称+变量类型,所以他首先是声明,其次他在声明过程中给变量赋值,这是初始化,那么这条语句究竟是声明还是初始化呢?
这就要看声明和初始化谁的概念更广泛了,二者是完全划等号还是一者大于另一者?
我们刚才说过:当变量没有进行初始化的时候,系统会自动为变量赋值undefined
注意,系统自动为变量赋值undefined的过程不叫初始化,初始化必须是我们手动给变量赋的值,但是系统自动为变量赋值undefined,可以将变量类型说明为undefined,也就是说我们可以在不完成初始化的情况下实现变量赋值,进而实现变量声明,所以变量声明的范围大于变量初始化。
得出:声明 = 说明变量名称 + 说明变量类型(通过赋值:1.自动赋值2.手动赋值(初始化))
回到这行代码z=3 ,他既实现了变量初始化也实现了变量声明,但是一般我们说他是在声明变量。
弄懂初始化与赋值的区别对于常量的认识是有必要的,常量是值不可改变的变量,所以在定义常量的时候必须要给常量赋值,否则之后无法再次为常量赋值,这块空间将永远空置,而且不能由系统自动给常量赋值,系统自动赋值会给变量赋undefined,那么该常量的值将永远都是undefined,所以必须手动为常量赋值,即常量必须初始化。
综上所述,可以笼统的说,在JavaScript中:定义>声明>初始化