JavaScript 变量
变量来源于数学,是计算机语言中能储存计算结果或能表示值抽象概念。
变量就是存放一些内容
的容器
。
对于初学者,理解变量是重要的一环。
从分析变量
这个名词,可以知道他是一个可以改变的量
,这里的量就是代表某一种值
。
每个变量都有唯一的变量名,使用变量名来区分变量。
1. 声明变量
在 JavaScript 中使用var
关键字来声明变量。
var 存放数字用的变量 = ;
console.log(存放数字用的变量); // 输出:996
使用 console.log
,括号内放置变量名
,即可将变量的值输出在控制台。
虽然使用中文作为变量名在 chrome
浏览器下没有报错,但是还是不建议使用。
常规场景中不会有使用中文名作为变量的情况。
所以上述例子中的变量名不可取。
var number = ;
console.log(number); // 输出:996
将存放数字用的变量
修改成 number
,执行结果是一样的。
2. 赋值
给变量设置值的操作称为赋值
操作。
2.1 最简单的赋值操作
var result = ;
console.log(result); // 输出:0
这是一个最简单的赋值操作,直接将值赋给变量。
通常只有一个等号
出现的情况下就存在赋值操作。
2.2 将计算结果赋值给变量
var result = + ;
console.log(result); // 输出:5
这也是一个赋值操作,只不过等号右边的 2 + 3
会被计算出结果(计算的方式和小学开始学习的自然数学一样),再赋给变量 result
。
将上面这个例子做一个简单的改写:
2.3 让变量也参与计算
var number1 = ;
var number2 = ;
var result = number1 + number2; // 2 + 3
console.log(result); // 输出:5
原本 2 + 3
这部分也可以被变量所代替,参与计算的就是变量中的值。
2.4 改变变量的值
var string = '今天加班?';
console.log(string); // 输出:今天加班?
string = '福报!';
console.log(string); // 输出:福报!
注意:
当需要用变量存放一些“字”的时候,就需要用单引号
'
或者双引号"
将需要存放的字包裹。通常单个字会称之为
字符
,多个字的时候称为字符串
。这里做个了解,具体的会在后续
数据类型
章节详细展开讨论。
这是变量最重要的一个特性:可变
。
3. 变量的命名规范
在 JavaScript 中变量名存在一定规范,所有变量名必须符合这些规范,否则程序无法执行。
3.1 变量名必须使用字母
、下划线(_)
、美元符号($)
开头
尽管之前的例子有用到中文作为变量名,但是是不推荐的。
// 不会报错但是不推荐
var 数字 = ;
// 错误
var 1number = ;
// 错误
var number@a = ;
// 错误
var num+aa = ;
//下面是正确的方式
var number1 = ;
var _number = ;
var $number = ;
以上是一些简单的示例,可以根据规则自己在控制台尝试寻找规则。
3.2 变量对大小写敏感
以上是两个不同的变量,在 JavaScript
中变量是对大小写敏感的。
两个变量名即便字母是相同的,但是大小写不同,就不能算做一个变量。
3.3 无法使用关键字作为变量名
关键字
就是指一些已经被 JavaScript
预定义或者保留下来的内容,如声明变量用的关键字 var
就不能作为变量名。
var var = ; // Uncaught SyntaxError: Unexpected token 'var'
上面这段代码尝试着将 var 作为变量,到控制台运行是会报错的。
4. 合理规范的变量名
对于变量名,除了上面提到的变量命名的规范,最需要注意的就是给变量起一个有意义
的名字。
如求和:
var num1 = ;
var num2 = ;
var num3 = ;
var num4 = ;
var count = num1 + num2 + num3 + num4;
其中num
是number
的缩写,是很常用的一种缩写。
count
则是总数,表示求和的结果。
如果将上述例子做如下修改:
var a = ;
var b = ;
var c = ;
var d = ;
var e = a + b + c + d;
// 不合理的变量名
var ln = 'World'; // last name
var zs = ; // 总数
var jinNianDeNianShouRu = ; // 今年的年收入
以上是针对变量名的意义
展开的讨论。
如:
var firstName = 'Hello';
var lastName = 'world';
var createAt = ;
var userInfo = '用户信息'; // Info => @R_758_4045@ion
var isPaidUser = '是否付费用户';
可以见到上面的变量,从构成变量名的第二个单词开始,首字母都是大写,这就是驼峰命名的格式,本 Wiki 所有变量名使用的就是这种格式。
当然还有大驼峰,就是第一个字母也大写。
除此之外最常用的还有使用下划线分隔变量,如 user_info
,还有按功能来划分的变量名,如使用匈牙利命名
法,这里不再做展开。
5. 有关变量的其他知识
5.1 变量的默认值
var total;
console.log(total); // 输出:undefined
undefined
是一种是数据类型,具体内容可以参考数据类型
章节。
5.2 同时声明多个变量
使用一个 var
关键字就可以直接声明多个变量。
var num1 = , num2 = ;
// 通常会换行,方便阅读代码
var num3 = ,
num4 = ,
num5 = ,
num6,
num7 = ;
5.3 变量在 window 上
至于为什么可以省略 window
直接访问到变量,可以参考作用域链
章节。
5.4 不使用 var 关键字声明的变量
假如不使用 var
关键字,直接创建变量并赋值:
total = ;
console.log(total); // 输出:10
在控制台运行后会发现其实并没有报错,输出的结果也正常。
5.5 连续赋值
var a = b = ;
假如把上面这行代码拆开来可以理解成是这样的:
b = ;
var a = b;
5.6 重复声明变量
按照之前说的,变量在声明的时候如果没有赋值,则会是 undefined
,这个规则在重复声明的情况下不适用。
var num = ;
var num;
console.log(num); // 输出:1
观察上面这个例子输出的结果,可以发现变量 num
的值并没有改变。
但是如果重新声明的同时做赋值操作,值就会改变。
var num = ;
var num = ;
console.log(num); // 输出:3
这个例子输出的结果,就是再次声明并赋值后的值。
5.7 提前使用变量
console.log(number); // 输出:undefined
var number = ;
这个例子先输出了 number
的值,再声明并对其进行赋值。
console.log(number); // Uncaught ReferenceError: number is not defined
具体原因可以参考执行上下文
章节。
这里简单的解释可以理解成,在浏览器执行的时候,会把代码调整成如下样子:
var number;
console.log(number); // 这个时候 number 还没有被赋值,所以输出 undefined
number = ;
5.8 常量
常量就是定义并赋值后再也不能修改的量,通常一些不会改变的量,如配置、物理值等会声明为常量,在 ES6 之前是没有提供常量这一特性的。
但是根据常量自身的特性,定义赋值后不能被修改
,就可以通过一些方式来模拟常量。
第一种就是采用约定的形式,通常常量都是大写,不同单词之间用下划线分隔。
var PI = ;
var DB_ACCOUNT = 'root';
var DB_PASSWORD = 'root';
这种方式是最简单的方式,但不安全。
var CONfig = {};
Object.defineProperty(CONfig, 'DB_ACCOUNT', {
value: 'root',
writable: false,
});
console.log(CONfig.DB_ACCOUNT); // 输出:root
CONfig.DB_ACCOUNT = 'guest';
console.log(CONfig.DB_ACCOUNT); // 因为不可被改写,所以输出:root
Object.defineProperty(window, 'DB_ACCOUNT', {
value: 'root',
writable: false,
});
console.log(DB_ACCOUNT); // 输出:root
DB_ACCOUNT = 'guest';
console.log(DB_ACCOUNT); // 因为不可被改写,所以输出:root
var define = function(name, value) {
Object.defineProperty(window, name, {
value: value,
writable: false,
});
};
define('DB_ACCOUNT', 'root');
define('DB_PASSWORD', 'root');
只要约定好使用 define
函数定义的都为常量即可。
还有两种方式,就是结合Object.seal
与Object.freeze
的特性来声明常量。
这里对这两个原生方法不再做过多描述,有兴趣可以查阅相关 API 资料。
6. 小结
变量就是存放值的容器。
变量名存在一些命名规则:
- 变量名必须使用
字母
、下划线(_)
、美元符号($)
开头; - 变量对大小写敏感;
- 无法使用关键字作为变量名。
同时起变量名的时候需要有意义,靠近上下文场景。