一:变量命名规则与规范
1 规则
- 可以以下划线、字母、数字、$符命名,不能以数字开头
- 不能以关键字命名,eg:let、var、const
- 命名严格区分大小写,age、AGE是两个不同的变量名
2 规范(并不是规则,而是都应该遵循的规范)
- 命名要有意义,见名知意
- 命名要遵循驼峰命名的原则(第一个字母小写,第二个字母大小),例如userName
二:变量的本质
1 内存
计算机中开辟存储数据的区域
2 变量本质
程序请求在计算机内存中开辟的临时存储区域
三:声明变量关键字
ECMAScript变量是松散类型的,因此变量可以保存任何类型的数据。var在ECMAScript的所有版本中都可以使用,但是const和let只能在ECMAScript6及更晚的版本中使用
ECMAScript是JS中的组成部分之一,是JS中核心语法的制定的规则
一 var关键字
1 var声明提升
使用这个关键字声明的变量,会自动提升到函数作用域的顶部;这是不合理的,怎么可以未声明就可以使用呢?
<script>function foo(){console.log(age);var age = 26;}foo()
</script>
//控制台会输出undefined
之所以不会报错,输出了undefined,因为ECMAScript运行时把它看成等价的如下代码:
function foo(){var age;console.log(age);age = 26;}foo()
2 作用域范围
-
使用var操作符定义的变量会成为包含它的函数的局部变量,其作用域的范围是函数作用域
function text(){var message = 'hi';
}
text();
//调用text()函数,它会创建这个变量并给它赋值。调用后变量即被销毁
-
在函数内定义变量时,省略var操作符,可以创建一个全局变量
虽然可以省略,从而创建全局变量,但不推荐这么做。在局部变量中定义的全局变量很难做到维护,也会造成困扰。因为不能一下子断定省略的var是不是有意而为之。
在严格模式下,如果像这样给未声明的变量赋值,则会抛出ReferenceError
注意:
- 1 Var可以未声明先使用
- 2 var可以多次声明变量
- 正是因为这些bug所以var被抛弃;现在全面使用let,请看下面let详解
二 let关键字
1 作用域范围
let声明的范围是块作用域,而var声明的作用域是函数作用域
if(true){var name = 'Matt';console.log(name);//Matt
}
console.log(name)//Mattif(true){let name = 'Matt';console.log(name);//Matt
}
console.log(name)//EeferenceError:age没有定义
因为let声明变量的作用域仅限于该if块内部,所以不会在块外边再使用
块作用域是函数作用域的子集,因此是用于var的作用域限制也同样适用于let
2 声明冗余报错的问题
var name;
let name;//SyntaxError
let age;
var age;//SyntaxError
这俩个关键字声明的并不是不同类型的变量,他们只是指出变量在相关作用域中如何存在
3 全局声明
重点!重点!重点!
使用let在全局作用域中声明的变量不会成为window对象的属性(var声明的变量则会)
var name = 'Matt';console.log(window.name);//Mattlet age = 18;console.log(window.age);//undefined
三const关键字
1 使用方法
-
const声明的变量称为”常量“
-
const声明的变量必须经过初始化
-
变量中存储的某个值永远不会改变时,使用const声明
-
基本数据类型如果值在后期程序中会发生改变,则无法使用
-
对于复杂数据类型,如数组,仅仅添加或删除数组中元素是可以使用const的;因为没有修改数组的地址,而只是修改了数组中的内容
-
-
修改const声明的变量会导致运行时错误,并且不能重新赋值
const age = 26;
age = 36;//TypeError:给常量赋值