语法结构
yuhuo2021-05-19JavaScriptJavaScript基础
词法规则
区分大小写(HTML不区分大小写)
注释:
// 单行注释
/* 多行注释 */
直接量:
12
,true
,null
,"你好"
,{key: 1}
特殊直接量:
null
,undefined
标识符:字母,下划线_,美元符$,数字组成( 数字不开头)
保留字:程序的关键字,不能用做标识符
分号可选:当前行和下一行无法合并解析,则当前行自动补填分号
(1)以
( [ / + -
开头,很有可能与前一行合并解析(2)
return
,break
,continue
和随后的表达式不能换行,否则直接加分号(3)
++
,--
作为后缀运算符不能换行,否则直接加分号
类型隐式转换
优先级
- 连接运算:字符串 > *
- 数学运算:数字 > *
- 逻辑运算:数字 > 布尔值 > 字符串 > 对象
// 连接运算,转 "2" + "1"
"2" + 1
// 数学运算,转 2 - 1
"2" - 1
// 逻辑运算,转 false == true
"" == true
// 逻辑运算,转 1 == 1
1 == true
转换表
值 | 转字符串 | 转数字 | 转布尔值 |
---|---|---|---|
undefined | "undefined" | NaN | false |
null | "null" | 0 | false |
true | "true" | 1 | |
false | "false" | 0 | |
"" | 0 | false | |
"1.2" | 1.2 | true | |
"one" | NaN | true | |
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 | 传入表达式,返回 undefined | void(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的作用:将作用域设置到一个指定对象中)