JS 基本语法

209 阅读5分钟

什么是表达式和语句

表达式

指一个为了得到值的计算式

1+2 表达式的值为 3

add(1,2)表达式的值为函数的返回值 (注意只有函数才有返回值)

console.log 表达式的值为函数本身

console.log(3)表达式的值为多少?(值为undefined)

语句

语句是为了完成某种任务而进行的操作,比如下面就是一行赋值语句。

var a = 1

区别

语句和表达式的区别在于,

  1. 语句主要为了进行某种操作(语句一般会改变当前环境(声明、赋值)), 一般情况下不需要返回值;表达式则是为了得到返回值,一定会返回一个值。凡是 JavaScript 语言中预期为值的地方,都可以使用表达式。

  2. 表达式一般有值,语句可能有值,也可能没有

大小写敏感,不要写错

var a 和 var A 是不同的

object 和 Object 是不同的

function 和 Function 是不同的

具体含义后面会学习

关于空格和回车

只要不影响断句,大部分空格没有实际意义

var a = 1 和 var a=1 没有区别

加回车大部分时候也不影响

只有一个地方不能加回车,那就是 return 后面,加了回车会自动隐性地补上 undefined,回车后面的值不会上来。

这是面试喜欢考的一个点,面试不考常态只考变态。

标识符的规则

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

Unicode 字母不只包含英文字母,还有希腊字母德语字母法语字母等,都可以用

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

变量名是标识符的例子

var _=1

var $=2

var ______=6

var 你好='hi'

其它标识符用到再说

注释的分类

不好的注释

把代码翻译成中文

过时的注释

发泄不满的注释

好的注释

踩坑注释。比如说你发现了一个bug,把它解决了,解决的过程你觉得可能后面还会遇到,然后可能会忘掉,你就把这个解决的过程写到代码注释里面。

好的注释就是告诉你为什么这样写,烂的注释就是告诉你我写了什么,但是优秀的程序员不需要你告诉我写了什么,只要你把代码命名好我就知道你写了什么。

if else 语句

if 语句 语法

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

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

最推荐使用的写法

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

永远不要省略花括号,就算里面只有一句也不要省略花括号。

次推荐使用的写法

function fn(){
  if(表达式){
    return 表达式
  }
  if(表达式){
    return 表达式
  }
  return 表达式
}

switch 语句 ,不推荐(但要懂点,别人可能会用到)

大部分时候,省略 break 你就完了 少部分时候,可以利用 break

问号冒号表达式,有人称其为三元表达式

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

能用问号冒号的时候,就不要用 if else

function max(a,b){
  if(a>b)return a;
  else return b;
}

可以简化成如下代码

function max(a,b){
  return a>b?a:b
}

&& 短路逻辑

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

a||b

等价于:

if(!a){
  b
}else{}
a=a||100

等价于:

if(a){
  a=a
}else{
  a=100//保底值
}

前端程序员如果能写成||,就绝对不写 if else

总结

条件语句

  • if...else...

  • switch

  • A?B:C

  • fn&&fn()

  • A||B

  • A=A||B

while 循环

while(表达式){语句}

判断表达式的真假

当表达式为真,执行语句,执行完再判断表达式的真假

当表达式为假,执行后面的语句


var a=0.1//初始化
while(a!==1){//判断
  console.log(a)//循环体
  a=a+0.1//增长
}

上面是浮点数不精确造成的问题

for 循环

for 是 while 循环的方便写法,for 循环是 while 循环的升级写法

while 循环有一个问题是,你如果缺了一部分就会死循环,

比如说没有写初始化,死循环,

没有写判断或者判断写错了,死循环,

你没有写循环体,那你循环也没什么用,

没有写增长,死循环

语法

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

先执行语句 1(语句 1 是用来初始化的)

然后判断表达式 2(表达式 2 是用来判断的)

如果为真,执行循环体,然后执行语句 3(语句 3 是自增用的)

如果为假,直接退出循环,执行后面的语句

注意:如果表达式 2 成立,先执行循环体,再执行语句3,

注意这个再,这是考点。执行循环体后,一定会去执行语句 3,除非你有 break。

题目(考点。这个问题的考点不在于 for 循环,在于 setTimeout 的时间问题)

for(var i=0;i<5;i++){
  setTimeout(()=>{
    console.log(i)
  },0)
}

问:最后打印出来的结果。

答:五个 5,因为 setTimeout 过一会时间才打印,等过一会,i 已经执行完了,所以,打印出五个 5。

var a=1
function fn(){
  console.log(a)
}

问:打印出 a,a 的值是多少?

答:不确定。

因为 a 现在等于 1,但不知道什么时候执行 fn。

a 的值可能会变,如果不确定函数是什么时候执行的,永远不能确定

a的值是多少。所以如果我不能确定 fn()的调用时间,我是不能说 a 的值的。

break 和 continue

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

注意:break 只会退出离它最近的循环

label 语句

用的很少,面试会考(概率 5%)

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

问:上面代码执行会打印出什么 答:1 和 2

面试

{ foo:1 }

问:上面的东西是什么

答:foo 是一个 label(标签),它的内容就是一个 1