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
}