JavaScript笔记

来源:互联网 发布:mysql 可以用check约束 编辑:程序博客网 时间:2024/05/18 01:01

一.初识JavaScript

1.JavaScript简介

JavaScript是什么?

html是超文本标签语言,CSS样式语言,JavaScript属性编程语言

JavaScript是一门运行在浏览器端的脚本语言。

编程语言:C语言, C++语言, PHP, Java,   C#,

通常我们把JavaScript简称为JS

 

对比:

1,和HTML,CSS一样,都可以在浏览器中解析。

2,和HTML, CSS不一样,JavaScript是一门编程语言,html, css不是编程语言。

 

历史...

http://www.ruanyifeng.com/blog/2011/06/birth_of_javascript.html

 

JavaScript和java有何关系?

基本上没有任何关系。

雷锋和雷锋塔。

事实上,还是有一点小关系,从商业角度来说。

早期名字是livescript,后来改名成JavaScipt

 

JavaScript可以做什么?

现在你去打开任何一个页面,都可以看到js的身影

可以做什么?

1,可以更好的组织我们的页面的内容,让内容更加有条理

2,提供了用户体验

3,游戏编程

 

2.如何学习JavaScript

a.内容

浏览器端的JavaScript。有三部分组成:

1,ECMAScript: 是js语言的一个标准。是欧洲计算机制造协会制定一套标准。

2,BOM:(Brower Object Model)浏览器对象模型,js访问浏览器的一个接口。

3,DOM:(Document Object Model)(客户端JavaScript)文档对象模型,js访问页面内容的接口。

 

b.版本

95年js诞生, 97年ECMAScript标准确立,99年ES3出现,09年ES5出来了,15年时,出现ECMAScript2015,通常叫它ES6。

我们暂时学习ES5,后期会接触一点ES6。

 

c.心态

由于JS的比较灵活,导致我们学习时,总会和传统和C,C++搞混,学习时要多思考。

如果有其它编程语言基础,学习时,会容易。

 

d.参考书

 

3.页面引入JavaScript

JS是一门运行在浏览器端的脚本语言。

类似于CSS,需要在页面中引入JavaScrpit.

有如下四种方式

ü  行内(内联)

ü  内部

ü  外部

ü  JavaScript协议

a.行内:

作为元素的属性,写在开始标签中,如下:

b.内部:

需要通过script标签来引入

 

注意细节:

1,使用script标签的时候,script标签可以放在页面中任何地方。

2,scrpt标签里面有一个type属性,值是text/javascript, 表示当前方本是纯文本js, 在ES5,script是一个默认的属性,它的默认值就是text/javascript

3,script还有一个属性,叫charset,用来声明文本的字符集,通常不需要。

4,JS代码需要放在script标签中才可以,不放在里面,运行不了

 

c.外部

引入CSS时,内部:style标签,外部:link标签

引入JS时,内部:scritp标签,外部:script标签

 

首先外部引入js,需要先写一个js文件, 如:

其次,需要在页面中通过script标签来引入外部的js,如下图:

 

执行后,如下:

 

注意细节:

1,仍然使用script标签,在标签里面使用src属性来引入js文件

2,引入了外部js,在script标签中的代码就不再执行

3,scrpt标签可以引入多次,意思就是在一个html中,可以有多个script标签。

 

最佳实践:使用外部引入js/位置放在底部

 

 

二.JavaScript基本语法

1.JavaScript词法结构

所谓词法结构是指一套基础性规则,用来描述如何使用这门语言来编写程序,包括如下几项:

ü  字符集unicode

ü  区分大小写(true和TRUE)

ü  忽略空白字符(空格、制表符和换行符)

ü  注释

ü  标识符和关键字(保留字)


字符集unicode

unicode介绍:

js在发明时,使用的是unicode字符集,但是我们在写js程序时,要尽量使用英文,特别是在给文件命名时,尽量使用英文。

 

区分大小写 (true和TRUE)

我们在写js代码时,一定要注意大小写,如果不区分大小写,很容易出错。

 

 

 

忽略空白字符(空格、制表符和换行符)

由于js会忽略空白字符,那么我们在写代码时,就要好好利用这些空白符,使代码更加清晰。

 

注释

注释非常重要,注释在代码中的比重一般是50%。

在js中, 注释分为两种:

单行注释  //

多行注释  /* */

 

注意细节:

1,注释的内容不会执行,是给开发人员看的,不是给计算机看的

2,对于多行注释, 不允许嵌套,如下:

 

标识符和关键字(保留字)

我们在写代码时,会起各种各样的名字,那么就些名字就是标识符,还有一些名字是人家发明js时,就起好的名字,这些名字,我们统称为关键字,还有一种,也是人家起好的名字,但是现在没有使用它,而是保留着以后使用,这类名字,我们叫它保留字。

我们在定js代码时,当我们需要起名字时,不要使用人家事先定义好的关键字或保留字。比如:var  alert .......

关键字如下:

 

在js中,当我们去起一个名字时,通常这个名字我们中它标识符,使用小驼峰命名法。

小驼峰:标识符首字母小写,后面如果还有其它的单词,每个单词的首字母大写。如:

toString

 

最佳实践:标识符(如变量、函数)命名采用小驼峰式命名方法

 

 

2.变量和值

(1).变量概念(变量名和值)

电脑(计算机)刚产生的目的?

电算机刚产生的目的是纯粹为了计算,计算的目的是为了满足某些需要。

 

学编程的目的?

切实解决生活中的问题。

 

现在我有一个生活中的问题:计算一个1+2=?,对于这个问题,我们使用计算机该如何解决?

首先需要让计算机中有两个“容器”,一个保存1, 一个保存2,计算机把这两个容器的值取出来,取出来后,进行一个相加的操作,加完之后,将结果输出。

这个容器在编程语言中叫变量。变量是用于存储信息的"容器"。

 

代码如下:

变量是用来保存某个值的,便于后续使用。最终是为了解决现实中实际的问题。

 

变量有两部分组成:

变量的名称:一般来说,在赋值符号左边。

变量的值:一般来说,出现在赋值运算符的右边。

 

还有些书上说,还有变量类型,变量的地地址等.....

 

 

 

(2).如何声明变量

在js中,声明变量是使用var这个关键字。

var是variable(变化)的简写。

 

a.单独声明

 一次性声明一个变量,每个变量都使用var

 

b.一次性声明多个

只需要一个var关键字,然后可以声明多个变量

 

c.重复声明(了解)

在js中,是允许重复声明变量的,不会出错,如下:

如果重复声明了,后面的值会覆盖前面的值。

实际开发中,一定要避免重复声明。

 

注意,我可以借助console来调试代码,如下:

 

百度首页,通过console.log来发招聘信息:

 

d.遗漏声明(了解)

在js中,是允许遗漏声明,不会出错,如下:

对于这种写法,我们同样也要避免!

(3).全局变量、局部变量

全局和局部是指变量的生效范围,在哪个地方能够起作用。是以函数为界。

数学中有函数

编程中的函数也是模拟数学中的函数,可以这样理解,编程中的函数就是一个功能块。给这个功能块一个[输入], 这个功能块给你一个[输入]

 

打一个比方:

普通话和方言

全局和局部是以函数作为分界线。

全局的变量在函数内部和函数外部都能访问,局部的只能在函数内部访问,不能在函数访问。

小结:全局在函数内外都能访问,局部变量只能在函数内访问。

 

注意:在js中是没有常量

在js中,变量的值是可以改变的,就是它的值是可以变化,如下:

 

常量则是值不能改变的。在js不支持常量。

 

最佳实践:

ü  总是使用var来声明一个变量

ü  变量要先声明后使用 

 

 

 

3.数据类型

变量是一个容器,存储一些信息,信息又分成不同类型的信息。如

姓名, string

年龄,数字

......

 

现实生活中,有很多信息,一定有很多单位,个,条,只, 天,月,年,时, 分........

 

 

(1).什么是数据类型

 

在日常生活中,描述不同的东西,有不同的单位。实际上,编程也是为了解决生活中的问题的,在程序中,是如何描述这些内容?

针对不同的内容,根据其特性,需要添加上不同的单位(类型)加以描述,这就是数据类型的概念。

 

在js, 它的数据类型如下:

(2).数值类型(number)

作用:用来表示数字的,任何数字都可以用数值类型。比如:商品价格,年份,年龄等

 

在C语言中,数值类型分为单精度和双精度。在js,是不区分整数和小数。

我们可以使用typeof运算符来判断,一个变量的数据类型:

 

注意细节:

ü  不区分整数值和浮点数值,都是浮点数

ü  最大值和最小值(Number.MAX_VALUE,Number.MIN_VALUE)

ü  整型的多种表示(十进制、十六进制、八进制)

ü  浮点数的多种写法(3.14,.33333,6.02e3)

ü  JavaScript算术运算的特殊性(溢出、被零整除都不会报错)

ü  特殊的NaN

ü  运算的不精确性

 

不区分整数值和浮点数值,都是浮点数

浮点数就是小数, js是不区分整数和小数。

 

最大值和最小值(Number.MAX_VALUE,Number.MIN_VALUE)

 

整型的多种表示(十进制、十六进制、八进制)

浮点数的多种写法 (3.14,.33333,6.02e3)

 

JavaScript算术运算的特殊性(溢出、被零整除都不会报错)

 

特殊的NaN

NaN: Not a Number 不是一个数值

 

运算的不精确性

针对小数,运算具有不确定性

 

在js中,千万不要去比较两个小数,也就是说,不要去比较两个运算之后是否相等。

 

如何去解决这个不确定性?

先转化成整数后,再判断,如下;

最佳实践:

ü  不要使用八进制

ü  不要试图用==判断两个浮点数是否相等

 

 

(3).字符串类型(string)

由一系列的字符构成的数据

描述某个名称,用户名,密码,籍贯等。

 

在使用字符串类型数据时,需要使用引号:

双引号: “”

单引号: ‘’

 

基本使用:

 

如果没有使用引号,那么js会把它当作变量来对待,如下:

 

双引号和单引号要配对使用,不能混合使用,如下:

 

 

当我们的js代码本身被引号引起来时,怎么办?

错误如下:

 

该怎么解决:

外双内单,或, 外单内双

 

当双引号嵌套时,会发生错误:

 

有时候,需要输入一些符号,js 为我们提供了转义字符,用法如下:

 

js中,常用的转义字符如下:

 

例如:换行的使用

 

还有两个小问题:

在js, 标识符(变量名和函数名)的名称,不能以数字打头,结合字符串来理解:

 

数字可以作为数值类型,也可以作为字符串类型:

 

字符串可以以数组的形式来使用:

 

如果需要获取字符串的类型,使用typeof运算符,如下:

 

 

(4).布尔类型

前面说了,数值类型,它所对应的值有无数个,又说了字符串类型,它所对应的值也有无数个。接着我们学习的布尔类型,它对应的值没有那么多,只有两个,一个是true, 一个是false.

 

true表示真,false表示假

 

在js中严格区分大小写,true, 和Ture,TRUE不一样。

 

布尔类型一般会在判断等语句中使用。

 

严格区分大小写:

 

我们可以使用typeof来判断布尔数据的数据类型,如下:

 

注意细节:

1,在实际开发中,直接使用true和false的情况不多。

2,有一些值会默认转化成false, 其它值都转化成true

ü  undefined

ü  null

ü  0/-0

ü  NaN

ü  “”

(5).undefined和null

在日常生活中,有0这个数字,表示没有。

 

undefined

  undefined: un前缀 + defined defined是定义的意思, undefined未定义的意思

   表示一个变量在声明的时候没有赋初值。它的值就是undefined

 

数值类型:对应无数个值 1, 2, 3...

字符串类型:对应无数个值  “hello”, “h1”....

布尔类开:对应两个值true false

undefined: 对应一个值,这个值也叫undefined

 

用法:

 

对于声明一个变量,只要声明了,它就存在了,就看有没有赋值,如果赋值了,这个容器里面就是对应的值,如果没有赋值,也是有值的,只是这个值是undefined,它的类型也是undefined,换句话说,undefined在js是一种数据类型,它只有一个值,这个值就是undefined.

 

null

   null是英文是空的意思

 

在使用时,需要显式是给它赋为null,才可以。

 

实际上,null在js是用于对象的,如果对象的初始值什么都没有,可以赋为null.或者当你想销毁一个对象时,也可以给它赋nulll.

 

undefined和null有什么区别?

ü  undefined是针对普通变量而言的

ü  null是针对对象而言

 

undefined和null的几乎一样,对它们比较后的结果如下:

 

为什么会有两个东西表示“无”?

答:历史原因(了解)

下去看一看:http://www.ruanyifeng.com/blog/2014/03/undefined-vs-null.html

 

(6).引用类型

引用类型就是对象,既:object

首先,看两个对象:

ü  数组:array

ü  函数:function

 

除了,array和function之外,其余的对象我们大致可以分为3类:

ü  内置对象,ECMAScrpt本身提供的对象

ü  宿主对象,BOM和DOM提供对象

ü  自定义对象

 

基本的使用:

 

(7).类型转换

 

4.运算符

(1).认识运算符

什么是运算符?

表示某种功能的符号,运算符是用于执行程序代码运算的,会针对一个以上的操作数来进行运算。

 

JS都提供了哪些运算符?

(2).如何理解运算符

ü  根据操作数的个数进行分类:一元运算符,二元运算符,三元运算符

ü  优先级:当多个运算符同时进行运算时,优先算哪一个,这就是运算符优先级

ü  结合性:左结合性,右结合性

ü  左值:(了解)

 

如果一个运算符的操作数只有一个,称为一元运算符,或叫单目运算符

如果一个运算符的操作数只有两个,称为两元运算符,或叫双目运算符, 是最多的

如果一个运算符的操作数只有三个,称为三元运算符,或叫三目运算符,js中只有一个

使用如下:

 

优先级的说明

当多个运算符同时进行运算时,优先算哪一个,这就是运算符优先级

代码如下:

 

如果需要改变优先级,或对于优先级不确定时,可以使用():

 

结合性的说明:

根据运算符的顺序,可以分成两种:

左结合性:自左至右

右结合性:自右至左

代码如下:

 

 

左值的说明:

以赋值符号 = 为分界点,能够出现在左边的,称为左值。

 

一般而言,变量可以作左值,字面量(100,‘hello’, true)是不能作左值

(3).算术运算符

ü  +

ü  -

ü  *

ü  /

ü  %

ü  ++

ü  --

 

+ - * /

代码如下:

* / 的优先级是高于+ -

如果优先级相同,具有左结合性。

 

%

取模,取余

 

 

++ 分为前置++ 和 后置++

表示自增

首先,看一个需求,需要将一个数加1,然后赋给其它地方使用:

在js中有很多类似这个的情况,所以js提供了一个++的运算符,专门用来实现+1的操作,如下:

对于++,它只需要一个操作数,所以它是一元运算符,也叫单目运算符。

 

但是++并没有那么简单:

 

++在前,整体表达式的值是一个新值,++在后,整体表达式的值是一个旧值

 

--

表示自减, 和++类似, 道理不多说了。

在实际开发中,++和--用的非常多,尤其在循环中用的最多。

 

最后补充:

+ 和 -  除了可以作为二元运算外,还可以作为一元运算符。

-作为一元运算符时,表示取反操作

+作为一元运算符时,转换成数字

对于一元的+和-,用的不多,但是在某些场合下,也可以使用。

 

 

(4).赋值运算符

在js中,赋值运算符,用=。

大家在读代码时,尽量读作赋值操作,不要读成等于操作

 

注意:等于用==表示,=表示赋值操作

 

赋值运算符是一个二元运算符,需要有两个操作数,赋值运算符的优先级非常低,基本上是最低的。

 

ü  =

ü  +=

ü  -=

ü  *=

ü  /=

ü  %=

 

解释一下,+=,-=等是什么意思 ?

 

重点:

ü  =具备右结合性

ü  =的优先级比较低

ü  =和==的区别

ü  +=可以用于数字或字符串,视情况而定

 

解释一下,i=j=k=10?

有两层含义:

其一,赋值运算符具有右结合性,首先就是将10赋给了k,这个时候k就等于了10;

其二,赋值运算符有副作用,副作用是这个赋值的表达式本身也具备一个值,也就是意味着,k = 10, 这个赋值表达式,本身也有值,这个值就是10

 

代码的理解相当于:

第一步:i=j=k=10,此时k的值为10, 将k=10整个替换成10

第二步:i=j=10,此时j的值是10,将j=10整个替换成10

第三步:i=10

 

 

 

 

(5).关系运算符

作用:用来进行比较的。比较的结果通常是布尔值。

 

==   ===

!=   !==

>    >=

<    <=

 

== 相等运算符,使用两个==表示

要判断两个变量的值,是否相等,如果相等,返回真,否则返回假

 

在使用==运算符时,是不需要考虑类型的,只要两个变量的值是相等的,就返回true:

 

如果我们想判断两个变量的值相等,数据类型也相等,这个时候,我们就可以使用全等:===

 

小结:

ü  =表示赋值运算符,右结合性

ü  ==表示相等运算符,只判断两个变量的值是否相等

ü  ===表示全等运算符,不只判断两个变量的值是否相等,还判断两个变量的数据类型是否相等

 

!=   和   !==

!=是==反操作   !== 是===反操作

 

在实际开发中,== === !=使用比较多, !==使用比较少。

 

> >=  <  <=和数学比较是类似的。

 

注意细节:

1,使用==和!=,可以对所有的类型进行比较

2,但是>, >=,< <=的时候,只是针对数值进行比较。如果要比较字串要使用函数

 

(6).逻辑运算符

在js中有三个逻辑运算符

ü  && 逻辑与

ü  ||  逻辑或

ü  !  逻辑非

 

 

A, &&

逻辑与操作,表示并且的意思,AND,表示两个或多个条件同时为真时,整体结果才为真。

 

以两个变量为例,进行说明:

 

运算规则如下:

表达式1

表达式2

结果

true

true

true

true

false

false

false

true

false

false

false

false

 

&&和||是二元运算符

它们的优先级比较低,比赋值的要高,比关系运算符要低

 

B, ||

逻辑或,或者的意思, OR

对于多个条件,只要有一个条件为真,那么结果就为真,,只有所有的条件都为假时,结果才为假。

 

运算规则如下:

表达式1

表达式2

结果

true

true

true

true

false

true

false

true

true

false

false

false

在两个操作数中,只要有一个为true,结果就为true, 只有当两个都为false时,结果才为false。

 

 

C,!

逻辑非,取反操作,NOT

逻辑非是一个单目运算符,只有一个操作数

规则如下:

表达式

结果

true

false

false

true

 

 

一元运算符的优先级要比二元,三元运算符的优先级都要高。

 

深入理解逻辑运算符:

先看两个问题:

第一个:

 

第二个:

 

我们应该从三个层次去理解(以&&为例说明):

ü  第一层理解:操作数都是布尔值的时候,只有二者都为true的时候,结果才为true,否则为false。

 

ü  第二层理解:&&可以对真值和假值进行运算,如果两个都是真值,则返回一个真值,否则返回一个假值。但是,真值并不限于true, 假值也并不限于false, 下面这些值会转换成false(其它值都转化成true):

undefined

null

0 / -0

NaN

“”

在js中,进行&&操作,结果并不总是true和false, 而是当前的值。当前的值可能是数值,也可以是字符串。

如果第一个表达式为真,那么就以第二个表达式的值作为结果,这个结果不是转换之后的值,而是它本身。

如果第一个表达式的值为假,那么就以第一个表达式的值作为结果,这个结果也不是转化之后的值,而是它本身。

 

ü  第三层理解:运算过程,首先计算左操作数的值,如果计算结果为假值,则整个表达式结果就为假值,也就是左操作数的值。同时停止右操作数的求值。如果左操作数的结果为真值,则整个结果依赖于右操作数的值。

 

关于短路运算的说明:

在&&和||运算时,如果第一个表达式的值已经能够确定整个运算结果,那么第二个表达式就不会执行,类似于比赛中5局3胜,如果一方已经胜了3局,那么后面的比赛就不必进行了。

 

好好理解下面代码:

 

或和与具有相同的原理,只是运算的规则不太一样。

 

对于||而言,

如果第一个表达式的值为真值,结果就是第一个表达式的值,这个值不是转化之后的值,而是这个值的本身。

如果第一个表达式的值为假值,结果就是第二个表达式的值,也不是转化之后的值,而是这个值的本身。

(7).位运算符(了解)

(8).其它运算符

ü  字符串连接运算符 +

ü  三元运算符 ?=

ü  逗号运算符,

ü  获取类型 typeof

ü  删除属性 delte

ü  检测对象类 instance of

ü  测试属性是否存在 in

ü  返回空 void

 

字符串连接运算符 +

使用+表示字符串连接:

字符串连接运算符是一个二元运算符。

如果两个操作数都是字符串,很简单,就是将两个字符串连接在一起。

如果两个操作数是数值上,也比较简单,那么就是将两个数值进行一个算术的加法运算。

 

如果有一个操作数是数值,另一个操作数是字符串,怎么办?

直接按字符串连接运算符进行操作:

 

 

结论:

只要有一个操作数是字符串,那么就表示进行的就是字符串的链接操作。

 

+=呢?

 

问一个问题:++x和x = x+1的区别?

++x, 只能是数值

x=x+1, x可以是数值,也可以是字符串

 

三元运算符

在js中,有且仅有一个元运算符,就是?:

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

运算规则:如果表达式1的值为真,那么结果就是表达式2,否则结果为表达式3.

 

三元运算符,能够简化我们的代码,实际上相当于if...else...语句。

 

?:的优先级较低,并且是右结合性。

 

typeof

typeof是一个运算符,不是一个函数,也可以加括号

typeof只能区分出原始值(number, string, boolean, undefined)和对象, array返回的是object , null返回也是object, 函数则返回function(特殊)

(9).类型转换

思考:

 

在js中,如果是一个二元运算符,有个规则:就是要保证两边的操作数的数据类型一至。对于上面的a+s1,两边的数据类型没有保持一至,这个时候就违反了这个规则,如果还要遵循这个规则,就涉及到了js中的类型转换问题:

 

对于a+s1,我们要保证两边的操作数的数据类型一至,有两种方式:一种是让a转换成字符串,一种是让s1转换成数值。

 

关于类型转换,有两种方式:

ü  强制转换

ü  隐式转换

 

一般只是针对基本数据类型进行转换。

 

强制转换

使用Boolean()、Number()、String()或Object函数

在转换数值的时候,parseInt()和parseFloat()函数更加灵活。

 

在使用Boolean(),Number(),String()函数时,函数的首字母必须大写。

 

如果仅仅对数字进行转换,我们还可以使用如下两个函数:

parseInt:转化成整数, 10进制

parseFloat:转成小数

注意:Number和parseInt之间有区别?parseInt可以将以数字开头的字符串转成数值,转换规则就是将数字开头的连续的数字提取出来,直到碰到字符为止,后面的都被截掉。

 

 

隐式转换

让变量参与运算,就可以实现隐式转换。我们大部分人都不会察觉到。

 

ü  如果 + 运算符的一个操作数是字符串,它将会把另外一个操作数转换成字符串

ü  !运算符将其操作数转换为布尔值并取反,故可以使用!!来转换

ü  对于数值,如果转换结果无意义,则返回NaN,如var n = 1 - 'x'

 

== 相等运算符,也会进行一个类型转换

实际上,undefined和null是不同的数据类型,我们在==比较时,需要进行类型转换,undefined和null不能互换,这个时候,两者都转换为一个中间值----false

 

有一点需要强调:

不管是强制还是隐式转换,它们都不会去改变原来变量的数据类型。

 

下面这些值会被转换成false,其它都转换成true:

ü  undefined

ü  null

ü  0 / -0

ü  NaN

ü  “”

 

转换规则表,如下:

 

5.表达式

(1).什么是表达式

任何有值的内容都是表达式

一个表达式会产生一个值,它可以放在任何需要一个值的地方,比如a=3中的3就是一个表达式,a=3整体也可以作为一个表达式。

 

 

 

理解:=的副作用

如果给一个变量或属性赋值了,那么使用这个变量或属性的表达式的值都会发生变化。

i = k = j = 1;

 

常见的表达式有:

ü  原始表达式

ü  运算符构成的表达式

ü  对象和数组初始化表达式

ü  函数定义表达式

ü  调用表达式

ü  对象创建表达式

 

只要在能放在 赋值符号 的右边的内容,通通都是表达式。

 

(2).原始表达式

原始表达式

ü  它是表达式的最小单位,它们不再包含其他表达式。

 

常见的原始表达式有:

ü  直接量 (如 1.23"hello")

ü  关键字 (如true false null this)

ü  变量 (如i,sum,undefined)

ü   

(3).运算符构成的表达式

运算符表达式

由运算符构成的表达式,如:

ü  算术表达式

ü  关系表达式

ü  逻辑表达式

ü  赋值表达式

 

(4).对象和数组初始化表达式

 

(5).函数定义表达式

(6).调用表达式

由于调用函数,它会返回一个值,所以它是一个表达式。

(7).对象创建表达式

 

 

三.语句

1.什么是语句

概念:在JS中表达式是短语,语句就是整句或命令。

作用:表达式是用来计算个值的,语句是用来发送某条指令。

特征:用分号结尾。

 

js中有哪些语句?

ü  表达式语句

ü  复合语句

ü  声明语句

ü  条件语句

ü  循环语句

ü  跳转

 

2.表达式语句

具有副作用的表达式,就可以形成一个语句,需要我们加上分号。

3.复合语句

注意:

在使用了{}之后,就不需要再添加分号了。

4.声明语句

var和function都是声明语句,它们声明或定义变量和函数。

声明语句本身什么也不做,但它有一个重要的意义,通过创建变量或函数,可以更好的组织代码的语义。

 

 

5.条件语句

世间万物都脱离不了三种结构:

ü  顺序结构

ü  选择结构

ü  循环结构

 

顺序结构,是指我们的代码书写顺序,自上向下挨个执行。

 

在实际开发中,只有顺序结构,还不能满足我们的需求,这个时候就有分支结构和循环结构。

 

分支结构对应到js中,就是分支语句,换句话说,我们是使用条件语句来实现分支结构。

 

循环结构对应到js中,就是循环语句,换句话说,我们是使用循环语句来实现循环结构。

 

对于条件语句,是指在执行代码时,需要根据相应的条件执行。

 

在js中,提供4种关于条件语句的写法:

ü  if

ü  if...else

ü  if...else if ... else

ü  switch

(1).if语句

格式:

 

基本使用:

 

if语句使用细节说明:

1,关键字是if, 然后if后面有一个(), 中间有无空格都可以

2,在()中,可以写各种表达式,可以是原子表达式,也可以是复杂表达。

3,{}可有可无,如果在{}里面只有一条语句,这个时候有无{}, 没有区别。

如果在{}里面有多条语句,那么没有{}时,无论条件表达式是真还是假,最终除了第一条语句,后面的语句都会执行。

 

         4,if条件,在没有{}情况下,它只对后面的一条语句起作用。对后续的语句没有约束力。

 

最佳实践:

我们在写if语句时,尽量加上{},哪怕只有一条语句,

(2).if...else语句

双分支,二选一的情况

格式:

基本使用:

 

在实际开发中,if中的表达式,通常是类似于下面的一些写法:

 

关于if...else...双分支,我们还有一个简化的写法:使用三元运算符。?:

(3).if...elseif ...else语句

多分支语句,多选一。

 

基本使用:

 

注意点:

1,在js中,else和if要分开写,不能连写

2,在js中,else .. if 多分支,本质上是if..else.. 的一个嵌套使用,只不过可以用简化的写法,让程序更简洁一点。

(4).switch

swidth也是js中针对多分支提供的一种语句。

格式:

在switch中,有四个关键字:switch , case, break , default

对应用到了三种符号:()  {}   :

 

基本用法

 

注意的细节:

1,如果满足某个条件后,后续的都不进行判断和处理,使用break结束。如果没有break,当一个case条件成立时,执行当前case中的代码,然后继续下一个case。

2,只要写switch,我们最好添加一个default分支,哪怕空着也行。

3,在switch中,我们在判断时,使用的是===,不是使用==, 所以需要注意,类型也要相等。如下:

6.循环语句

我有一个需求:我要输出1到100这100个数。

 

在JavaScript中,循环语句有如下几种:

ü  while

ü  do...while

ü  for

(1).while循环

格式:

 

基本使用:

 

注意细节:

1,在循环体中,一定要修改循环变量的值,否则将陷入死循环。

2,循环变量的初始化一定要放在while之前。

3,while这个关键字之后有一个(), 表示要判断的一个条件,里面就是一个条件表达式。

4,循环体,要使用{},也可以不使用{},但是如果不使用{},那么循环体就只有一条语句,建议大家任何情况下都加上{}。

(2).do...while循环

基本上和while是一至的。

格式:

 

基本使用:

 

注意细节:

1,循环变量的初始化要放在do之前

2,在循环体中,需要去修改循环变量的值

3,循环体要使用{}包括起来,形成一个语句块

思考:while和do...while的区别?

1,do...while的循环体一定会执行一次,while循环体可能一次也不执行

 

在实际开发中,while的使用频率要远远高于do...while。

 

 

(3).for循环

这个非常重要,使用频率也是最高的。

格式:

 

基本使用:

 

流程图:

 

从代码(图)中可以看出:

1,表达式1就是var i=1; 只执行一次,表达式2执行了101次,表达式3和循环体都执行了100次。

2,由于表达式1只执行了一次,所以经常将变量的定义和初始化工作都放在表达式中。

 

注意细节:

1,for关键字后面有个(),()中有三个表达式,必须要有三个表达式,表达式之间用;隔开,所以必须要有两个;

2,省略表达式1:

3,省略表达式3:

4,省略表达式2:

 

尽管三个表达式都可以省略,一般不这样做。

 

for循环和while循环如何选用?

大部分情况下,两者是一样的。

for循环通常针对循环次数确定的循环,while循环通常是针对循环次数不确定的循环。

 

(4).多重循环

在实际开发中,经常需要用到多重循环,尤其是二重循环。

不管是for还是while都可以实现二重循环,但是for用的较多:

 

使用for循环,打印出九九乘法表:

 

代码如下:

 

百钱买百鸡:

今有鸡翁一,值钱伍;鸡母一,值钱三;鸡鶵三,值钱一。凡百钱买鸡百只,问鸡翁、母、鶵各几何?

 

7.跳转语句

在JavaScript中,跳转语句有如下几种:

ü  break

ü  continue

ü  标签语句

ü  return

 

其中,标签语句已经灭绝了,而return语句是在函数中体现的,现在就学习break, continue。

 

break: 跳出循环(或switch)

continue:继续

 

正常情况下跑步,如图:

 

中到第6圈时,跑不动了:

在循环中,break可以提前终止循环。

 

continue的作用:终止当前循环,进行下一次循环。

 

break和continue有什么区别?

break(浅尝辄止)终止循环, continue(锲而不舍追女孩)终止当次循环,进行下一次循环

 

一般情况下,我们会在循环语句中使用break和continue,配合if语句来使用。有一个特殊情况,就是在swich语句中使用break, 跳出当前的swithc语句。

 

 

 

四.函数初步

函数在js中,是一等公民,它在js的地位非常重要。

所以在js课程体系中,分成两块:

ü  函数初步

ü  函数高级

1.认识函数

回顾一下,我们在前面学习的js中用到了哪些函数?

ü  alert();

ü  parseInt();

ü  parseFolat();

 

再回顾一下,在初中数学中学过函数。

 

编程中的函数也是模拟数学中的函数的,数学中的函数能够揭示一些规律,后续凡是用到了这些规律,可以用一种方法来解决  ---- 重用性

 

对于一个函数,如y=x2,  y=x每给定一个值,经过函数运算后,得到一个结果y

 

从三个方面来认识函数

ü  函数是一个代码段

ü  函数是一类数据

ü  函数是一个对象

 

函数的作用

ü  代码重用

ü  作为构造器,用于生成对象

ü  用于组织代码

2.函数定义

ü  函数声明

ü  函数表达式

 

第一种:函数声明,使用function关键字,基本格式:

 

基本使用:

函数定义完之后,并不会自动的执行,需要调用才可以执行函数中的代码。

函数调用也非常简单:函数名(参数), 核心小是括号。

 

注意细节:

1,定义函数,需要使用关键字function, 关键字之后和函数名之间需要空格。

2,函数名称和定义变量的名称规则是一样的:

a, 大小写区分,在定义普通函数时,首字母小写,如果有多个单词,采用小驼峰命名法。

b, 函数名不能以数字打头, 可以使用一些特殊符号,如_,$

3,函数名称后面是小括号,必不可少,用来装载形式参数

 

 

第二种:函数表达式

 

注意细节:

1,将function整体,放在赋值运算符右边,作为表达式来使用。

2,通过一个变量来引用当前的function,使用后续使用。

3,函数名可以加上,但是只对函数内部起作用。如图:

 

函数声明和函数表达式有什么区别?(重点)

函数声明:

 

我们能不能先去调用函数,再去声明函数:

 

函数表达式

我们能不能先去调用函数,再去声明函数:

 

得出结论:对于函数声明,我们可以把函数调用放在函数声明前面,对于函数表达式,我们不能将函数调用放到函数表达式前面。

 

 

在js中,我们把使用声明方式来定义函数的这种用法----函数声明提前。

可以这么理解 ,在js中,只有是函数声明,相当于会把函数声明相关的代码放到最前面 。

 

对于函数表达式这种方式,其实它就是一个变量,只不过我们在赋值的时候,是将函数这种数据类型的数据赋给了这个变量。

 

既然是一个变量,那么这就是遵循个规则:变量要先声明,后使用。

 

 

3.函调调用及返回值

关于函数的调用,只需要使用小括号就可以了。

函数名();

 

js中函数调用四种形式:

ü  作为函数、

ü  作为方法、

ü  作为构造函数、

ü  使用call(apply)间接调用

 

作为函数,是最简单的函数调用方式。

ü  自定义的函数调用:f1()

ü  js提供的内置函数:alert(),parseInt(), parseFloat()等

 

作为方法来调用

什么是方法:所谓的方法就是对象中的函数。

什么是对象:现实中,万物皆对象。编程语言中的对象是指包含属性和方法的一个集合。

将函数定义到某个具体的对象上面,然后通过.语法来调用,如:console.log(),window.alert();

 

关于函数的返回值:

我们前面说了,函数就是一个功能,对于个功能,我们可以给这个功能提供原材料,有时候我们也希望这个功能也能给我们返回一个结果。这个时候就涉及到了函数的返回值。类似于数学中y = x,  y = x^2,  y = sin(x), 当我们给这个函数提供个x值时,我们就可以得到一个对应的y值。在编程中也有这样的功能, 这个功能就是return.

 

在parseInt()函数中,一定有个return语句,返回需要的值。

 

如果是我们自已定义的函数,该怎么返回?

 

当不写return时,函数会给我返回一个undefined:

对于没有return的函数,我们可以这样理解:在一个函数中,最后一定有个return语句, 默认就是return undefined.

 

return只能出现在函数中,不能出现在函数外:

 

在一个函数中,执行到return语句时,后续的任何代码都不会执行:

 

如果写了reutrn,但是return后面什么也没写,返回的也是undefined:

 

 

 

4.函数参数

榨汁机:

榨汁机是一台机器,提供榨汁的功能。

榨汁过程:

首先需要放点东西:苹果+水, 橘子+水,香蕉+水葡萄+水

启动开关

得到对应果汁

 

现在我们模拟这个过程:

 

在定义函数和调用函数时,涉及到了两个参数:

ü  形式参数:简称为形参,表示在定义函数时指定的参数,表示在传入什么样的值

ü  实际参数:简称为实参,表示在调用函数时给出的参数,具体的某个值。

 

案例:定义一个函数,这个函数的功能是求两个数的和:

正是由于有了参数这个武器, 所以我们的函数才得以重用。

 

实际上,在js中比较特殊:

在定义和调用函数时,对形参和实参要求的没有那么严格。

形参和实参的个数,可以不相等,程序不会出错,但是结果可能出问题:

 

在js没,对于形参,没有数据类型的要求:

 

实际上,js是一门弱数据类型的语言,具体体现在:

ü  变量在声明的时候,是不需要指定类型的

ü  函数的中函数,在声明的时候,也是不需要指定类型

 

还有一个知识点:arguments,这个知识点,咱们用到的时候再说!

 

 

 

5.作用域

什么是作用域?

首先,作用域是针对变量而言,要定义一个变量,那么个变量就有相应的作用域。

换句话说,作用域就是指变量的生效范围,在程序中,是指在什么范围可以访问,什么范围内不能访问。

 

在js中,作用域是以函数为界:

ü  全局作用域--->全局变量

ü  局部作用域--->局部变量

 

全局变量:指在函数内外都可以访问

局部变量:指只能在函数内部被访问

 

在js中是没有{}块作用域。

 

局部作用域(在函数中):可以访问全局变量,可以访问当前作用域中的局部变量

全局作用域(在函数外):是不能访问局部作用域中的变量的。

 

 

 

 

五.对象

对象在js,很重要,分两阶段:

ü  对象的初识

ü  面向对象

1.初识对象

什么是对象?

在js中,一切皆对象。

 

对象,在生活中是可见和不可见的东西,在世界中, 是指客观存在的一切物体。如:桌子,电脑,饮水机.......

 

在生活,我们是怎么去描述一个对象的?

描述电脑:

静态的特征:颜色,屏幕尺寸,CPU, 内存, 硬盘,显卡, 系统......

动态的特征:玩游戏,发信息,上网,拍照.....

 

描述班长:

静态特征:姓名,身高,性别,体重,籍贯...

动态的特征:跳舞,画画,开车....

 

我们在描述一个对象时,通常会从两个方面描述:

ü  静态的特征

ü  动态的特征

 

把静态的和动态的特征放在一起,就成了对象。

 

在js中,静态的和动态的通通称为对象的属性。

如果是静态的特征,就是变量的形式出现

如果是动态的特征,就以函数的形式出现,那么这里的函数,我们习惯上叫它方法。

 

基本对象:

在调用对象的属性和方法时,使用点语法

格式如下:对象.属性()    对象.方法()

 

重新理解:console.log():

console是一个对象,表示开发者工具的控制台,该对象有多个方法,log就是其中的一个方法,它的作用就是向控制台输出信息。

 

在js中,对象通常会分成三类:

ü  本地对象(Number, String, Boolean, Date)

ü  宿主对象(BOM, DOM)

ü  自定义对象

 

手册:

本地对象

 

宿主对象:

 

 

自定义对象,根据我们自己的需要来定义。

 

2.object

object, 物体, 对象的意思

object是js中所有对象的祖先

 

如何创建object(两种方式)

ü   字面量(直接量)

ü   构造器

 

字面量:

 

 

 

 

 

使用第二种方式创建一个对象:

 

new关键字

 

 

Object是所有对象的祖先。

其它对象的创建方式和object有类似之处,它们都有两种方式创建。

 

Object这个对象里面有个方法,是toString, 用的比较多, 它会被后代对象所继承,所以说,它的后代对象里面有这个方法。

3.date对象

Date对象是js内置的对象

作用:提供关于日期相关操作

实例化格式:

 

 

在Date这个对象里面,有常见属性和方法:

ü  Date()

ü  getDate()

ü  getDay()

ü  getFullYear()

ü  getHours()

ü  getMinutes()

ü  getSeconds()

 

 

案例:

 

4.单体内置对象

和Date对象不太一样,单体内置对象有一个特殊的地方, 就是不需要实例化,就是不需要new,那么它就是单体内容对象。

 

Math:数学的意思

功能:提供了数学相关的一些运算

 

代码:

 

floor:地坂

ceil:天花板

round:周围

 

有一个非常重要数学函数, random()

随机一个小数,范围[0 , 1), 包括0, 不包括1

 

需求:随机一个[0, 50)之间的整数。

 

需求:随机个[50, 100)的整数。

 

为什么叫单体内置对象?

那是由于,只要我们的js开始运行时,Math这个对象就常驻内存,可以直接使用,不需要实例化。

5.自定义对象

 

 

六.数组

1.什么是数组

数:数字,数值,数据...

组:一组,多个的,由多个成员构成的一个集体

数组:由多个构成的有序集合

值就是前面我们讲过的这些数据类型(各种数据类型都可以)

 

在数组中,每一个值都称为一个元素。

每一个元素在数组中的位置,我们称为索引,用数字来表示,从0开始。

 

js中数组的一些特性:

1,JavaScript数组是无类型的,数组元素可以是任意类型。

2,数组元素可以是任意值,包括对象和数组。

3,JS中的数组是动态的,根据需要它们会增长或缩减。

4,数组元素的索引不一定是连续的,它们之间可以有空缺。

5,JS中的数组是对象的特殊形式,但是它是经过优化的,效率会更高。

2.创建数组

在js中,创建数组有两种方式:

ü  直接量(字面量)

ü  new的方式

 

直接量(字面量)

 

new的方式

 

注意:

1,数组直接量中的值不一定是常量,也可以是任意的表达式

2,如果省略了某个元素,省略的元素将被赋预undefined

 我们在定义一个数组时,要尽量避免这种情况

 

3,数组直接量允许有可选结尾的逗号

4,new Array()等价于[],创建了个空数组, new Array(n),表示创建指定长度的数组,数组中没有索引和元素。

当new的时候,只有一个参数时,需要注意参数的数据类型。

如果参数是数值类型,那么就意味着创建了指定长度为该值的一个空数组。

 

3.数组基本操作

说到数组的操作,一般都会涉及到增删改查。

 

利用数组的索引,可以进行相关的操作。

 

如果想获取指定索引的元素

格式: 数组名[索引]

如:

 

增加:

 

修改:

 

对于添加和删除,我们还有一些其它的方式,重点撑握:

 

添加元素:push(推)和unshift(shift是去掉,unshift是增加)

删除元素:pop和shift

 

添加:

push, 在数组后面追加新的元素,如下:

push追加多个元素:

 

unshift, 在数组的前面插入新的元素,如下:

unshift追加多个元素,如下:

 

删除:

pop:删除数组中最后一个元素

 

shift:删除数组中第一个元素

 

删除操作和添加操作不太一样:

pop和shift没有参数,每一次只能删除一个

pop和shift方法返回的是被删除的元素。push和unshift返回的是一个新的数组的长度:

 

 

 

 

 

4.数组长度

每一个数组都有一个length属性,用来表示数组的元素个数(长度)

 

在数组中肯定找不到一个元素的索引值大于或等于数组的长度

 

如何理解?

在数组中肯定找不到一个元素的索引值大于或等于数组的长度,为了维持此规则不变,数组有两个特殊的行为:

ü  如果为一个数组元素赋值,它的索引i大于或等于现有长度时,length的值将设置为i+1

ü  当设置length属性为一个小于当前长度的非负整数n时,当前数组中的那些索引值大于或等于n的元素将从中删除

 

第一句话的理解:

 

第二句话的理解:

5.数组遍历

遍历:把数组中的所有元素,挨个取出来,然后进行相应的操作,那么这个获取每一个元素的过程,就是遍历,也叫做一个遍历的过程。

 

在js中遍历数组有两个方法:

ü  for循环  --- 传统的遍历方法,用的最多

ü  forEach方法 --- ES5中新增的方法

 

 

for循环遍历:

需要结合哪几个条件,才能完成数组的遍历?

ü  fo循环

ü  数组的长度, length属性

ü  使用数组名[索引值]获取每一个元素

 

注意:不要使用for ... in去遍历数组,因为for ... in是遍历对象的

 

6.多维数组

前面我们学习的都是一维数组。

在实际开发中,经常会使用二维数组或多维数组。

 

但是,js中,并不存在真正的多维多维数组,多维数组是通过一维数组和一些特性模拟出来的。

 

js中元素可以是任意数据类型。

 

如果我们在数组中存在了一个元素,这个元素刚好是一个数组,那么就得到了二维数组。

 

 

问题1:如何去访问这些元素?

 

问题2:如何去遍历这个二维数组?

 

7.数组方法

查看W3C, 大至有如下方法:

 

常见方法如下:

ü  join

ü  reverse

ü  concat

ü  sort

ü  slice

ü  push和pop

ü  unshift和shift

ü  toString

 

join

将数组中的元素,使用某种符号连接起来,形成一个字符串。

注意,可以省略join中的参数,如果省略,默认就是使用逗号连接。

 

reverse

将数组中的元素,顺序倒置:

使用reverse,数组是立即发生变量。

 

concat

连接多个数组,形成一个新的数组,可以理解成合并

注意:如果数组中的元素,又是一个数组,它不会展开。

 

sort

排序, 用于对数组中的元素进行排序

sort方法,默认情况下,是按照ascii来排序的,从小到大进行排序。

在具体排序时,是一个字符一个字符进行比较,如果第一个字符能够分出胜负,就是它为准,如果第一个字符相同,那么就进行后续的比较,依次类推。

 

sort方法,允许我们传递一个参数,这个参数是一个函数,我们只可以通过这个函数来定义排序规则。

解释:这个自定义函数是如何编写的?

在定义这个规则时,我们需要两个参数。

两个数字在排序时,比如:6,5,如何排序?需要从低到高排,判断两者的大小,以决定是否需要交换位置。

a-b,如果a-b, 则返回true, 些时二者就需要交换顺序,结果就是大的排在后面,小的排在前面。所以这种情况,就是从小到大的一种排序。

反之,就是从大到小的排序。

 

slice

切割的意思,用来截取数组中的片段

格式:arr.slice(start, end)

返回一个新的数组,包含从start到end(不包含这个end元素)

start, end是索引值

 

练习:

 

注意细节:

1,在使用slice时,必须要确保start<end,否则结果就是空数组。

2,如果我们省略了end, 那么就表示截取到最后一个元素。

3,start和end可以为负值,负数表示从后向前截取。如果是负数,只需要使用负数+length转成正数

-4+6=2   -2+6=4  slice(2,4);

 

toString

是从object继承过来的,意思是将数组转化成字符串,如下:

 

使用数组相关的知识,完成如下案例:

 

分析:

当点击下一张时:

 

 

结构和样式代码如下:

 

js代码如下:

 

 

 

七.字符串

1.创建字符串

ü  字面量

ü  new方式

 

字面量方式:

直接使用引号就可以,单引号,还是双引号都可以:

 

new方式:

2.字符串常见操作

ü  获取字符串长度 -- length属性

ü  字符串连接 -- concat

ü  查找 -- charAt、charCodeAt、indexOf、lastIndexOf、search

ü  截取 -- substr、substring、slice

ü  大小写转换 -- toLowerCase、toUpperCase、

ü  替换 -- replace

ü  转数组 -- split

 

length属性

字符串的长度,字符的个数

 

concat

字符串连接,和+差不多

 

charAt

char是字符的意思, at表示在某个位置

可以将字符串看作字符数组,是有索引的,可以通过charAt(索引)获取其中的某个字符

 

charCodeAt

和charAt类似,但是它不是获取这个字符本身,而是获取这个字符对应的ascii码

 

indexOf

根据字符,获取索引位置,和charAt刚好反过来

注意:indexOf, 自左至右, 找到的是对应的第一个字符的位置。

 

lastIndexOf

和indexOf类似,它是自右向左来查找第一个字符出现的位置

注意:是从右向左,但是索引值仍然是自左向右的

 

search

search真正强大的地方是正则表达式。

 

substr

substr(start, length), 第一个参数表示开始位置,第二个参数表示截取的长度

 

substring

substring(start, stop), 第一个参数表示开始位置,第二个参数表示结束位置

 

slice

 

toLowerCase, toUpperCase

大小写转换

 

 

replace

可以实现字符串的替换操作

注意:默认情况下,replace只替换一次, 真正强大的地方,也是在正规表达式中

 

split

转数组

注意:字符串得有一定规律才能转换成数组。

 

数组和字符串是可以互换的。

 

实际上,字符串本身就可以作为一个数组来使用

原创粉丝点击