js红宝书拾遗(一):基础知识篇

440 阅读3分钟

这是我参与新手入门的第2篇文章。

前言

去年年底买了最新一版的js红宝书,拖延症一直没怎么看。借助此次参与掘金活动写文章的机会,开始边看边记一些读书笔记。

作为一个半路出家的码农,当年看第三版时很多地方是懵懵的,如今再看此书,很多知识点都变得清晰了,故记录一下以前没有注意到的有趣知识点,以及新版新增加的一些重要知识点,同时记录一些有趣的代码执行结果。

第一、二章

第一、二章主要是一些介绍性的内容。包括JavaScript的历史,功能介绍,<script>标签的使用方法等,了解即可。

第三章(语言基础)

这一章还是一些基础知识。值得注意的是关于ES6的一些新增知识。

变量

  • letconst声明基本相同,块级作用域、暂时性死区(temporal dead zone)、不可重复声明同一变量名、必须先声明再调用
  • const声明变量的同时必须初始化变量,且不可再修改该变量(可修改对象属性,但不可修改其引用)
  • 原则上不再使用var声明变量。优先使用const,其次是let

数据类型

  • 使用模板字面量语法,将表达式转换为字符串时会调用 toString():
    let foo = {toString: () => "World"};
    console.log(`Hello, ${ foo }!`) // Hello World!
    
    上述模板字面量在转换为字符串时,调用了对象footoString方法,返回了"World"

操作符

  • 递增/递减操作符

无论使用前缀递增还是前缀递减操作符,变量的值都会在语句被求值之前改变;后缀版递增和递减在语句被求值之后才发生。如下代码:

let num1 = 2;
let num2 = 20;
//前缀版
let num3 = --num1 + num2;
let num4 = num1 + num2;
console.log(num3); //21
console.log(num4); //21
//后缀版
let num3 = num1-- + num2;
let num4 = num1 + num2;
console.log(num3); //22
console.log(num4); //21

后缀版的情况可能比较不容易理解。如前文所述,计算num3时,尚未对num1执行后缀版递减,故其仍为2,求得num3是22;之后对num1执行递减,变为1,再计算num4,就变成了1 + 20 = 21

  • 逻辑与操作符为短路操作符,故下列代码不会报错:
let found = false;
let result = (found && abc); //abc为未声明的变量名
console.log(result); // false;

如果第一个操作数决定了结果,那么永远不会对第二个操作数求值。

  • 逻辑或操作符也是短路操作符,与上述行为类似

  • 指数操作符 **

console.log(3 ** 2); //9
console.log(16 ** 0.5); //4
let num1 = 3;
num1 **= 2;
console.log(num1); //9
  • 任何关系操作符在涉及比较NaN时,都返回false,会有如下有趣现象:
let res1 = NaN < 3; //false
let res2 = NaN >=3; //false
  • 等于操作符会有下列情况:
true == 1; //true
true == 2; //false

建议任何时候都使用全等===和不全等!==

语句

  • 标签语句,语法如下:
// label: statement

start: for(let i = 0; i < count; i++){
    console.log(i);
}

标签语句的典型应用场景是嵌套循环,通过breakcontinue语句引用。

后记

本文主要是关于JavaScript基础知识相关的一些知识点拾遗。记录了一些平时没注意到过的内容,以及一些可能没什么用,但挺有趣的代码片段,内容比较零碎。本来打算继续写第四章的,但快到截稿时间了但第四章内容更重要些,值得单独开一篇仔细理一理。这篇有些凌乱的读书笔记,就先到此为止了。