• JavaScript权威指南第七版 第二章笔记:词法结构


    一、JavaScript 程序的文本

    1、JavaScript 区分大小写。
    2、JavaScript 忽略程序记号 (token) 之间的空格。
    3、JavaScript 将换行符、回车符和回车/换行序列识别为行终止符。
    4、注释 // 或者 /* *//* */可以换行,不能嵌套

    二、标识符和保留字

    1、标识符就是一个名字。用于命名常量、变量、属性、函数和类,以及为某些循环提供标记。
    JavaScript标识符必须以字母、下划线(_)或美元符号($)开头。后续字符可以是字母、数字、下划线或美元符号等(数字不能作为第一个字符,以便JavaScript 区分标识符和数值)。考虑到可移植性和易于编辑,建议在标识符中只使用 ASCII 字母和数字。
    2、保留字是JavaScript一部分。建议不要使用任何保留字作为标识符名称
    ①很多(如if、while和for)绝对不能用作常量、变量、函数或类的名字(但可以在对象中用作属性的名字)。
    ②另外一些(如from、of、get和 set)只能在少数完全没有语法歧义的情况下使用,是完全合法的标识符。
    ③还有一些关键字(如let)不能完全保留,因为要保持与旧程序向后兼容,为此有复杂的规则约束它们什么时候可以用作标识符,什么时候不可以(例如,在类外部通过var声明的变量可以用let作为变量名,但在类内部或使用const声明时不行)。最简单的做法就是不要使用这些单词作为标识符,但from、set和 target除外,因为使用它们很安全,而且也很常见。

    // 在类外部通过var声明的变量可以用let作为变量名,但在类内部或使用const声明时不行
    var let = 10; // 使用 var 声明全局变量 x  
    console.log(let);  //10;
    // let let = 10;//这种是不能被声明的
    class MyClass {  
      constructor() {  
        var let = 20; // 使用 const或者var声明都不行 
        console.log(let); // 会报错
      }  
    }  
      
    let myInstance = new MyClass(); // Uncaught SyntaxError: Unexpected strict mode reserved word
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    ④由于历史原因,某些情况下也不允许用 arguments和eval 作为标识符,因此最好不要使用。
    以下是javascript一些保留字,在不断发展过程中,可能会有新的保留字产生。
    在这里插入图片描述

    三、Unicode

    Unicode是一种更广泛的字符编码标准,用于表示世界上所有的字符。 它包括ASCII表的所有字符,并且扩展了更多的字符。ASCII表是Unicode的一部分

    JavaScript 程序是使用 Unicode 字符集编写的,因此在字符串和注释中可以使用任意Unicode 字符。考虑到可移植性和易于编辑,建议在标识符中只使用 ASCII字母和数字,但这只是一个编程惯例,语言本身支持在标识符中使用 Unicode 字母、数字和象形文字(但不支持表情符号)。这意味着常量或变量的名字中可以包含数学符号或非英语文字:

    const Sí = true ;
    let 笨小孩 = 123; //console.log(笨小孩);输出为123
    
    • 1
    • 2

    1、Unicode 转义序列

    产生背景:有些计算机硬件和软件无法显示,输入,或正确处理全部Unicode字符,为方便程序员编码和支持使用老技术系统,JS定义了转移序列,可以仅使用ASCII字符来表示Unicode字符。

    这些Unicode转义序列以\u开头,后跟4位十六进制数字(包括大小写字母A~F)或包含一堆花括号内的1 ~ 6位十六进制数字。可以用于JS字符串字面量、正则表达式字面量、标识符(不能出现在关键字中,即保留字,例如let等)

    let café = 1; //使用Unicode字符定义一个变量
    caf\u00e9 // => 1; 相同转义序列访问这个变量
    caf\u{E9} // =>1; 相同转义序列的另一种形式,ES6新增,为了更好地支持大于16位的Unicode码点,如表情符号。早起版本只支持4位数字转移序列。
    console.log("\u{1F600}");//打印表情符号😀 ,注释中的转移序列不会被解释为Unicode,因为被忽略。
    
    • 1
    • 2
    • 3
    • 4

    2、Unicode归一化

    ==在代码中,同一个字符,或者外表一样,可能Unicode编码不一致而导致程序不是预想结果或报错。==另外不同编辑器粘贴复制过来的代码,可能也会保存不一样,例如nodepad++中有不同的编码格式,Windows自带的text文本,粘贴过来的空格可能不一样等等。

    const café=1; //这个常量名为"caf\u{e9}"
    const café=2; //这个常量不同:"cafe\u{301}"
    café // => 1:这个常量有一个值
    café // => 2:这个不同的常量有一个不同的值
    
    • 1
    • 2
    • 3
    • 4

    四、可选的分号

    建议使用分号明确标识语句结束,即便这些分号并非必需,以增加代码可读性。下边解释原因↓:
    在JavaScript 中,如果两条语句分别写在两行,通常可以省略它们之间的分号。
    在程序末尾,如果接下来的记号是右花括号},那么也可以省略分号。

    JavaScript 并非任何时候都把换行符当作分号,而只是在不隐式添加分号就无法解析代码的情况下才这么做。JavaScript只在下一个非空格字符无法被解释为当前语句的一部分时才把换行符当作分号。

    let a
    a
    4
    3
    console.log(a)
    //JavaScript 将以上代码解释为: let a; a = 3; console.log(a);
    let y =x+f
    (a+b).toString()
    // JS解释为 let y =x+f(a+b).toString(),这可能并不是代码作者真实意图
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    通常,如果语句以(、[、/、+或- 开头,就有可能被解释为之前语句的一部分。有的程序员喜欢在所有这种语句前面都防御性地添加一个分号,这样即使它前面的语句被修改,删掉了之前末尾的分号,也不会影响当前语句:

    let x=0 // 这里省略分号
    ;[x,x+1,x+2].forEach(console.log) // 防御:保证这条语句独立
    
    • 1
    • 2

    JavaScript 在不能把第二行解析为第一行的连续部分时,对换行符的解释有三种例外情况。

    // 1、涉及return、throw、yield、break 和 continue 语句。如果这几个单词后面(任何其他标记前面)有换行符,JavaScript 就会把这个换行符解释为分号。
    return
    true;//JS解释为return;true;,你的真实意图可能是return true;
    // 2、涉及 ++ 和 -- 操作符。这些操作符既可以放在表达式前面,也可以放在表达式后面。如果想把这两个操作符作为后置操作符,那它们必须与自己操作的表达式位于同一行。
    let i = 1;
    i
    ++;
    console.log(i); // js会报错,但如果是++i不会报错
    // 3、涉及使用简洁的“箭头”语法定义的函数:箭头 => 必须跟参数列表在同一行。
    const a = (b)
        =>{console.log(b+1);}
    a(2); //报错
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
  • 相关阅读:
    C#扩展——自定义VS公/私有方法代码片段
    在Spring Boot中使用Redis的发布订阅功能
    微信CRM系统致力于帮助金融保险行业
    LLVIP数据集下载
    [Android开发学iOS系列] iOS项目环境搭建和依赖管理
    使用HTML制作静态网站 中国传统文化 丝绸之路 (学生网页设计作业源码)
    Sql Server 2017主从配置之:发布订阅
    9.3.tensorRT高级(4)封装系列-自动驾驶案例项目self-driving-车道线检测
    linux中的kill 终止进程
    网关、网桥、路由器和交换机之【李逵与李鬼】
  • 原文地址:https://blog.csdn.net/qq_21386275/article/details/134462940