学的主要版本ES6 兼容以前
取其精华,去其糟粕
注重“主领域”:前端,而不是“主语言”
JS使用最广 门槛极低 生产力
基本语法
表达式与语句
表达式
1 + 2
表达式的值为3
add(1,2)
表达式的值为函数的返回值console.log
表达式的值为函数本身(函数没加括号)console.log(3)
表达式的值为多少?- 值和返回值不同,只有函数有返回值,严谨,函数的值就是返回值
console.log()
返回一个undefined
,可以在控制台查看
语句
var a = 1
是一个语句,声名语句- 声名语句的值是
undefined
两者的区别
- 表达式一般都有值,语句可能有或没有
- 语句一般会改变环境(声明、赋值)
- 并不绝对
大小写敏感
- 变量名等
var a
和var A
object
和Object
function
和Function
- 都是不一样的
- 控制台打
window
得Window{...}
,有毛病,不一样
空格
大部分空格没有实际意义
var a = 1
和var a=1
没差,只要不影响断句- 加回车大部分时候也不影响
- 只有一个地方不能加回车,就是
return
后面
控制台
|
|
标识符
命名规则
- 第一个字符,可以是
Unicode
字母或$
(dollar),或_
(underscore),或中文
变量名是标识符
var _ = 1
var $ = 8
var ______ = 6
var 你好 = 'hi'
控制台打
var 9$ = 1
时,报错Uncaught SyntaxError: Invalid or unexpected token
其他标识符遇到再说
注释
多写注释——才怪
注释的分类
不好的注释
- 代码翻译成中文
- 过时的注释
- 发泄,职业素养
好的注释
- 踩坑注解
- 为什么代码会写得这么奇怪,遇到什么bug
“信噪比”要高,有意义的注释
区块block
- 将代码包在一起
|
|
- 常与
if/for/while
合用
if
语句
语法
if(表达式){语句1}else{语句2}
{}
在语句只有一句的时候可以省略,打你
变态情况
表达式里的变态,a=1
- 表达式必须有个值,
=
是赋值为,赋值运算符 ==
垃圾,直接用===
,比较运算符
技巧,来自C:表达式里,常量写在左值处,判断,写错直接会报错
|
|
webStorm
会提示,VSCode
不堪大用
webStorm
教你写代码,规范代码,节省时间
语句1和语句2里的变态,嵌套的if else
else if
实际上是两对if else
判断,省略花括号,逻辑符合形式,形成分支语句
缩进的变态
|
|
没有花括号,if 只管到之后最近的第一句语句
上面的代码相当于
|
|
再看这句
|
|
,
运算符,表示语句没完,console.log('a'),console.log('a等于2')
变成一句语句
再看这句
|
|
;
运算符,表示语句完了
使用最没歧义的写法,最大公约数,程序员第二戒律
第一戒律是不能相信人类,特别是自己,要相信
console.log()
,墨菲定律前端的戒律是 图片不能变形,和没有设计稿不写代码
- 推荐的写法
|
|
- 次推荐写法
|
|
有
return
语句,else
可以省,因为return
返回了返回值后面的语句都不执行,不需要else
,分支语句在函数中的写法
switch
语句
if else
升级版,但不推荐,易用错
switch
语法
|
|
break
- 大部分时候,省略
break
你就完了 - 少部分时候,可以利用
break
- 不打
break
,case
会“贯穿”到下一个case
,表示同时满足上下条件,不常用,一般要求一一对应
|
|
js烂设计,对比
Swift switch case
能不写
if
就不写:三元表达式、短路运算符
问号冒号表达式,即三元运算符
表达式1 ? 表达式2 : 表达式3
简化
if else
里只有一句语句时
return a>b ? a: b
return n>0 ? n: -n
&&
短路逻辑
A && B && C && D
取第一个假值(后面都不看了)或者D
- 并不会取
true/false
控制台
|
|
报错,
fi
未声明是不能用的
|
|
&&
且运算
真值表
B | B | ||
---|---|---|---|
&& | 真 | 假 | |
A | 真 | B | B |
A | 假 | A | A |
结果栏,表示以
A/B
作为表达式的值
- 都为真,直接用
B
作为表达式的值 A
假,B
真,用A
作为表达式的值A
真,B
假,用B
作为表达式的值A
假,B
假,用A
作为表达式的值
第一个
A
表达式为真,执行并且返回第二个表达式的值第一个
A
表达式为假,不计算下去了,直接返回第一个表达式的值
&&
:‘假’短路
|
|
A && B && C && D
取第一个出现的假值或者D
- 不同于
&
或|
,并不会取true/false
,而是执行表达式,并取表达式的值
||
短路逻辑
A || B || C || D
取第一个真值或者D
- 并不会取
true/false
|
|
||
且运算
真值表
B | B | ||
---|---|---|---|
|| | 真 | 假 | |
A | 真 | A | A |
A | 假 | B | B |
结果栏,表示以
A/B
作为表达式的值
- 都为真,直接用
A
作为表达式的值 A
假,B
真,用B
作为表达式的值A
真,B
假,用A
作为表达式的值A
假,B
假,用B
作为表达式的值
第一个
A
表达式为真,不计算下去了,直接返回第一个表达式的值第一个
A
表达式为假,执行并且返回第二个表达式的值
|
|
A || B || C || D
取第一个真值(后面都不看了)或者D
- “遇真则止”、“遇假才算”
||
:‘真’短路
条件语句小结
if...else..
代码简短时基本不用switch
不要少break
A?B:C
A&&B
fn && fn()
只有fn
存在才调用A||B
A = A||B
while
和for
循环语句
while
语法
while(表达式){语句}
- 判断表达式的真假
- 表达式为真,执行
{}
里的语句,执行完后,再次判断表达式的真假 - 表达式为假,直接跳过花括号,执行后面的语句
|
|
死循环
|
|
其他
do...while
用得少,可跳过,能看懂就行
for
循环
语法糖
|
|
for
是while
循环的方便写法
语法
|
|
1st: 1->2->4->3
nth: 2->4->3->…->LoopOut
1->2->LoopOut
- 先执行且只执行一遍
1初始化语句
- 然后判断
2判断表达式
2判断表达式
为真,执行4循环体
,然后执行3自增语句
2判断表达式
为假,直接退出4循环体
体,执行后面的语句
变态情况1
|
|
变态情况2
|
|
原因
|
|
执行完,跳出循环,
i
的值为5
,setTimeout
指过一会再执行里面的函数,过一会,i
的值还是5
,过多长,等到执行完for
循环,再打印,此时i
的值为5
,即打印五次5
|
|
因为
a
的值可能会变,即不确定,a
的值在定义函数时,不确定,在执行函数时确定即如果不确定函数是什么时候执行的,就不能确定
a
的值是多少,a
的值可能会随着后面的代码运行而改变即不确定
fn()
的调用时间,就不能确定a
的值
|
|
会打印
5
,setTimeout(fn)
表示过一段时间执行
|
|
会打印
5
,setTimeout(fn)
表示过一段时间执行
|
|
for
循环是当前任务,先执行完规定的循环次数后,再执行setTimeout
* setTimeout
执行机制队列之后再讲
将
var
改成let
,满足直觉的幻想
|
|
其他变态情况
|
|
判断语句一定要起效,自增长一定要写,没有就会死循环
break
和continue
退出所有循环 V.S. 退出当前一次循环
- 退出所有循环
|
|
- 跳过,即退出当前一次循环,继续自增长语句,直到判断语句跳出循环
|
|
continue
在其他语言中是next
,即下一个的意思,更符合原意
- 两层循环
|
|
break
只会退出当前外层的for
循环
label
语句
用的很少,面试概率5%
label
语法
|
|
合法标识符A是一个标签,表示
:
后面的代码块
|
|
面试
|
|
上面的是什么,注意
Chrome
、safari
和firefox
控制台打出的不一致,Chrome
做了优化加了
;
,不是对象,测试下面
|
|
下面这样才是对象
|
|
回答:是一个
label
语句,语句就是1
,完了
参考文章
相关文章
- 无
- 作者: Joel
- 文章链接:
- 版权声明
- 非自由转载-非商用-非衍生-保持署名
- 河 掘 思 知 简