1. 声明变量
在 JavaScript 中使用var
关键字来声明变量。
- 1
- 2
- 3
上述这段代码就是申明
了一个名为存放数字用的变量
的变量,并且将它的值设为996
。
使用 console.log
,括号内放置变量名
,即可将变量的值输出在控制台。
其中 //
后面的内容为注释
,代码执行过程中会被忽略。
虽然使用中文作为变量名在 chrome
浏览器下没有报错,但是还是不建议使用。
常规场景中不会有使用中文名作为变量的情况。
所以上述例子中的变量名不可取。
- 1
- 2
- 3
将存放数字用的变量
修改成 number
,执行结果是一样的。
2. 赋值
给变量设置值的操作称为赋值
操作。
2.1 最简单的赋值操作
- 1
- 2
- 3
这是一个最简单的赋值操作,直接将值赋给变量。
通常只有一个等号
出现的情况下就存在赋值操作。
2.2 将计算结果赋值给变量
- 1
- 2
- 3
这也是一个赋值操作,只不过等号右边的 2 + 3
会被计算出结果(计算的方式和小学开始学习的自然数学一样),再赋给变量 result
。
将上面这个例子做一个简单的改写:
2.3 让变量也参与计算
- 1
- 2
- 3
- 4
- 5
- 6
原本 2 + 3
这部分也可以被变量所代替,参与计算的就是变量中的值。
2.4 改变变量的值
- 1
- 2
- 3
- 4
- 5
- 6
- 7
这段代码运行后可以在控制台观察到有两个输出,分别对应变量的值。
代码很简单,先声明了一个叫 string
的变量,并赋值字符串今天加班?
并输出,随后修改了他的值,重新赋值了字符串福报!
。
这是变量最重要的一个特性:可变
。
3. 变量的命名规范
在 JavaScript 中变量名存在一定规范,所有变量名必须符合这些规范,否则程序无法执行。
3.1 变量名必须使用字母
、下划线(_)
、美元符号($)
开头
尽管之前的例子有用到中文作为变量名,但是是不推荐的。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
以上是一些简单的示例,可以根据规则自己在控制台尝试寻找规则。
3.2 变量对大小写敏感
- 1
- 2
- 3
以上是两个不同的变量,在 JavaScript
中变量是对大小写敏感的。
两个变量名即便字母是相同的,但是大小写不同,就不能算做一个变量。
3.3 无法使用关键字作为变量名
关键字
就是指一些已经被 JavaScript
预定义或者保留下来的内容,如声明变量用的关键字 var
就不能作为变量名。
- 1
上面这段代码尝试着将 var 作为变量,到控制台运行是会报错的。
4. 合理规范的变量名
对于变量名,除了上面提到的变量命名的规范,最需要注意的就是给变量起一个有意义
的名字。
如求和:
- 1
- 2
- 3
- 4
- 5
- 6
其中num
是number
的缩写,是很常用的一种缩写。
count
则是总数,表示求和的结果。
如果将上述例子做如下修改:
- 1
- 2
- 3
- 4
- 5
- 6
缺少了有意义的变量名就比较难看出代码具体在做什么。当然这段代码本身意义就不大,场景太过简单。
刚才提到的缩写,其实也是要注意的一点,缩写上一定要使用通用的缩写,如含有fn
表示一个功能或者函数,avg
表示平均值,pwd
表示密码,i18n
为国际化。
这些缩写比较通用,大部分开发者都可以看得懂。随着编码经验的增加,会在他人代码里见到大量的缩写,从而累积到自己的大脑的缩写库中。
最后需要注意的一点是业务中尽量不要含有中文拼音或中文拼音的缩写,排开鄙视链的原因,最大的问题是会让变量名变得冗长难懂。
以上内容在写 demo 或者测试功能的时候可以不需要考虑,写 demo 等大部分情况是为了验证自己的猜想。
- 1
- 2
- 3
- 4
以上是针对变量名的意义
展开的讨论。
还有需要注意的是变量命名的格式,大部分前端程序员会使用驼峰命名法
,也就是第一个字母小写,后续如果有新的单词来进行构成,单词的第一个字符都大写。
如:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
可以见到上面的变量,从构成变量名的第二个单词开始,首字母都是大写,这就是驼峰命名的格式,本 Wiki 所有变量名使用的就是这种格式。
当然还有大驼峰,就是第一个字母也大写。
除此之外最常用的还有使用下划线分隔变量,如 user_info
,还有按功能来划分的变量名,如使用匈牙利命名
法,这里不再做展开。
5. 有关变量的其他知识
5.1 变量的默认值
变量在声明的时候,如果没有赋值,则变量就会有一个默认值 undefined
。
- 1
- 2
- 3
undefined
是一种是数据类型,具体内容可以参考数据类型
章节。
5.2 同时声明多个变量
使用一个 var
关键字就可以直接声明多个变量。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
在一个变量声明后,使用逗号分隔,紧接着声明下一个变量即可。
通常使用一个 var
声明多个变量的时候也会换行,方便后续阅读,并保持代码格式上的整洁清晰,防止一行过长。
5.3 变量在 window 上
在最外层声明的变量(不包括 ES6 模块的情况),实际上是变成了 window 对象的一个属性。
- 1
- 2
- 3
- 4
上述代码执行后输出的两个内容是一样的,都为 996。有关 window 对象的内容可以参考 BOM
章节。
细心的读者应该会注意到最外层
这个条件,因为变量还有可能声明在函数之中,函数有自己独立的作用域,通常在函数中使用 var
关键字声明的变量,只在函数中有效。
至于为什么可以省略 window
直接访问到变量,可以参考作用域链
章节。
5.4 不使用 var 关键字声明的变量
假如不使用 var
关键字,直接创建变量并赋值:
- 1
- 2
- 3
在控制台运行后会发现其实并没有报错,输出的结果也正常。
在非ES6模块
中,这样创建的变量和使用 var
创建的变量除了不能提前使用之外,没有其他大的区别,会被直接作为 window 对象的属性,成为全局变量。
即便是在函数或者其他存在块级作用域的环境中,这样声明的变量也会作为全局变量。
5.5 连续赋值
- 1
假如把上面这行代码拆开来可以理解成是这样的:
- 1
- 2
看似没什么问题,许多开发者也会用这种方式同时声明多个变量,但如果在函数或者独立的作用域中,b
就会成为全局变量,造成全局命名空间的污染。
5.6 重复声明变量
按照之前说的,变量在声明的时候如果没有赋值,则会是 undefined
,这个规则在重复声明的情况下不适用。
- 1
- 2
- 3
- 4
观察上面这个例子输出的结果,可以发现变量 num
的值并没有改变。
但是如果重新声明的同时做赋值操作,值就会改变。
- 1
- 2
- 3
- 4
这个例子输出的结果,就是再次声明并赋值后的值。
5.7 提前使用变量
- 1
- 2
- 3
这个例子先输出了 number
的值,再声明并对其进行赋值。
代码并没有报错,但如果没有第二行声明,只输出 number
:
- 1
这样子会爆出变量未定义
的错误,说明变量是可以被提前使用,只是没有值,或者说是 undefined
默认值。
具体原因可以参考执行上下文
章节。
这里简单的解释可以理解成,在浏览器执行的时候,会把代码调整成如下样子:
- 1
- 2
- 3
- 4
- 5
5.8 常量
常量就是定义并赋值后再也不能修改的量,通常一些不会改变的量,如配置、物理值等会声明为常量,在 ES6 之前是没有提供常量这一特性的。
但是根据常量自身的特性,定义赋值后不能被修改
,就可以通过一些方式来模拟常量。
第一种就是采用约定的形式,通常常量都是大写,不同单词之间用下划线分隔。
- 1
- 2
- 3
- 4
这种方式定义的常量
本质上还是变量,值还是可以修改的,但因为命名格式采用国际惯例
,一眼就能看出是常量,不会对其修改。
这种方式是最简单的方式,但不安全。
第二种方式就是利用对象下属性的描述来控制可写性,将对象的属性设置为只读。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
这种方式将常量都放在一个对象下,通过Object.defineProperty
定义属性,设定其writable
为false
,就可以防止被改写。
但有一个问题,CONFIG
自身这个对象可能被修改。
换一个思路,既然在最外层声明的变量是放在window
上的,那可以用这个方式往 window上挂不可改写的属性。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
通常情况下 window 对象是不可被修改的,这样常量的安全系数就变得非常高,但缺点是可能性较差,通过一点修改可以提升可读性。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
只要约定好使用 define
函数定义的都为常量即可。
还有两种方式,就是结合Object.seal
与Object.freeze
的特性来声明常量。
前者可以使对象不能再被扩充,但是所有属性还需要再手动设置不可写,后者可以让对象不能扩充,属性也不能修改。
这里对这两个原生方法不再做过多描述,有兴趣可以查阅相关 API 资料。
6. 小结
变量就是存放值的容器。
变量名存在一些命名规则:
- 变量名必须使用
字母
、下划线(_)
、美元符号($)
开头; - 变量对大小写敏感;
- 无法使用关键字作为变量名。
同时起变量名的时候需要有意义,靠近上下文场景。