1. const定义的变量与let类似, 但不能重新赋值:
const PI = 3.141592653589793;
PI = 3.14; // 会出错
PI = PI + 10; // 也会出错
2. 在声明时赋值
2.1. JavaScript const变量必须在声明时赋值:
// 不正确
const PI;
PI = 3.14159265359;
// 正确
const PI = 3.14159265359;
3. 常量对象可以更改
3.1. 您可以更改常量对象的属性:
const mobile = {name: 'huawei', color: 'white'};
mobile.color = 'black'; // 更改属性
mobile.id = 1001; // 添加属性
3.2. 但是您无法重新为常量对象赋值:
const mobile = {name: 'huawei', color: 'white'};
mobile = {}; // 报错, 无法重新赋值
4. 常量数组可以更改
4.1. 您可以更改常量数组的元素:
const books = ['java编程思想', 'java编程语言'];
books[1] = 'java编程语言(第三版)'; // 更改元素
books.push('java核心技术'); // 添加元素
4.2. 但是您无法重新为常量数组赋值:
const books = ['java编程思想', 'java编程语言'];
// books = []; // 报错, 无法重新赋值
5. 块作用域
5.1. 可以使用const关键字声明拥有块作用域的变量(和let关键字一样)。
5.2. const 在块{}内声明的变量无法从块外访问。
5.3. 实例
{
var a = 5; // 给a初始化为5
}
document.write('a = ' + a + "<br />"); // 输出a = 5
{
let b = 10;
// let在块内声明的变量, 只能在块内访问。
document.write('b = ' + b + "<br />"); // 输出b = 10
}
// 块外不能访问b, 访问b, 报错
{
const c = 15;
// const在块内声明的变量, 只能在块内访问。
document.write('c = ' + c + "<br />"); // 输出c = 15
}
// 块外不能访问c, 访问c, 报错
6. 循环作用域
6.1. 循环中使用const声明的变量, 在循环外不能访问(和let关键字一样)。
for(var i = 1; i <= 3; i++){
document.write('i = ' + i + "<br />");
}
document.write('i = ' + i + "<br />"); // 输出i = 4
document.write('i = ' + window.i + "<br />"); // 输出i = 4
var obj = {id: 1001, name: 'zs'};
for(var item in obj){
document.write('item = ' + item + "<br />");
}
document.write('item = ' + item + "<br />"); // 输出item = name
document.write('item = ' + window.item + "<br />"); // 输出item = name
for(let j = 1; j <= 3; j++){
document.write('j = ' + j + "<br />");
}
// 不能访问j
for(let key in obj){
document.write('key = ' + key + "<br />");
}
// 不能访问key
// 这里有k++, const定义的变量必须初始化, 而且不能改变, 因此并不适用于定义for循环的变量。但是for循环体外不能访问const定义的变量。
// for(const k = 1; k <= 3; k++){
// document.write('k = ' + k + "<br />");
// }
for(const k = 1; k <= 3;){
document.write('k = ' + k + "<br />");
break;
}
for(const key in obj){
document.write('key = ' + key + "<br />");
}
// 不能访问key
7. 函数作用域
7.1. 在函数内声明变量时, 使用var、let和const很相似。它们都有函数作用域:
function myFunction1() {
var bookName = "Effective Java"; // 函数作用域
document.write('bookName = ' + bookName + "<br />"); // bookName = Effective Java
}
myFunction1();
// document.write('bookName = ' + bookName + "<br />"); // 访问bookName会报错
function myFunction2() {
let mobileName = "huawei"; // 函数作用域
document.write('mobileName = ' + mobileName + "<br />"); // mobileName = huawei
}
myFunction2();
// document.write('mobileName = ' + mobileName + "<br />"); // 访问mobileName会报错
function myFunction3() {
const computerName = "联想"; // 函数作用域
document.write('computerName = ' + computerName + "<br />"); // computerName = 联想
}
myFunction3();
// document.write('computerName = ' + computerName + "<br />"); // 访问computerName会报错
8. 全局作用域
8.1. 如果在块外声明声明, 那么var、let和const也很相似。它们都拥有全局作用域:
var d = 20; // 全局作用域
let e = 25; // 全局作用域
const f = 30; // 全局作用域
9. html中的全局变量
9.1. 使用JavaScript的情况下, 全局作用域是JavaScript环境。
9.2. 在html中, 全局作用域是window对象。
9.3. 通过var关键词定义的全局变量属于window对象。
9.4. 通过const关键词定义的全局变量不属于window对象, 属于JavaScript环境(和let关键字一样):
var d = 20;
document.write('d = ' + d + "<br />"); // d = 20
document.write('d = ' + window.d + "<br />"); // d = 20
let e = 25;
document.write('e = ' + e + "<br />"); // e = 25
document.write('e = ' + window.e + "<br />"); // e = undefined
const f = 30;
document.write('f = ' + f + "<br />"); // f = 30
document.write('f = ' + window.f + "<br />"); // f = undefined
10. 重新声明
10.1. 在相同的作用域, 通过const重新声明一个var或let变量是不允许的:
var I = 'I_01'; // 允许
let I = 'I_02'; // 不允许
function myFn01(){
var I = 'I_01'; // 允许
let I = 'I_02'; // 不允许
}
var II = 'II_01'; // 允许
const II = 'II_02'; // 不允许
function myFn02(){
var II = 'II_01'; // 允许
const II = 'II_02'; // 不允许
}
let III = 'III_01'; // 允许
const III = 'III_02'; // 不允许
function myFn02(){
let III = 'III_01'; // 允许
const III = 'III_02'; // 不允许
}
{
let III = 'III_01'; // 允许
const III = 'III_02'; // 不允许
}
10.2. 在相同的作用域, 通过var、let、const重新声明一个const变量是不允许的:
const IV = 'IV_01'; // 允许
var IV = 'IV_01'; // 不允许
function myFn03(){
const IV = 'IV_01'; // 允许
var IV = 'IV_01'; // 不允许
}
const V = 'V_01'; // 允许
let V = 'V_02'; // 不允许
{
const V = 'V_01'; // 允许
let V = 'V_02'; // 不允许
}
function myFn04(){
const V = 'V_01'; // 允许
let V = 'V_02'; // 不允许
}
const VI = 'VI_01'; // 允许
const VI = 'VI_02'; // 不允许
{
const VI = 'VI_01'; // 允许
const VI = 'VI_02'; // 不允许
}
function myFn05(){
const VI = 'VI_01'; // 允许
const VI = 'VI_02'; // 不允许
}
11. 例子
11.1. 代码
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>const关键字</title>
</head>
<body>
<script type="text/javascript">
// 不能重新赋值
const PI = 3.141592653589793;
// PI = 3.14; // 会出错
// PI = PI + 10; // 也会出错
const mobile = {name: 'huawei', color: 'white'};
mobile.color = 'black'; // 更改属性
mobile.id = 1001; // 添加属性
// mobile = {}; // 报错, 无法重新赋值
const books = ['java编程思想', 'java编程语言'];
books[1] = 'java编程语言(第三版)'; // 更改元素
books.push('java核心技术'); // 添加元素
// books = []; // 报错, 无法重新赋值
{
var a = 5; // 给a初始化为5
}
document.write('a = ' + a + "<br />"); // 输出a = 5
{
let b = 10;
// let在块内声明的变量, 只能在块内访问。
document.write('b = ' + b + "<br />"); // 输出b = 10
}
// 块外不能访问b, 访问b, 报错
{
const c = 15;
// const在块内声明的变量, 只能在块内访问。
document.write('c = ' + c + "<br />"); // 输出c = 15
}
// 块外不能访问c, 访问c, 报错
for(var i = 1; i <= 3; i++){
document.write('i = ' + i + "<br />");
}
document.write('i = ' + i + "<br />"); // 输出i = 4
document.write('i = ' + window.i + "<br />"); // 输出i = 4
var obj = {id: 1001, name: 'zs'};
for(var item in obj){
document.write('item = ' + item + "<br />");
}
document.write('item = ' + item + "<br />"); // 输出item = name
document.write('item = ' + window.item + "<br />"); // 输出item = name
for(let j = 1; j <= 3; j++){
document.write('j = ' + j + "<br />");
}
// 不能访问j
for(let key in obj){
document.write('key = ' + key + "<br />");
}
// 不能访问key
// 这里有k++, const定义的变量必须初始化, 而且不能改变, 因此并不适用于定义for循环的变量。但是for循环体外不能访问const定义的变量。
// for(const k = 1; k <= 3; k++){
// document.write('k = ' + k + "<br />");
// }
for(const k = 1; k <= 3;){
document.write('k = ' + k + "<br />");
break;
}
for(const key in obj){
document.write('key = ' + key + "<br />");
}
// 不能访问key
function myFunction1() {
var bookName = "Effective Java"; // 函数作用域
document.write('bookName = ' + bookName + "<br />"); // bookName = Effective Java
}
myFunction1();
// document.write('bookName = ' + bookName + "<br />"); // 访问bookName会报错
function myFunction2() {
let mobileName = "huawei"; // 函数作用域
document.write('mobileName = ' + mobileName + "<br />"); // mobileName = huawei
}
myFunction2();
// document.write('mobileName = ' + mobileName + "<br />"); // 访问mobileName会报错
function myFunction3() {
const computerName = "联想"; // 函数作用域
document.write('computerName = ' + computerName + "<br />"); // computerName = 联想
}
myFunction3();
// document.write('computerName = ' + computerName + "<br />"); // 访问computerName会报错
var d = 20;
document.write('d = ' + d + "<br />"); // d = 20
document.write('d = ' + window.d + "<br />"); // d = 20
let e = 25;
document.write('e = ' + e + "<br />"); // e = 25
document.write('e = ' + window.e + "<br />"); // e = undefined
const f = 30;
document.write('f = ' + f + "<br />"); // f = 30
document.write('f = ' + window.f + "<br />"); // f = undefined
</script>
</body>
</html>
11.2. 效果图