语法结构

yuhuo2021-05-19JavaScriptJavaScript基础

词法规则

  • 区分大小写(HTML不区分大小写)

  • 注释: // 单行注释 /* 多行注释 */

  • 直接量:12truenull"你好"{key: 1}

  • 特殊直接量:nullundefined

  • 标识符:字母,下划线_,美元符$,数字组成( 数字不开头)

  • 保留字:程序的关键字,不能用做标识符

  • 分号可选:当前行和下一行无法合并解析,则当前行自动补填分号

    (1)以 ( [ / + - 开头,很有可能与前一行合并解析

    (2)returnbreakcontinue和随后的表达式不能换行,否则直接加分号

    (3)++-- 作为后缀运算符不能换行,否则直接加分号

类型隐式转换

优先级

  • 连接运算:字符串 > *
  • 数学运算:数字 > *
  • 逻辑运算:数字 > 布尔值 > 字符串 > 对象
// 连接运算,转 "2" + "1"
"2" + 1
// 数学运算,转 2 - 1
"2" - 1
// 逻辑运算,转 false == true
"" == true
// 逻辑运算,转 1 == 1
1 == true

转换表

转字符串转数字转布尔值
undefined"undefined"NaNfalse
null"null"0false
true"true"1
false"false"0
""0false
"1.2"1.2true
"one"NaNtrue
1.2"1.2"true
1"1"true
0/-0"0"false
NaN"NaN"false
Infinity"Infinity"true
-Infinity"-Infinity"true

注意

undefined 和 null 在与其他类型(数字,布尔值,字符串,对象)做逻辑运算的时候是不会隐形转换的,只有其单独或者相互的时候隐形转换,如下:

  • if(undefined)if(false)
  • if(null)if(false)
  • if(undefined == null)if(false == false)

运算

运算符

运算符作用示例
++,--前/后增量,前/后减量a++,--a
+,-连字符串,求反“a” + 1,-1
+,-,*,/,%加,减,乘,除,取余1 + 2 * 3 / 4 % 5
**指数(a的b次方)a**b
~,&,|,^位操作:取反,与,或,异或~a,a&b
<<,>>,>>>位操作:左移,有符号右移,无符号右移a >> 2
<,<=,>,>=小于,小于等于,大于,大于等于a > 2
==,===,!==,!===等于,恒等于,不等于,恒不等于a == 2
&&,||,!逻辑操作:与,或,非true && true
=,+=,**=,&=,<<=赋值,运算+赋值a += 1
...三点运算符

三点运算符

// 赋值端,作为剩余运算符,可以收拢对象
// 数组 ← 数组
let [a, ...b] = [1, 2, 3]; 
// 数组 ← 字符串
let [a, ...b] = 'hello';
// 对象 ← 对象
let {a, ...b} = { a: 1, b: 2, c: 3 };
// 数组 ← 实参
let f = function(a, ...b) { }
f(1, 2, 3);

// 运算端,作为拓展运算符,可以分散对象
// 对象 → 对象
let a = {name: "张三", age: 15};
let b = {...a, sex : "男"};

// 数组 → 数组,字符串 → 数组
var a = [1, 2, 3];
var b = "hello";
var c = [...a, 4, ...b];

// 数组 → 实参
let f = function(a, b, c) { }
let list = [1, 2, 3];
f(...list);

解构

// 解构数组
let [a, , c] = [1, 2, 3, 4];

// 解构字符串
let [a, b, c, d, e] = 'hello';

// 解构对象
let {a, b} = { a: 1, b: 2, c: 3 };
// 起别名
let {a: aa, b: bb} = { a: 1, b: 2, c: 3 };

// 方法传参结构
function fun({ a, b }) { }
fun({ a: 1, b: 2 });

关键字

关键字作用示例
delete删除属性delete obj.key
delete list[index]
in判断属性是否存在"key" in obj
index in list
typeof获取类型(可使用括号)typeof 1 → "number"
typeof("1") → "string"
typeof true → "boolean"
typeof undefined → "undefined"
typeof null→ "object"
typeof Math → "object"
typeof Date → "function"
instanceof判断对象的父类date instanceof Date → true/false
void传入表达式,返回 undefinedvoid(1)void 1

语句

声明语句

  • var
    • 变量声明
    • 函数作用域,会声明提升,重复声明合法
    • 全局作用域下声明会成为 window 对象的属性
  • let
    • 变量声明
    • 代码块作用域,不会声明提升,不能重复声明
    • 不会成为 window 对象的属性
  • function
    • 函数变量声明
    • 特点同 var,但声明和赋值都提升
  • const
    • 常量声明
    • 特点同 let,声明时必须初始化

条件语句

  • if...else
  • switch

循环语句

  • while
  • do...while
  • for(条件遍历)
  • for...of(迭代器遍历,用法参见 IterableIterator 接口
  • for...in(可枚举属性名遍历)

其他语句

  • continue
  • break
  • return
  • throw
  • try...catch...finally
  • debugger
  • "use strict" 严格模式(必须定义在脚本或函数体的开始,否则会被当成普通字符串)
    • 函数不能有同名参数
    • 变量必须先声明后使用
    • 禁止 this 指向全局对象(原本是 window,变成 undefined)
    • 不能使用 with 语句(with的作用:将作用域设置到一个指定对象中)
Last Updated 2024/3/14 09:51:53