JS语法

277 阅读4分钟

JS版本

历史版本

  • ES 3, IE6支持,总体评价:垃圾
  • ES5,总体评价:还是垃圾
  • ES6,大部分浏览器支挂,总体评价:一半垃圾一半好
  • ES 2019与ES6差别不大 为什么说ES6一半垃圾 因为ES不能删除以前的特性,要兼容旧网站,也就是说以前能运行的网站,以后都要能运行 ,对比Python 3你就能知道兼容的好处:稳定

JS之父对JS的评价:它的优秀之处并非原创,它的原创之处并不优秀。

表达式与语句

表达式

  • 1+2表达式的为3
  • add(1,2)表达式的函数的返回值
  • console.log表达式的函数本身
  • console.log(3)表达式的undefined

语句

var a = 1 是一个语句

二者的区别

  1. 表达式一般都有值,语句可能有也可能没有
  2. 语句一般会改变环境(声明、赋值) 上面两句话并不是绝对的

JS大小写敏感!!

空格

  • 大部分空格没有实际意义
  • var a=1var    a     =    1 没有区别
  • 加回车大部分时候也不影响
  • 只有一个地方不能加回车,那就是return后面,如果return后面加回车,那么js会自动在return后面加上undefined

标识符

规则

第一个字符,可以是Unicode字母或$或_或中文

后面的字符,除了上面所说,还可以有数字

变量名是标识符

注释

//

/**/

写代码要多写注释————并不是!

注释的分类

不好的注释

  • 把代码翻译成中文
  • 过时的注释
  • 发泄不满的注释

好的注释

  • 踩坑注解
  • 为什么代码会写得这么奇怪
  • 遇到什么bug

区块block

把代码包在一起

{
  let a =1 
  let b=2
}

常常与if /for / while合用

if语句

语法

if (表达式){语句1} else {语句2}

{} 在语句只有一句的时候可以省略,但不建议这样做

变态情况

  • 表达式里可以非常变态,如a=1
  • 语句1里可以非常变态,如嵌套的if else
  • 语句2里可以非常变态,如嵌套的if else
  • 缩进也可以很变态,如面试题常常下套
а = 1
if(a === 2)
  console.log('a')
  console.log('a等F2')

上面的写法相当于

а = 1
if(a === 2)
  console.log('a')
console.log('a等F2')

结果:a等F2

程序员戒律:使用最没有歧义的写法

最推荐使用的写法

if (表达式) {
  语句
} else if (表达式) {
  语句
} else {
  语句
}

switch语句

语法

switch (fruit) { 
  case "banana":
    //...
    break;
  case "apple":
    //...
    break;
  default: 
    //...

break

大部分时候,省略break你就完了

少部分时候,可以利用break

问号冒号表达式

表达式1?表达式2:表达式3

&& 短路逻辑

A && B && C && D 取第一个假值或D,并不会取true /false

if(window.f1){
  console.log('f1')
}
// 相当于
window.f1 && console.log('f1')  

|| 短路逻辑

A || B || C || D 取第一个真值或D,并不会取true / false

if(!window.f1){
  console.log('f1')
}
// 相当于
window.f1 || console.log('f1')  

常见用法

a = a || 100
// 相当于
if(a){
  a = a
}else{
  a = 100    // 保底值
}

while语法

while (表达式) {
  语句
}
  • 判断表达式的真假
  • 当表达式为真,执行语句,执行完再判断表达式的真假
  • 当表达式为假,执行后面的语句
  • do..while 用得不多

一个会死循环的例子:

let a = 0.1
while(a !== 1){
  console.log(a)
  a = a + 0.1
}

for循环

while的语法糖

for是while循环的方便写法

方便在哪?

let a = 0.1  // 初始化
while(a !== 1){   // 判断
  console.log(a)  // 循环体
  a = a + 0.1    // 条件
}

while循环需要具备初始化、判断、循环体、条件,否则很容易陷入死循环

语法

for(语句1;表达式2语句3){
  循环体
}

先执行语句1,然后判断表达式2,如果为真,执行循环体,然后执行语句3如果为假,直接退出循环,执行后面的语句

break和continue

退出所有循环V.S.退出当前一次循环

label语句

用的很少

语法

foo: { 
  console.log(1);
  break foo;
  console. log('本行不会输出');
}
console.log(2);

面试

{foo: 1}

foo是个label,语句是1