5-JS基础语法与表达式

112 阅读14分钟

一、JS语法与变量

1、初识JavaScript

前端三层

语言功能
结构层HTML搭建结构、放置部件、描述语义
样式层CSS美化页面、实现布局
行为层JavaScript实现交互效果、数据收发、表单验证等

NodeJS让JavaScript的触角伸到了服务器端。

ECMAScript是JavaScript的标准:

JavaScript实现了ECMAScript;ECMAScript规范了JavaScript。

JavaScript体系,分为三部分:(1)语言核心,又分为ECMAScript5和ECMAScript6,7,8,9;(2)DOM;(3)BOM。

2、JavaScript语法与变量

JavaScript的书写位置:

1.在<body><script>标签,在内部书写JavaScript代码;

2.将代码单独保存为.js格式文件,然后在HTML文件中引入它;

注:JavaScript不能脱离HTML网页运行(当然,今后学习的NodeJS将成为JavaScript独立的运行平台)。

3、输出语句

1.alert()语句 -弹出警告框;

2.console.log()语句 -控制台输出。

认识输出语句

1.alert('慕课网');

alert:alert()是内置函数,函数就是功能的“封装”,调用函数需要使用圆括号。

'慕课网'三个字是函数的参数,因为它是字符串,我们需要将它用引号包裹。

语句的末尾应该书写分号,请注意要在输入法为英语状态下输入。

2.console.log('慕课网');

console是JS内置对象,通过“打点”可以调用它内置的log“方法”。所谓“方法”就是对象能够调用的函数。

4、学会处理报错

1.结尾处不小心写成了中文分号;

uncaught SyntaxError: Invalid or unexpected token

未捕获的语法错误:不合法或错误的符号。

注:发生错误的行号(可能有1行误差)。

2.字符串中内容忘记用引号包裹;

Uncaught ReferenceError:慕课网is not defined

未捕获的引用错误:慕课网没有被定义。

3.错误拼写alert;

Uncaught ReferenceError: alret is not defined;

未捕获的引用错误: alret没有被定义。

REPL环境:控制台也是一个REPL环境,可以使用它临时测试表达式的值。

5、变量

变量是什么:变量是在内存中存储值的符号;变量不是数值本身,它们仅仅是一个用于存储数值的容器。

定义变量:要想使用变量,第一步就是声明它,并给它赋值。

var a =5;

使用var关键字定义变量;等号表示赋值。

变量的使用:当变量被赋值后,就可以使用它了;变量使用时不能使用引号。

console.log( a);

变量的默认值:

变量的默认值 一个变量只定义,但没有赋初值,默认值是undefined;

一个变量只有被var定义,并赋初值之后,才算正式初始化完成。

var a = 10;
console.log(a);// undefined

a=10;

console.log(a) ;//10

变量的常见错误:

1.不用var定义,而直接将值赋予它,虽不引发报错,但会产生作用域问题。定义变量时必须写var。

2.尝试使用一个既没有被var定义过,也没有赋过值的字符,就会产生引用错误。变量必须先赋值再使用

标识符的命名规则(变量、函数、类名、对象的属性等也都要遵守这个命名规则):

1.只能由字母、数字、下划线、$组成,但不能以数字开头;

2.不能是关键字或保留字;

3.大小写敏感,a和A两个不同的变量。

优秀的变量命名法:驼峰命名法:mathTestScore。

变量声明:

使用逗号同时声明和初始化两个变量;

var a =0 , b =0 ;

变量声明提升:

变量声明的提升:你可以提前使用一个稍后才声明的变量,而不会引发异常。

变量声明提升时,只提升变量的定义,不会提升它的值。

注意事项:

变量声明的提升是JavaScript的特性,所以经常出面试题;

在实际开发时,一定要先定义并给变量赋初值,然后再使用变量。

6、重点内容

1.前端开发主要有哪些层?语言和功能是什么?

2.JavaScript的书写位置是哪里?

3.JavaScript有哪些输出语句?

4.如何定义变量?变量的合法命名规则有哪些?

7、难点内容

1.只var定义一个变量,但是没有赋初值,这个变量的值是?

2.什么是变量声明的提升?

3.JavaScript中,等号的功能是什么?

二、JS基本数据类型

1、数据类型简介和检测

JavaScript中两大类数据类型:

1.基本数据类型:Number、String、Boolean、Undefined和Null;

2.复杂数据类型:Object、Array、Function、RegExp、Date、Map、Set、Symbol等等。

typeof运算符:使用typeof运算符可以检测值或者变量的类型。

注:typeof不是函数,是个操作符;不需要加括号。

5种基本数据类型的typeof检测结果:

类型名typeof检测结果值举例
数字类型number5
字符串类型string'慕课网'
布尔类型booleantrue、false
undefined类型undefinedundefined
null类型object(记)null

2、Number(数字)类型

所有数字不分大小、不分整浮、不分正负,都是数字类型。

小数中0可以省略。介于0和1之间的小数,可以不书写0。 .5; //0.5 typeof .5; //number

科学计数法:较大数或较小数(绝对值较小)可以写成科学计数法.

3e8;//300000000

typeof 3e8; //number

一个特殊的数字型值NaN:

NaN是英语“not a number”的意思,即“不是一个数”,但它是一个数字类型的值.

typeof NaN;//number

0除以0的结果是NaN,事实上,在数学运算中,若结果不能得到数字,其结果往往都是NaN.

NaN有一个“奇怪”的性质:不自等。这个知识点将在后续课程中讲解.

3、String(字符串)类型

字符串就是“人类的自然语言”。字符串要用引号包裹,双引号或者单引号均可。

分清数字和字符串:数字11和字符串'11'在语义上是不同的,前者表达一个数量,后者是一个文本。

typeof 11; // number

typeof '11'; //string

字符串的拼接:加号可以用来拼接多个字符串.

'imo' + 'oc '; //'immoc'

字符串和变量的拼接: 要将一个变量的值“插入”到字符串中,要“斩断链接”.

var year = 2022; var str ='北京冬季奥运会在'+ year +年召开'; 注:year表示斩断链接; 新版ES中增加了反引号表示法,可以更方便进行变量插值,后续课程将进行介绍。

空字符串:一些时候需要使用空字符串,直接书写闭合的引号对即可。

var str =' ';

字符串的length属性:

字符串的length 属性表示字符串的长度。

'我喜欢JS'.length //5

' '.length //0

字符串的常用方法:

“方法”就是能够打点调用的函数,字符串有丰富的方法.

方法功能
charAt()得到指定位置字符
substring()提取子串
substr()提取子串
slice()提取子串
toUpperCase()将字符串变为大写
toLowerCase()将字符串变为小写
indexOf()检索字符串

1.charAt()方法

charAt()方法可以得到指定位置的字符。

'我喜欢JS,我也喜欢HTML'.charAt(0)  //'我'
'我喜欢JS,我也喜欢HTML'.charAt(11)  //'T'
'我喜欢JS,我也喜欢HTML'.charAt(74)  //' '

2.substring()方法

substring(a, b)方法得到从a开始到b结束(不包括b处)的子串。

'我喜欢JS,我也喜欢HTML'.substring(3,5)  //'JS'
'我喜欢JS,我也喜欢HTML'.substring(10,14)  //'HTML'

substring(a, b)方法如果省略第二个参数,返回的子串会一直到字符串的结尾。

'我喜欢JS,我也喜欢HTML'.substring(6) //'我也喜欢HTML'

substring(a, b)中,a可以大于b,数字顺序将自动调整为小数在前。

'我喜欢JS,我也喜欢HTML'.substring(5,3) //'JS'

3.substr()方法

substr (a, b)中,将得到从a开始的长度为b的子串。

'我喜欢JS,我也喜欢HTML'.substr(3,2) //'JS'

substr(a, b)中,b可以省略,表示到字符串结尾。

'我喜欢JS,我也喜欢HTML'.substr(3) //'JS,我也喜欢HTML'

substr (a, b)中,a可以是负数,表示倒数位置。

'我喜欢JS,我也喜欢HTML'.substr(-4,2) //'HT'

4.slice()方法

slice(a, b)方法得到从a开始到b结束(不包括b处)的子串。

'我喜欢JS,我也喜欢HTML'.slice(3,5) //'JS'

slice(a, b)的参数a可以是负数。

'我喜欢JS,我也喜欢HTML'.slice(-4,-1) //'HTM'

slice(a, b)中,参数a必须小于参数b。

'我喜欢JS,我也喜欢HTML'.slice(5,2) //' '

5.substring(). substr()和slice()对比总结

substring(a,b)和slice(a,b)功能基本一致,都是得到从a开始到b结束(不包括b)的子串,区别:

(1)substring()可以自动交换两个参数位置,而slice()不行;slice()的参数a可以是负数,而substring()不行。

(2)substr(a, b)中参数b是子串长度,而不是位置编号

6.toUpperCase()和toLowerCase()

toUpperCase()转为大写

toLowerCase()转为小写

'i love you'.toUppercase( );//"I LOVE YOU"

'IMOOC' .toLowerCase();//"imooc"

7.indexOf()方法

indexOf()方法返回某个指定的字符串值在字符串中首次出现的位置。如果要检索的字符串值没有出现,则该返回-1。

'abcdeb' .indexOf('b')//1

'abcdeb' .indexOf('de')//3

'abcdeb'.indexOf('m')//-1

4、Boolean(布尔)类型

布尔型值只有两个: true和false,分别表示真和假。

typeof true;//boolean

typeof false;//boolean

5、Undefined类型

一个没有被赋值的变量的默认值是undefined,而undefined的类型也是undefined。

即: undefined又是值,又是一种类型,这种类型只有它自己一个值。

typeof undefined;//undefined

6、null类型

null表示“空”,它是“空对象”。 当我们需要将对象销毁、数组销毁或者删除事件监听时,通常将它们设置为null。

使用typeof检测null值,结果是object,这点尤其要注意。

typeof null;//object

类型和typeof检测结果并不总是——对应,比如数组用typeof检测结果也是object。

JavaScript可能看起来“千疮百孔”,一定需要刻意记忆。这些点往往也是面试常考的。

7、数据类型的转换

1.其他值→数字

(1)使用Number()函数

字符串→数字,纯数字字符串能变为数字,不是纯数字的字符串将转为NaN。

Number('123');//123

Number('123.4');//123.4

Number('123年');//NaN

Number('2e3');//2000

Number(' ');//0

布尔值→数字

true变为1, false变为0。

Number(true);//1

Number(false);//0

undefined和null→数字:undefined变为NaN,null变为0。

Number(undefined);//NaN

Number(null);//0

(2)使用parselnt()函数

parselnt()函数的功能是将字符串转为整数。

parseInt('3.14');//3 parselnt()将自动截掉第一个非数字字符之后的所有字符

parseInt( '3.14是圆周率');//3 所有文字都将被截掉

parseInt('圆周率是3.14'); // NaN 如果字符串不是以数字开头,则转为NaN

parseInt('3.99'); // 3 parselnt()函数不四舍五入

(3)使用parseFloat()函数 parseFloat()函数的功能是将字符串转为浮点数。

parseFloat('3.14');//3.14 parseFloat()可以将小数字符串转为数字小数

parseFloat('3.14是圆周率');//3.14 parseFloat0将自动截掉第一个非数字字符、非小数点之后的所有字符

parseFloat('圆周率是3.14');//NaN 如果字符串并不是以数字开头,则转为NaN

parseFloat('3.99');//3.99 不四舍五入

2.其他值→字符串

(1)使用String()函数

数字→字符串:

变为“长得相同”的字符串。科学计数法和非10进制数字会转为10进制的值。

string(123); //'123'

string(123.4);//'123.4'

String(2e3);//'2000'

string(NaN);//'NaN'

String(Infinity);//'Infinity'

String(0xf);//'15'

布尔值→字符串:

变为“长得相同”的字符串

String(true);//'true'

string(false);//'false'

undefined和null→字符串:

变为“长得相同”的字符串

string(undefined) ;//'undefined'

String(null);//'null'

(2)使用toString()方法

几乎所有值都有toString()方法,功能是将值转为字符串。

3.其他值→布尔值

(1)使用Boolean()函数

数字→布尔值

0和NaN转为false,其他数字都转为true。

Boolean(123);//true

Boolean(0);//false

Boolean(NaN);//false

Boolean(Infinity);//true

Boolean(-Infinity); //true

布尔值→布尔值

空字符串变为false,其他都转为true。

Boolean(‘ ’);//false

Boolean(‘abc’);//true

Boolean(‘false’);//true

undefined和null→布尔值

转为false

Boolean(‘undefined’);//false

Boolean(‘null’);//false

8、小案例:小小加法计算器

使用prompt()函数弹出输入框,让用户输入两个数字。

对用户输入两个数字进行加法运算,而由于用户输入的内容是字符串类型,所以必须先转为数字类型,才能做加法运算。

最后用alert()显示结果。

普遍计算机程序执行步骤:

用户输入->计算机处理->显示结果

9、复杂数据类型

除基本类型值外,JS的世界中还有复杂数据类型。如:

[1,2,3] { a: 1,b: 2 } function () {}

复杂数据类型都是“引用类型”,引用类型的特性将在数组一课中介绍。

10、重点内容

1.JavaScript中有哪些基本类型值?它们的typeof检测结果是什么?

2.说出下面几个特殊值是什么:①NaN ②undefined ④null

3.各种类型值相互转换的方法和转换规律

11、难点内容

1.下面表达式的结果是?

parseInt( '3.6’+ '5.1'); //3

Boolean( 'false'); //true

0/0; //NaN

4/0; //Infinity

2.请说出substring(). substr()和slice()方法的区别

'abcde'.substr(1,3); //"bcd" 'abcde'.substring(1,3); //"bc" 'abcde'.slice(3,2); //"" 重 'abcde'.substring(3,1); //"bc"

三、表达式与操作符

1、表达式和运算符

表达式种类:算术;关系;逻辑;赋值;综合。

2、算术表达式

运算符意义
+
-
*
/
%取余

加减乘除:加减的符号和数学一致,乘法是*号,除法是/号。

默认情况,乘除法的优先级要高于加法和减法﹔必要时可以使用圆括号来改变运算的顺序。

加号的两种作用:加号有“加法”和“连字符”两种作用。

如果加号两边的操作数都是数字,则为“加法”,否则为连字符。

1+2 //3

1+'2' //'12'

'1'+'2' //'12'

取余运算

也叫作“求模运算”,用百分号“%”表示。

a % b表示求a除以b的余数,它不关心整数部分,只关心余数。

隐式类型转换

如果参与数学运算的某操作数不是数字型,那么JavaScript会自动将此操作数转换为数字型。隐式转换的本质是内部调用Number()函数。

3*'4' //12

true + true //2

false + 2 //2

3*'2天' //NaN

有关IEEE754

在JavaScript中,有些小数的数学运算不是很精准。

0.1+0.2 //0.30000000000000004

JavaScript使用了IEEE754二进制浮点数算术标准,这会使一些个别的小数运算产生“丢失精度”问题。

解决办法:在进行小数运算时,要调用数字的toFixed()方法保留指定的小数位数。

(0.1+0.2).toFixed(2) //"0.30"

Number((0.1+0.2).toFixed(2)) //0.3

幂和开根号

JavaScript中没有提供幂计算、开根号的运算符。需要使用Math对象的相关方法进行计算。

Math.pow(2,3) //8

Math.pow(3,2) //9

Math.sqrt(81) //9

Math.sqrt(-81) //NaN 负数不能开根号

向上取整和向下取整

Math.ceil()向上取整;Math.floor)向下取整。

Math.ceil(2.4) //3 Math.floor(2.4) //2

Math.ceil(-2.4) //-2 Math.floor(-2.4) //-3

Math.ceil(2) //2 Math.floor(-2) //2

3、关系表达式

关系运算符

运算符意义
大于
<小于
>=大于等于
<=小于等于
==等于
!=不等于
===全等于
!==不全等于

大于和小于:大于>、小于<两个符号和数学相同。

“大于等于”运算符是>=,“小于等于”运算符是<=。

8>5 //true

7<4 //false

8>=7 //true

8>=8 //true

8<=8 //true

8<=11 //true

判断是否相等

如果想比较两个值是否相等,此时应该使用==运算符。

JavaScript中等号=表示赋值,而并不是相等。判断相等应该使用==运算符。

3 == 3 //true

3===3 //true

3=3 //错误语句

相等和全等

两个等号==运算符不比较值的类型,它会进行隐式转换后比较值是否相等。

三个等号===运算符,不仅比较值是否相同,也比较类型是否相同。

5 == '5'; //true
5==='5'; //false

1==true //true
1===true //false

0==false //true
0===false //false

undefined==null //true
undefined==null //false

NaN不自等

NaN作为一个特殊的数字类型值,它在用==比较的时候也有特殊的结果。

NaN ==NaN //false

NaN ===NaN //false

如何判断某变量值为NaN

isNaN()函数可以用来判断变量值是否为NaN。

isNaN(NaN) //true

isNaN(5) //false

但isNaN()也不好用,它的机理是︰只要该变量传入Number)的执行结果是NaN,则isNaN()函数都会得到true。

isNaN(undefined) //true

isNaN('3天') //true

isNaN(null) //false

特殊值的相等关系

null == undefined //true

null == 0 //false

NaN ==NaN //false

不相等和不全等

!=表示不相等,!==表示不全等。

5 !=6 //true

5 !==6 //true


5!='5' //false

5!=='5' //true

4、逻辑表达式

逻辑运算符

运算符意义
!
&&
||

1.非运算

!表示“非”,也可以称为“置反运算”。!是一个“单目运算符”,只需要一个操作数。

置反运算的结果一定是布尔值

!true //false
!false //true

!0 //true
!undefined //true
!'' //true
!'imooc' //false

!!true //ture
!!0 //false
!!'' //false
!!'imooc' //true !!表示该值的布尔值

2.与运算

&&表示“并且”,称为“与运算”,口诀:都真才真。(下面式子也符合短路计算)

true && true //true
true && false//false
false && true//false
false && false//false

3.或运算

||表示“或者”,称为“或运算”,口诀:有真就真。(下面式子也符合短路计算)

true || true //true
true || false//true
false || true//true
false || false//false

4.短路计算(短路计算在工作编程中很有用,在后续课程讲解)

(1)a&&b都真才真。

思路:若a真,b真总结果就真,b假总结果就假;若a假,不用看b了,被“短路”。 a && b运算中:a真,表达式值为b;a假,表达式值为a。

3&&6 //6
undefined&&15 //undefined
15&&undefined //undefined
null&&2 //null
''&&16 //''
NaN&&undefined //NaN

(2)a||b 有真就真。

思路:若a真,不用看b了被“短路”;

若a假,b真总结果就真,b假总结果就假。

a|| b运算中: a真,表达式值为a; a假,表达式值为b。

3||6 //3
0||6 //6
null||undefined //undefined
'a'||'b' //'a'
NaN||null //null

5.逻辑运算顺序

逻辑运算的优先级是︰非→与→或。

!true||true //true
3&&4||5&&6 //4

5、赋值表达式

赋值运算符

运算符意义
=赋值
+=,-=,*=,/=,%=快捷赋值
++自增运算
--自减运算

JS中,=表示赋值,==判断是否相等(不判断类型),===判断是否全等。

赋值运算符会将等号右边的数值,赋予等号左边的变量。

赋值运算也产生值

赋值运算也产生值,等号后面的值将作为“赋值运算的值”。

var a;

console.log(a = 4); //4

这就意味着,可以连续使用赋值运算符。

var a, b,c;

a = b = c = 15;

console.log(a) ; //15

console.log(b) ; //15

console.log(c) ; //15

自增/自减运算符 ++和--是自增/自减运算符,表示在自身基础上加1或减1

var a = 3;
a++;
console.log(a); //4

a++和++a的区别 a++先用再加;++a先加再用。

	var a=3;
    var b=a++;
    console.log(b);//3
    console.log(a);//4

    var a=3;
    var b=++a;
    console.log(b);//4
    console.log(a);//4

6、综合表达式

运算顺序:非运算→数学运算→关系运算→逻辑运算(非数关逻)。

5<3+3 //true
3>2 && 8>3+4 //true
3>2 && 8>3+5 //false
!13 <5-3 //true
!13 <5-5 //false

小案例:闰年判断

公历闰年的简单计算方法(符合以下条件之一即可) 1.能被4整除且不能被100整除。 2.能被100整除也能被400整除。

7、重点内容

1.表达式有哪几种?每种表达式分别有哪些运算符?

2.每种表达式中运算顺序是什么?综合运算顺序是什么?

8、难点内容

1.什么是短路计算? 3 &&13的结果是多少? 3 ||13呢?

13,3

2.a++和++a有什么区别?

a++先用在加,++a先加在用。

var a = 3;

var b = 4;

alert(a++ + b++ + ++a + ++b);

思路:a++,alert中a的值为3;之后a++,所以a=4;

b++,alert中b的值为4,之后b++,所以b=5;

++a,先加再用,a=4+1=5,;

++b,b=5+1=6;

所以一共是3+4+5+6=18;