JS语法 踩坑介绍

1,120 阅读3分钟

JS版本

  • ES3,IE 6版本使用,评价:辣鸡
  • ES5 ,评价:辣鸡
  • ES6,大部分新浏览器支持,评价:一半辣鸡
  • ES2019和ES6差不多

ES6

  • ES不能删除以前的特性,要兼容旧浏览器
  • 对比python3,就知道兼容的好处和稳定了

JS之父对JS的评价:

“它的优秀之处并非原创,它的原创之处并不优秀”

JS语法

表达式

  • 1+2是表达式,值为3
  • Math.random(1)是表达式,值是该函数的返回值
  • 只有函数有返回值!
  • console.log是表达式,它的值就是它本身
  • console.log(2)是表达式,但!它的值是undefined,打印2
  • 所以,console.log(),它的值也是undefined,无输出!

语句

  • var a = 1 是一个语句
  • 语句没有值,undefined,语句一般是用来改变环境的!

区别

  • 注意值、返回值、打印输出,这三者是不一样的
  • 表达式一般有值;语句可能有,也可能没有值
  • 语句一般会改变环境(声明)

大小写敏感

  • var a 和var A 是不一样的
  • object和Object 是不一样的
  • function和Function是不同的

空格和回车

  • 空格大部分时候是没问题是,不要影响到断句
  • 回车大部分也是没问题的,但是要注意,return后面不能回车!

这是可以的情况1:

这是可以的情况2:

这是不可以的情况1:

标识符

  • 第一个字符可以是Unicode字母 或$ 或_ 或中文
  • 第二个字符可以是数字或以上所说的

变量名是标识符

var _ = 1
var $ = 2
var ___ = 3
var 你好 = 4
  • 以下是控制台示例

区块block

  • 把代码包在一起,常与if/for/while合用
{
	let a = 1
	let b = 2
}

if语法

  • 正常用法
if(表达式)
{
	语句1
}
else
{
	语句2
}
  • 踩坑,{}在语句只有一句的时候,可以省略,但不建议

第一种情况,看的不明显

var 有钥匙 = 1
if(有钥匙)
    console.log('开门')
    console.log('吃家里的大米')

第二种情况,没开门,但!也可以吃家里的大米???

var 有钥匙 = 0
if(有钥匙)
    console.log('开门')
    console.log('吃家里的大米')

所以,if在只有一句语句的情况下,才可以省略{},很容易被缩进坑到!!!

三目运算

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

&& 短路逻辑

  • A && B && C && D ,取第一个遇到的假值或最后一个值
var a = 1 && 2 && 3 && 4

var b = 1 && 0 && 3 && 4

|| 短路逻辑

  • A || B || C || D ,取第一个遇到的真值或最后一个值

var a = 1 || 2 || 3 || 4

var a = 0 || 2 || false || null

var b = false || 0 || null || undefined

var b = 0 || null || undefined || false

var b = 0 || undefined || false || null

var b = undefined || false || null || 0

for循环

  • 没什么好说的,直接举例踩坑,

例1:

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

输出结果

  • 为什么是五次5呢?

因为for循环执行的时候是当前任务,setTimeout是过一会再执行,所以for循环会全部执行完毕后,才会执行setTimeout。哪怕循环一万次!

例2:

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

输出结果

  • 为什么又正常输出了呢?

这里面比较复杂,简单理解为,for循环在用let时,会有单独的逻辑处理,为了给傻瓜程序员好理解以防出错。。。

label(标签)

  • 语法:foo是标签,1是标签foo的值
foo:1
  • 面试问:下面这个是对象吗?
{
	foo:1;
}

输出结果

  • 不是对象,只是一个foo标签而已

注意,foo:1; 后面的分号加上,否则chrome浏览器会视为对象,Firefox不会

  • 那么如何变成一个对象? 很简单
var obj  = {
    foo:1
}

注意,此时foo:1 后面就不能加分号;了,请看下面示例

var obj  = {
    foo:1,
    boo:2
}

参考来源: 饥人谷