2024-11-23 日报 Day15

2024-11-23 日报 Day15

Yuyang 前端小白🥬

今日的鸡汤

你有多自律,就有多自由。

今日学习内容

1、JS红皮书P21-29 第三章:语言基础

今日笔记

1、标识符:指变量、函数、属性的名字,或者函数的参数。标识符可以是下列几种:

  • 第一个字符必须是一个字母、下划线(_)或一个美元符号($);
  • 其他字符可以是字母、下划线、美元符号或数字;
    2、注释:单行注释以两个斜杠(//)开头,多行注释以斜杠加星号(/)开头,以星号加斜杠(/)结尾。
    macOS系统中,可以使用 Command + / 快捷键来快速注释代码。
1
2
3
4
5
6
7
8
单行注释:
快捷键:Command+/
//
多行注释:
快捷键:Command+shift+/

/* 12
12 */

3、严格模式: 通过在脚本开头添加”use strict”,可以强制开启 ECMAScript 5 的严格模式。use strict是一个预处理指令,用于指定代码在严格模式下执行。
也可以单独在函数内部开启严格模式。

1
2
3
4
5
"use strict";
function doSomething() {
"use strict";
// 函数体
}

4、关键词和保留字:ECMAScript中有一些关键词和保留字,它们有特殊用途,不能用作标识符。

  • 关键词:break、case、catch、continue、debugger、default、delete、do、else、false、finally、for、function、if、in、instanceof、new、null、return、switch、this、throw、true、try、typeof、var、void、while、with
  • 保留字:abstract、boolean、byte、char、class、const、debugger、double、enum、export、extends、final、float、goto、implements、import、int、interface、long、native、package、private、protected、public、short、static、super、synchronized、throws、transient、volatile
    5、变量:ECMAScript 的变量是松散类型的,可以用来保存任何类型的数据。有三种方式声明变量:var、let、const。
  • var:
  • 声明作用域:函数作用域
  • 变量提升:变量声明会被提升到函数作用域的顶部
    1
    2
    3
    4
    5
    6
    function foo() {
    console.log(age); // undefined
    var age = 26;
    console.log(age); // 26
    }
    foo();
  • let:
  • 声明作用域:块作用域
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    if (true) {
    var name = 'Matt';
    console.log(name); // Matt
    }
    console.log(name); // Matt

    if (true) {
    let age = 26;
    }
    console.log(age); // ReferenceError: age is not defined

  • 变量提升:不存在变量提升
    1
    2
    3
    4
    5
    6
    function foo() {
    console.log(age); // ReferenceError: Cannot access 'age' before initialization
    let age = 26;
    console.log(age); // 26
    }
    foo();
  • let的暂时性死区:在块作用域内,使用 let 声明的变量不会被提升,而且在声明之前使用这个变量会抛出错误。
    1
    2
    3
    4
    5
    6
    // 暂时性死区
    if (true) {
    console.log(name); // ReferenceError: Cannot access 'name' before initialization
    let
    name = 'Matt';
    }
  • 全局声明:使用let声明的全局变量不会成为window对象的属性。
    1
    2
    3
    4
    let name = 'Matt';
    console.log(window.name); // undefined
    var age = 26;
    console.log(window.age); // 26
  • 条件声明:使用let声明的变量只在块作用域内有效。
    1
    2
    3
    4
    if (true) {
    let name = 'Matt';
    }
    console.log(name); // ReferenceError: name is not defined
  • for循环中的let声明:
    在let出现之前,for循环定义的迭代变量会渗透到循环体外部。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    for(var i = 0; i < 5;++i){

    }
    console.log(i); // 5

    for(let i = 0; i < 5;++i){

    }
    console.log(i); // ReferenceError: i is not defined

    for(var i = 0; i < 5;++i){
    setTimeout(() => {
    console.log(i); // 5 5 5 5 5
    }, 0);
    }

    for(let i = 0; i < 5;++i){
    setTimeout(() => {
    console.log(i); // 0 1 2 3 4
    }, 0);
    }
  • const:声明一个只读的常量。一旦声明,常量的值就不能改变。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    const PI = 3.1415926;
    PI = 3; // TypeError: Assignment to constant variable.
    // const也不允许重复声明
    const name = 'Matt';
    name = 'Nicholas'; // TypeError: Assignment to constant variable.
    // const声明的作用域也是块
    const name = 'Matt';
    if (true) {
    const name = 'Nicholas';
    }
    console.log(name); // Matt
    const 声明的限制只适用于它指向的变量的引用,而不适用于它指向的变量的值。
const person = {};
person.name = 'Matt';
console.log(person.name); // Matt
此页目录
2024-11-23 日报 Day15