什么是JavaScript语言?
js是一门弱类型语言,是一种依附在宿主环境的脚本语言。
什么是脚本语言呢?就是js不支持开发操作系统程序,但是适合嵌入一些大型应用程序内。我们学习到的很多API都并不是js的,而是宿主环境提供的,我们借助js来调用。
目前,常见的宿主环境有浏览器,或者服务器(node项目)
以浏览器为例:
- DOM
- 浏览器控制
- web类
都属于宿主环境浏览器提供的API。
而js核心部分非常精简,主要分基础语法和标准库里面的一些对象,例如math``Array等。
js难学的地方
js本身并不难学,比较难的在于需要掌握大量应用程序API实现开发的效果。js需要和众多api组件配合,需要掌握它们绝非易事。
其次,js因为设计缺陷,有一些不合理的地方,我们需要知道这些不合理的地方并且避免它对我们编写的程序运行的结果产生不好的影响。
基本语法
什么是表达式和语句
对于表达式和语句,我们很容易混淆。下面来介绍以下一下表达式和语句的区别
例如:var a=1 和1+1来举例。
语句是为了进行某种操作,一般不需要返回值。语句一般会改变环境或者赋值操作。
例如var a=1 就是一个语句。语句一般以;结尾,代表语句结束。所以你可以随便在语句加回车。但是要注意:
不要在return后面加回车,相当于在return后面加了一个;号。那么后面的代码就不能执行了
表达式一般是为了得到某个值或者返回值,所以表达式一般会得到一个值。
例如1+1就是为了得到一个值,所以这是一个表达式。这里顺便说一句,只有函数表达式才能得到返回值,其他的表达式都是得到值。表达式不需要以·;结尾,如果加了;号,那么可能会被认为是一个语句,不会产生意义
特殊说明
console.log的返回值是函数本身,console.log(3)返回值是undefined。
变量
变量是对“值”的引用,例如var a=1+2这行表达式产生的值,会被a所引用,a会对值进行保存,引用a,就表示引用对a里面的“值”。变量的名字就是变量名,a就是变量名。变量名区分大小写,a跟A是不一样的。
如果缺少关键字var,那么声明的变量会变成全局变量。为了表达声明意图并且避免全局变量的污染,建议声明变量时使用声明关键字。目前js有三种声明关键字,分别是var,let,const。
利用var关键字声明但是不赋值,例如var a,那么a会变成undefind
标识符的规则
标识符就是一个变量的名称,他不存在于stack区跟heap区。只是一个名称,你可以看成是一个代号。
这个代号是有规则的,例如:
1、不能以数字开头,但是可以使用数字
2、可以是$或者_开头。变量名不能是除这两个以外的符号
3、变量区分大小写,A和a是不同的
4、只是声明但是没有赋值,那么产生的是undefined
5、如果一个变量没有写var或者let或者const,会产生一个全局变量
标识符可以是中文、字母。
if else
if else的用法是:
if(表达式){
语句1
}else{
语句2
}
()内需要判断表达式的布尔值,然后根据布尔值返回的值,执行不同语句。表达式为真true时执行语句1,表达式为伪时执行语句2.
这里的大括号{}其实是可以省略的。这里看一道比较变态的题目,会打印什么呢?
let a=1;
if(a===2)
console.log(a);console.log(222);
实际打印的是222,因为大括号省略了,js会默认按照;语句来把console.log(a)当成大括号内的语句
此时代码为
let a=1;
if(a===2){
console.log(a);
}
console.log(222);
所以也可以得到一个结论,js的语句换行是以;为结尾的。
还有另外一个结论:如果大括号是可以省略的,那么else if{}是不是原本应该是
else{}
if{xxx}
只是把大括号省略了呢?
在js中,=是赋值的意思,==或者===才是判断是否相等。所以在if()里面使用=可能不会报错,但是写法上是错误的。
三元表达式(冒号分号表达式)
条件表达式?表达式1:表达式2; 例如:
let a=1
a>2?console.log('a>2'):console.log('a<2')
如果a大于2,就执行表达式1,不然就是2
短路逻辑
&& 与
a && b的意思是取第一个假值,如果都为真,则取最后一个真值b
|| 或
a||b 取第一个真值,如果第一个为假,就取后面的值b
! 非 表示取反
常用场景
fn && fn() 如果有fn这个函数,就取第二个值 fn()执行
fn()||fn 如果fn存在就执行fn()
while和for
while语句的写法为:
let a = 1 //初始化
while(a<10){ //条件表达式
console.log(a); //循环体语句
a++ //自己增加
}
for循环是while语句的语法糖,写法为
for(let i=0;i<10;i++){
//循环体语句
}
break和continue
break会退出当前循环(当前最近的循环)
continue会退出本轮循环一次,继续下一次循环
label
这个面试的时候会考,一般的写法是
{
foo:
1;
}
foo:{
console.log(123);
break;
console.log(123)
}
表示一个程序标签,通常label跟break或者continue配合使用,跳出特定循环。
与continue配合
foo:
for(let i=0;i<3;i++){
for(let j=0;j<3;j++){
if(i===1 && j===1){
continue foo;
}
console.log(i,j)
}
}
//0 0
//0 1
//0 2
//1 0
//2 0
//2 1
//2 2
label标签foo与continue配合时,当达到循环条件时,跳出本轮循环,跳到最外层循环继续执行;如果不加foo则会跳出本轮内层循环,继续下一次内层循环。
与break配合
foo:
for(let i=0;i<3;i++){
for(let j=0;j<3;j++){
if(i===1 && j===1){
break foo;
}
console.log(i,j)
}
}
//0 0
//0 1
//0 2
//1 0
与break配合时,当满足条件,会跳出外层循环,不再继续执行。如果不加foo,则会跳出内轮循环,继续执行外轮循环