javascript基础学习系列四百三十八:const声明

3.3.3 const声明
const 的行为与 let 基本相同,唯一一个重要的区别是用它声明变量时必须同时初始化变量,且 尝试修改 const 声明的变量会导致运行时错误。
const age = 26;
age = 36; // TypeError: 给常量赋值
注意 不能使用let进行条件式声明是件好事,因为条件声明是一种反模式,它让程序变 得更难理解。如果你发现自己在使用这个模式,那一定有更好的替代方式。
1
2
3
const person = {}; 4 person.name = ‘Matt’; // ok
JavaScript 引擎会为 for 循环中的 let 声明分别创建独立的变量实例,虽然 const 变量跟 let 变 量很相似,但是不能用 const 来声明迭代变量(因为迭代变量会自增): 5
for (const i = 0; i < 10; ++i) {} // TypeError:给常量赋值
不过,如果你只想用 const 声明一个不会被修改的 for 循环变量,那也是可以的。也就是说,每 次迭代只是创建一个新变量。这对 for-of 和 for-in 循环特别有意义:
let i = 0;
for (const j = 7; i < 5; ++i) {
console.log(j);
}
// 7, 7, 7, 7, 7
for (const key in {a: 1, b: 2}) {
console.log(key);
}
// a, b
for (const value of [1,2,3,4,5]) {
console.log(value);
}
// 1, 2, 3, 4, 5
3.3.4 声明风格及最佳实践
const 声明的限制只适用于它指向的变量的引用。换句话说,如果 const 变量引用的是一个对象, 那么修改这个对象内部的属性并不违反 const 的限制。
3.3 变量
29
// const 也不允许重复声明
const name = ‘Matt’;
const name = ‘Nicholas’; // SyntaxError
// const 声明的作用域也是块 const name = ‘Matt’;
if (true) {
const name = ‘Nicholas’;
}
console.log(name); // Matt
6 7 8 9 10
ECMAScript 6 增加 let 和 const 从客观上为这门语言更精确地声明作用域和语义提供了更好的支 11 持。行为怪异的 var 所造成的各种问题,已经让 JavaScript 社区为之苦恼了很多年。随着这两个新关键
字的出现,新的有助于提升代码质量的最佳实践也逐渐显现。

  1. 不使用 var
    12
    13
    14
    有了 let 和 const,大多数开发者会发现自己不再需要 var 了。限制自己只使用 let 和 const 有助于提升代码质量,因为变量有了明确的作用域、声明位置,以及不变的值。
  2. const 优先,let 次之
    使用 const 声明可以让浏览器运行时强制保持变量不变,也可以让静态代码分析工具提前发现不 合法的赋值操作。因此,很多开发者认为应该优先使用 const 来声明变量,只在提前知道未来会有修

30 第3章 语言基础
改时,再使用 let。这样可以让开发者更有信心地推断某些变量的值永远不会变,同时也能迅速发现因
意外赋值导致的非预期行为。
3.4 数据类型
ECMAScript 有 6 种简单数据类型(也称为原始类型):Undefined、Null、Boolean、Number、 String 和 Symbol。Symbol(符号)是 ECMAScript 6 新增的。还有一种复杂数据类型叫 Object(对 象)。Object 是一种无序名值对的集合。因为在 ECMAScript 中不能定义自己的数据类型,所有值都可 以用上述 7 种数据类型之一来表示。只有 7 种数据类型似乎不足以表示全部数据。但 ECMAScript 的数 据类型很灵活,一种数据类型可以当作多种数据类型来使用。
3.4.1 typeof操作符
因为 ECMAScript 的类型系统是松散的,所以需要一种手段来确定任意变量的数据类型。typeof 操作符就是为此而生的。对一个值使用 typeof 操作符会返回下列字符串之一:
 "undefined"表示值未定义;
 "boolean"表示值为布尔值;
 "string"表示值为字符串;
 "number"表示值为数值;
 "object"表示值为对象(而不是函数)或 null;  "function"表示值为函数;
 “symbol"表示值为符号。
下面是使用 typeof 操作符的例子:
let message = “some string”;
console.log(typeof message);
console.log(typeof(message));
console.log(typeof 95);
// “string”
// “string”
// “number”
在这个例子中,我们把一个变量(message)和一个数值字面量传给了 typeof 操作符。注意,因 为 typeof 是一个操作符而不是函数,所以不需要参数(但可以使用参数)。
注意 typeof 在某些情况下返回的结果可能会让人费解,但技术上讲还是正确的。比如,调用 typeof null 返回的是"object”。这是因为特殊值 null 被认为是一个对空对象的引用。
3.4.2 Undefined类型
Undefined 类型只有一个值,就是特殊值 undefined。当使用 var 或 let 声明了变量但没有初始 化时,就相当于给变量赋予了 undefined 值:
let message;
console.log(message == undefined); // true
注意 严格来讲,函数在ECMAScript中被认为是对象,并不代表一种数据类型。可是, 函数也有自己特殊的属性。为此,就有必要通过 typeof 操作符来区分函数和其他对象。

3.4 数据类型 31
在这个例子中,变量 message 在声明的时候并未初始化。而在比较它和 undefined 的字面值时, 1 两者是相等的。这个例子等同于如下示例:
let message = undefined;
console.log(message == undefined); // true
这里,变量 message 显式地以 undefined 来初始化。但这是不必要的,因为默认情况下,任何未
2
3
4
5
6
经初始化的变量都会取得 undefined 值。
注意,包含 undefined 值的变量跟未定义变量是有区别的。请看下面的例子: let message; // 这个变量被声明了,只是值为undefined
// 确保没有声明过这个变量 // let age
console.log(message); // “undefined” console.log(age); // 报错
注意 一般来说,永远不用显式地给某个变量设置 undefined 值。字面值 undefined 主要用于比较,而且在 ECMA-262 第 3 版之前是不存在的。增加这个特殊值的目的就是为 了正式明确空对象指针(null)和未初始化变量的区别。
在上面的例子中,第一个 console.log 会指出变量 message 的值,即"undefined"。而第二个 console.log 要输出一个未声明的变量 age 的值,因此会导致报错。对未声明的变量,只能执行一个 有用的操作,就是对它调用 typeof。(对未声明的变量调用 delete 也不会报错,但这个操作没什么用, 实际上在严格模式下会抛出错误。) 8
在对未初始化的变量调用 typeof 时,返回的结果是"undefined",但对未声明的变量调用它时, 返回的结果还是"undefined",这就有点让人看不懂了。比如下面的例子:
let message; // 这个变量被声明了,只是值为undefined // 确保没有声明过这个变量
// let age
console.log(typeof message); // “undefined”
console.log(typeof age); // “undefined”
7
9 10
11
12
13
14
无论是声明还是未声明,typeof 返回的都是字符串"undefined"。逻辑上讲这是对的,因为虽然 严格来讲这两个变量存在根本性差异,但它们都无法执行实际操作。
注意 即使未初始化的变量会被自动赋予undefined值,但我们仍然建议在声明变量的 同时进行初始化。这样,当 typeof 返回"undefined"时,你就会知道那是因为给定的变 量尚未声明,而不是声明了但未初始化。
undefined 是一个假值。因此,如果需要,可以用更简洁的方式检测它。不过要记住,也有很多 其他可能的值同样是假值。所以一定要明确自己想检测的就是 undefined 这个字面值,而不仅仅是 假值

32 第3章 语言基础
let message; // 这个变量被声明了,只是值为undefined
// age 没有声明
if (message) { // 这个块不会执行
}
if (!message) { // 这个块会执行
}
if (age) {
// 这里会报错
}

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值