《JavaScript高级程序设计》(第4版)阅读笔记(六)

这一篇博客继续分享高程4第三章的内容。第三章内容有点丰富哈。

我稍微说明一下,标红的地方是我认为特别重点,标蓝的地方我认为也很重要,标绿的是补充说明,要么是举例,要么是分享个人的见解。以下内容不一定是原文摘录,也不会把原文里所有的代码都搬过来,我觉得太简单的就不搬运了。

3.3.3 const 声明


const 的行为与 let 基本相同,唯一一个重要的区别是用它声明变量时必须同时初始化变量,且尝试修改 const 声明的变量会导致运行时错误
 

const age = 26;
age = 36; // TypeError: 给常量赋值
// const也不允许重复声明
const name = 'Matt';
const name = 'Nicholas'; // SyntaxError
// const声明的作用域也是块
const name = 'Matt';
if (true) {
const name = 'Nicholas';
}
console.log(name); // Matt

const 声明的限制只适用于它指向的变量的引用。换句话说,如果 const 变量引用的是一个对象,那么修改这个对象内部的属性并不违反 const 的限制。


使JavaScript引擎会为 for 循环中的 let 声明分别创建独立的变量实例,而且 const 变量跟 let 变量很相似,也不能用 const来声明迭代变量(因为迭代变量会自增)

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 声明风格及最佳实践

 

ECMAScript 6增加 let 和 const 从客观上为这门语言更精确地声明作用域和语义提供了更好的支持。随着这两个新关键字的出现,新的有助于提升代码质量的最佳实践也逐渐显现。
 

1. 不使用 var
 

限制自己只使用 let 和 const 有助于提升代码质量,因为变量有了明确的作用域、声明位置,以及不变的值。

 

2. const 优先, let 次之

 

使用 const 声明可以让浏览器运行时强制保持变量不变,也可以让静态代码分析工具提前发现不合法的赋值操作。因此,很多开发者认为应该优先使用 const 来声明变量,只在提前知道未来会有修改时,再使用 let 。

 

这样可以让开发者更有信心地推断某些变量的值永远不会变,同时也能迅速发现因意外赋值导致的非预期行为。

 

3.4 数据类型
 

ECMAScript有6种简单数据类型(也称为原始类型,或者叫值类型)Undefined 、 Null 、 Boolean 、 Number 、 String 和SymbolSymbol (符号)是ECMAScript 6新增的。还有一种复杂数据类型(或者叫引用类型)叫 Object (对象)。 Object 是一种无序名值对的集合。

虽然总共只有7种类型(因为不能定义自己的数据类型),但ECMAScript的数据类型很灵活,一种数据类型可以当作多种数据类型来使用。

 

3.4.1 typeof 操作符

 

ECMAScript的类型系统是松散的,可以用typeof操作符来确定任意变量的数据类型。对一个值使用 typeof 操作符会返回下列字符串之一:

"undefined" 表示值未定义;
"boolean" 表示值为布尔值;
"string" 表示值为字符串;
"number" 表示值为数值;
"object" 表示值为对象(而不是函数)或 null ;
"function" 表示值为函数;
"symbol" 表示值为符号。

(注意函数和数组也是对象,但是函数是“可执行的对象”,所以结果是"function"而不是“object”,数组的结果就是平平无奇的“object”)

注意,因为 typeof 是一个操作符而不是函数,所以不需要参数(但可以使用参数)。

注意 typeof 在某些情况下返回的结果可能会让人费解,但技术上讲还是正确的。比如,调用 typeof null 返回的是 "object" 。这是因为特殊值 null 被认为是一个对空对象的引
用。(在另一本书《你不知道的JavaScript》(中)介绍过,typeof判断类型的结果原本是8位二进制的数,如果后4位是0,则结果是“object”,null的结果是“8位全是0”,所以后4位是0,所以返回“object”)
 

3.4.2 Undefined 类型
 

Undefined 类型只有一个值,就是特殊值 undefined 。当使用 var 或 let 声明了变量但没有初始化时,就相当于给变量赋予了 undefined 值

注意 一般来说,永远不用显式地给某个变量设置 undefined值。字面值 undefined 主要用于比较,而且在ECMA-262第3版之前是不存在的。增加这个特殊值的目的就是为了正式明确空对象指针( null )和未初始化变量的区别。

注意,包含 undefined 值的变量跟未定义变量是有区别的
 

let message; // 这个变量被声明了,只是值为
undefined
// 确保没有声明过这个变量
// let age
console.log(message); // "undefined"
console.log(age); // 报错

使用没声明过的变量会报错,而使用声明过但没有初始化过的变量不会报错,只是值为undefined。(对未声明的变量,只能执行一个有用的操作,就是对它调用 typeof 。)

在对未初始化的变量调用 typeof 时,返回的结果是 "undefined" ,但对未声明的变量调用它时,返回的结果还是 "undefined" 这就有点让人看不懂了。
 

let message; // 这个变量被声明了,只是值为undefined// make sure this variable isn't declared
// let age
console.log(typeof message); // "undefined"
console.log(typeof age); // "undefined"

无论是声明还是未声明, typeof 返回的都是字符串 "undefined" 。逻辑上讲这是对的,因为虽然严格来讲这两个变量存在根本性差异,但它对任何一个变量都不可能执行什么真正的操
作。

注意 即使未初始化的变量会被自动赋予 undefined 值,但我们仍然建议在声明变量的同时进行初始化。这样,当 typeof 返回 "undefined" 时,你就会知道那是因为给定的变量尚未声明,而不是声明了但未初始化。

 undefined 是一个假值。因此,如果需要,可以用更简洁的方式检测它。不过要记住,也有很多其他可能的值同样是假值。所以在检测的时候要确定自己是在检验是否为假值还是是否为undefined

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值