web 开发之JavaScript基础

前言:从零开始介绍Javascript。

 

 

JavaScript 是 Web 的编程语言。

所有现代的 HTML 页面都使用 JavaScript。  我就从变量和常量开始吧.

1:常量:用于存储数据,声明后必须赋值,而且一旦赋值不能重新赋值.

const pai=3.1415962

变量:也可用于存储数据,声明后可以不用赋值,赋值后可以再次赋值.

var a

2:数据类型:分为原始类型和引用类型   (在后面再介绍引用类型)

原始类型分为:数值型,字符串型,布尔型,未定义型,空.

①数值型:分为

整型   8进制(以0开头的数值)                     16进制(以0x开头的数字),

,浮点型  3.14e-1(小数点左移一位)  3.14e1(小数点右移一位)                     #可以用type of 检查数据类型

②字符串型 :被引号包含的数据就是字符串型,不区分单双引号 "字符串".charCodeAt()可以查看单个字符串的ascii码序号

③ 布尔型:只有两个值true 和false 可作为条件 可转换为数值1和0

④未定义型:undefined  表示一个空值 例如声明的变量未赋值

⑤ 空:null   常和引用类型的数据一起使用

3,数据类型的转换

(1)隐式转换

  在运算过程中自动产生的转换

  ①数值+字符串   数值转为字符串

    1+'2'  //'12'

  ②数值+布尔型  布尔型转为数值,true -> 1  false->0

    5+true  //6

    5+false  //5

  ③字符串+布尔型  布尔型转为字符串

    '2'+true  //'2true'

'''

加号(+)的作用

执行加法运算

执行字符串之间的拼接,前提加号的两端有一个为字符串'''

所有的隐式转换为数值,自动调用函数Number来完成的

 (2)强制转换

  ①强制转数值 Number()

5种类型转换结果如下:

Number('5')  //5

Number('5a')  //NaN

Number(true)  //1

Number(false)  //0

Number(undefined)  //NaN

Number(null)  //0

NaN(Not  a  Number),不是一个数字,这个是由于转换为数值失败得到的结果NaN和任何的值执行数学运算结果还是NaN。但其类型为number

②强制转整型 parseInt()

   通常将小数和字符串转整型,其它的都返回NaN

转换结果如下

parseInt(3.14);//3

parseInt('5.87');//5

parseInt('5a');//5

parseInt('a5');//NaN

③强制转浮点型 parseFloat()

通常用于将字符串转为浮点型,其它都是NaN

常见转换结果如下

parseFloat('5.1a');//5.1

parseFloat('7');//7

parseFloat('a5.3');//NaN

④数值和布尔型强制转字符串 toString()

⑤强制转为布尔型

以下情况作为条件隐式转换为false

   0  NaN  ''  undefined   null

 

 

 可以这样简写

 

 

4.运算符   (有6中运算符接下来一一介绍)

(1)算术运算符   +  -  *  /   %  ++  --

%   取余

 ++   自增,在原来的基础之上加1

--   自减,在原来的基础之上减1

如题:

var x=3;
var y=5;
var z= x++ + ++y - --x + x++ - y--;    //等价于3+6-3+3-6     (赋值前若等号右端是多个表达式则先运行表达式后再赋值,运算时看符号的先后进行运算,变量在前则先运算后赋值,否则反之)
console.log(z)    //3

(2)比较运算符 >   <   >=   <=   ==(等于)   !=(不等于)   ===(全等于)   !==(不全等于)

 

 等于(==) 比较两者的值是否相同,可能发生隐式转换  如(2=="2")返回的结果是true  就是将字符串进行了隐式转换为Number类型

  全等于(===):先比较类型,然后再比较值,只有两者都相同才是true

(3)逻辑运算符

&&  逻辑与,左右的两个条件都为true结果是true,否则false

  ||   逻辑或,左右的两个条件有一个为true结果是true,否则false

  !   逻辑非,取反!true=false

短路逻辑

    &&   当第一个条件为false的时候,不再执行第二个条件

    ||   当第一个条件为true的时候,不再执行第二个条件

(4)位运算符(了解)

  模拟计算机底层的运算过程,首先将数字转为2进制然后运算,当运算完后再把结果转回成10进制。

&  按位与,  上下两位比较都是1结果是1,否则是0

 

 

 

 |  按位或,上下两位比较含有1结果是1,否则是0      (按位或与上面类似 )

  >>  按位右移,删除最后的n位   (同理这个也是将10进制数字转为2进制右移后转为10进制)

 

 

 

  <<  按位左移,在最后补0    (类似按位右移)

(5)赋值运算符0

=   +=  -=   *=   /=   %= ...

运算赋值:先执行运算,然后再执行赋值

(6)三目运算符

三目运算符有两个运算符连接的三个操作数据或者表达式

  条件表达式   ?  表达式1  :  表达式2

5.浏览器端函数

 alert()   弹出警示(消息)框

 prompt()   弹出提示(输入)框,需要使用变量保存用户输入的值,类型是字符串型;点击取消返回null

6.流程控制

(1)if语句

if(条件表达式){

  语句块

}

如果大括号的语句块中只有一行语句,则大括号可以省略。

 (2)if-else语句

if(条件表达式){

  语句块1

}else{

  语句块2

}

(3)if-else嵌套

if(条件表达式1){

  语句块1

}else if(条件表达式n){

  语句块n

}else{

  语句块n+1 //以上所有的条件都是false

}

 (4)switch-case

属于特殊的多项分支语句,根据表达式的值选择执行对应的语句

switch(表达式){

  case 值1:  //如果表达式的值和case后的值相同,则执行语句块

    语句块1

    break;

  case 值n:

    语句块n

    break

  default:

    语句块n+1   //如果表达式和case后的每个值比较都是false执行default后的语句

}

 表达式在和case后的值比较的过程中只能进行全等于(===)的比较,要求类型和值都相同

(5)

while(循环条件){

  循环体

}

(6)

do{

  循环体

}while(循环条件);

(7)break

 在循环体中使用,表示跳出循环,不再执行任何循环的代码。

(8)

for(初始值;循环条件;增量){

  循环体

}

执行过程为:声明初始值,判断是否满足循环条件,满足进入循环,结束后进行增量,在判断循环条件,满足再进入循环体否则退出循环

(9)break和continue

  break  跳出,结束循环

  continue  跳过循环体部分,还会执行下一次循环

(10)循环嵌套

  一个循环体的内部出现了另一个循环,任意的两个循环都可以相互嵌套

7.函数  :函数分为系统函数和自定义函数

函数:是一个功能体,提供若干个数据,返回处理的结果,用于封装重复执行的代码

(1)创建函数

function 函数名称(){

  函数体 //重复执行的代码

}

调用:函数名称()

 调用函数,就会执行函数体中的代码

 

(2)创建带有参数的函数

 

 

function 函数名称(参数列表){ //用于接收外部传递的数据

 

  函数体

 

}

调用:函数名称(参数列表)

参数:创建函数时的参数称为形参,调用函数时的参数称为实参,实参会赋值给形参,实参的数量可以是0个或者多个,如果形参未赋值则为undefined

3)创建带有返回值的函数

function  函数名称(参数列表){

  函数体

  return 值; //返回值,函数调用后得到结果

}

调用:函数名称()   #除了执行函数体以外,还会得到函数的返回值。

return的作用是返回函数调用后的结果;如果函数中没有return或者return后不加值返回的结果是undefined;函数调用后,就会跳出函数,结束函数的执行

对比break和return

break用于循环和switch-case语句,跳出循环或者switch-case

return用于函数体中,返回函数调用的结果,同时跳出函数

8.变量的作用域

作用域:起作用的范围

 全局作用域:在函数的外部,声明的变量可以在任意的作用域下访问到,叫做全局变量。

 函数作用域:在函数的内部,声明的变量只能在当前的函数中访问到,叫做局部变量。

在函数内不加var声明的变量是全局变量,#不推荐

程序执行前,会将var声明的变量提升到所在作用域的最前边,所赋的值不提升

9.函数的作用域

函数的可访问范围

 全局函数:在全局作用域下创建的函数,可以在任意的作用域下调用

 局部函数:在函数作用域下创建的函数,只能在当前的作用域下调用

函数提升:程序执行前,将整个函数提升到所在作用域的最前边,可以先调用再创建。

10.递归

在函数的内部调用自身这个函数,本身属于死循环

 结合着return,还要有跳出的条件

实例:斐波那契数列

function bar(n){
if (n===1 || n===2)
{
return 1
}
return b(n)=b(n-1)+b(n-2);
}
console.log(5)

11.匿名函数function (){    }

(1)创建函数

函数表达式

var fun=function(){

}

变量名称就是函数的名称

函数声明

function fn(){

}

 函数名称和函数名称()的区别

  函数名称本质是一个变量,保存了一个函数。

  函数名称(),在调用一个函数,执行函数体中的代码,得到函数的返回结果

函数声明和函数表达式的区别

  函数声明创建的函数如function fun(){}存在函数的整体提升,可以先写调用再写创建。

  函数表达式创建的函数如 var  fun1=function(){}只提升变量声明的部分,赋值不提升,必须先写创建再写调用。

 (2)匿名函数自调用  其作用可以防止全局污染(全局变量的出现带来的影响,在任意的作用域下都可以访问到。)

(function(){

  #函数作用域,里边的变量是局部变量

})();

匿名函数的调用方式还可以用一下方式(让人觉得牛逼轰轰的)

 

 

 (但不能用%  *  /  开头)

(3)回调函数

  将函数以实参的形式传递给另一个函数

function 函数名1(形参a){

  形参a() //通过形参来接收传递函数,并通过形参调用传递的回调函数

}

function 函数名2(){  }

函数名1( 函数名2 )

函数名1( function(){} )   #调用匿名函数

12.系统函数

 parseInt()/parseFloat()/Number()

 isNaN()   检测一个数据是否为NaN,首先会自动调用Number

          NaN -> true   不是NaN -> false

 isFinite()   检测一个值是否为有限值   如1/0是个Infinity

             Infinity 无限值  

 eval()    执行字符串中的表达式

13.对象

属于引用类型的数据

 对象是一组属性和方法的集合

(1)JS中的对象

  自定义对象,自己创建的对象   # var bar={}

  内置对象JS提供的对象     var  foo=new Object() 通过调用foo来对对象内的属性或方法增删改

  宿主对象,根据不同的执行环境划分的

(2)使用对象字面量创建

  使用大括号 {  } 创建空对象

  属性名和属性值之间用冒号隔开,多组属性之间用逗号隔开

  如果属性名中含有特殊字符,需要加引号

(3)访问属性

  对象.属性名

  对象[ '属性名' ]

  如果属性不存在,则返回undefined

(4)遍历属性

for(var k  in  对象){

  k  代表每一个属性名

  对象[k]  代表每一个属性名对应的属性值

}

(5)对象中的方法对应的是一个函数

var person={

  name:'huoji',

  fun: function(){

  console.log(this.name);

     #this //指代当前的对象   this.name  可以得到对应属性内的值

  }

};

调用方法  person.fun()

 (6)对象中访问检测属性是否存在

对象.属性名===undefined     true->不存在    false->存在

  对象.hasOwnProperty('属性名')   true->存在   false->不存在

  '属性名'  in  对象     true->存在   false->不存在

(7)假设变量1对应一个对象,如果将变量1赋值给变量2,通过变量2改变对象的属性,那么变量1对应的对象的属性也会跟着改变.  如图

 

 

 

这是因为数据的存储方式不同

原始类型:直接将数据存储在栈内存中

 引用类型:在堆内存中创建数据,然后会生成一个16进制的地址,然后把地址保存到栈内存(变量)中(所以虽然是两个变量名,但是指向是同一个对象)

 null:空地址,也是object类型,不指向任何的对象; 如果把一个对象设置为null,可以用于销毁引用类型的数据,释放内存空间,加快运行速度。

(8) 补充个小知识如何判断一个对象是否为空

①判断遍历+判断

②将对象转为数组通过长度判断

var obj={};
var arr = Object.key(obj);
console.log(arr.length==0)  //trun 证明为空否则反之

14.数组  是一组数据的集合,每个数据称为元素

(1)数组字面量创建数组

  var arr=[ 元素1, 元素2.... ]

  每个元素是一条数据,可以保存任意类型的数据。

(2)访问数组元素

  下标:数组自动为每个元素添加的编号,从0开始

  数组名[下标]    //得到下标对应的数据

 (3)数组的长度

  数组.length  获取当前数组元素的个数

  可以通过得到的长度在数组的末尾添加元素   数组[ 数组.length ]=值

(4)内置构造函数创建数组

  var 数组名=new Array(元素1,元素2...)   //创建数组添加元素

  var 数组名2=new Array(3)   //创建数组,并初始化长度为3,可以添加更多个元素

 (5)数组的分类

  索引数组:以0及以上的整数作为下标

  关联数组:以字符串作为下标,需要单独的添加每个元素,无法使用length属性获取长度

补充:对象和数组存储数据的时候有什么区别

  对象通常保存一条数据,包含有多个属性。

  数组通常保存一组相同的数据(如 可以保存多个对象)

(6)遍历数组

  依次访问数组中的每个元素

用 for--in

for(var k  in  数组){

   k  每个元素的下标

   数组[k]   每个元素

}

------------------------------------

用循环

for(var i=0;i<数组.length;i++){

   i  每个元素的下标

   数组[i]   每个元素

------------------------------------

for ---of  遍历

var arr = ['张三','李四','王麻子','王钢蛋'];

for (var v of arr){
//v代表arr 内的元素
console.log(v);

}

 (7)API

  应用程序编程接口:JS中预定义好的一些函数或者方法

区分两个名字相同的方法是不是同一个方法:看所在的对象是不是同一个类型(例如对象.slice()和字符串.slice())

数组.toString()   将数组转换为字符串

数组. join( '分割符' )   将数组转换为字符串,可以指定元素之间的分割符号

数组1.concat(数组2,数组3)   拼接多个数组

数组.slice(start, end)   截取数组中的元素,start开始的下标,end结束的下标,如果end为空截取到最后,如果下标为负数表示倒数;返回格式为数组

 数组.splice(start, count)  删除数组中的元素,start开始的下标,count删除的数量,count为空表示删除到最后,下标为负数表示倒数;返回删除的元素,格式为数组;原数组会发生变化。

数组.reverse()   翻转数组元素

数组.sort()  对数组中的元素进行排序,默认是按照首个字符Unicode编码从小到大排序

sort( function(a,b){

  return a-b;//按照数字从小到大

  //return b-a;//按照数字从大到小

} )

数组.push()   往数组的末尾添加元素,返回数组的长度

  数组.pop()   删除数组末尾的一个元素,返回删除的元素

  数组.unshift()   往数组的开头添加元素,返回数组的长度

  数组.shift()   删除数组开头的一个元素,返回删除的元素

  数组.indexOf()   查找某个元素,如果存在返回下标,不存在返回-1

(8)

二维数组

  对一组数据进行二次分类

    [  [ 元素1,元素2 ],  [元素1,元素2]  ]

  访问方式:

    数组[下标][下标]

15.字符串对象

包装对象:为了让原始类型数据像引用类型数据,具有属性和方法,JS中有3种包装对象, 分别是字符串对象、数值对象、布尔对象

var str=new String( )   将数据转为字符串,返回对象

 String( 数据)   将数据转为字符串,返回字符串    // 推荐

(1)转义字符 \ 转换字符本身的意义

\'     斜杠单引号 讲单引号转义为普通字符

\n   转义为换行符

\t 转义为一个制表符(tab键),及多个连续空格

(2)字符串对象的API

str.length  获取字符串的长度

str.charAt(下标)   获取对于下标的字符 等价于 str[下标]   效果一样

str.charCodeAt()   获取首个字符的Unicode码

str.indexOf('查找内容')   查找某个字符串第一次出现的下标,找不到返回-1

str.lastIndexOf('查找的内容')   查找某个字符串最后一次出现的下标,找不到返回-1

 str.toUpperCase()  将所有英文字母转大写

str.toLowerCase()  将所有英文字母转小写

str.slice(start, end)  截取字符串,start开始的下标,end结束的下标,end为空截取到最后,如果下标为负数表示倒数。

str.substr(start, count)   截取字符串,start开始的下标,count截取的长度,count为空截取的最后,下标为负数表示倒数。

str.split('分割符')   按照指定的分割符将字符串切割为数组

(3).匹配模式

  用于字符串的查找和替换

 str.search(/规则内容/i)   查找满足条件的第一个,返回下标,找不到返回-1

  str.match(/规则内容/ig)   查找满足条件的所有的,返回数组

  str.replace(/规则内容/ig, 要替换的内容)     查找并替换

 / 两斜杠间用于写规则 /

  i   ignore   忽略大小写

  g   global   全局查找,找所有的

16.Math对象  不需要创建对象,可以直接使用API 直接得到值

Math.PI  获取圆周率

Math.abs()    获取绝对值

Math.ceil()    向上取整   如Math.ceil(3.14)  得到值为4    Math.ceil(-3.14) 得到值为-3

Math.floor()    向下取整  如Math.ceil(3.14)  得到值为3     Math.ceil(-3.14) 得到值为-4

Math.round()       四舍五入取整

Math.pow(x,y)       x的y次方     如Math.(2,3)   2^3 二的3次方

 Math.max()  获取一组数字的最大值

Math.min() 获取一组数字的最小值

Math.random()  获取一个0到1的随机数 不包含1,包含0

17. Date 对象   用于对日期的存储和计算

(1)创建

var d= new Date(''2020/12/16 10:50:30'')     //得到的时间是相对于0时区的时间 '2020/12/16 02:50:30'

var d = new Date(2020,11,16,11,30,50)        //其中的月份11代表12月份   若填12则代表下一年的1月   月份范围0~11 代表1~12月

var d= new Date()    //得到当前操作系统的时间(相对于0时区的)

var d=new Date(1608336000000)   //存储的是距离计算机元年的毫秒数,产生一个对应的日期时间  2020-12-19T00:00:00.000Z

(2)获取时间的方式

以var d=new Date(1608336000000)  得到的时间为例   2020-12-19T00:00:00.000Z

d.getFullYear()     //获取年2020

d.getMonth()    //     得到值为11    加1为真实的月份值

 类似的d.Date/Hours/Minutes/Seconds/Milliseconds(毫秒)

getDay   获取星期0~6  代表星期日~星期六

getTime   获取距离计算机元年的毫秒数

(3)转为本地字符串格式   //仅用于调试 有兼容性问题

d.toLocaleString()   //显示当前(本地时间)包含年月日时分秒

d.toLocaleDateString()    //显示当前的年月日

d.toLocaleTimeString()   // 显示当前的时分秒

(4)设置

 d.setFullYear/Month/Date/Hours/Minutes/Seconds/Milliseconds(毫秒)   //设置年月日时分秒  但无法设置星期

setTime  设置距离计算机元年的毫秒数,会产生一个新的日期时间

var d1=new Date();

//拷贝Date对象

var d2=new Date(d1)

这样操作可以保留原来的时间操作变更时间  如直接将变量赋值  更改其一 另一个也会更改

18.Number对象

new Number()   将数据转为数值型,返回对象

 Number()   将数据转为数值型,返回数值

 toFixed(n)   将一个数字保留小数点后n位

19.Boolean对象

 new Boolean()   将数据转为布尔型,返回对象

 Boolean()   将数据转为布尔型,返回布尔型数据

20.错误处理

 (1)常见错误

  语法错误(SyntaxError):不符合语法规范,出现中文符号,缺少括号...

  引用错误(ReferenceError):使用了未声明的变量,变量名称写错

  类型错误(TypeError):使用了未创建的函数或者方法,方法名字写错

  范围错误(RangeError):数据超出了规定范围

  自定义错误 throw 错误内容

 

(2)错误处理

try{

  尝试执行,可能出现错误;一旦出现错误,就执行catch中的语句,不再影响后续代码执行

}catch(err){

  把错误赋给err

  处理错误

}

 21.ES6    全称 ECMAScript 6.0 ,是 JavaScript 的一个版本标准,2015.06 发版。2015年6月, ES6 正式通过,成为国际标准。(这里简单介绍下常用的知识点)

(1)块级作用域 

块级作用域下let声明的变量是局部变量,不允许被外部访问.,与回调函数作用类似可以防止全局污染.

let 声明的变量,不存在变量提示而且同一作用域下不能重复声明同一变量

块级作用域:所有大括号{}之间的语句都可以称为块级作用域如while语句switch语句if  else语句等等

(2)函数增强

可以个函数的形参设置默认值,若没有传递实参则会使用默认值

function ad(a,b,c=0){

return a+b+c;

}

ad(11,22)   //这里没有传递c参数  默认为零.

(3)箭头函数()=>{}

类似于匿名函数,但是不等价于匿名函数

如数组arr的排序写法

arr.sort(function(a,b){return a-b})  可以简写为 

 arr.sort((a,b)=>{

  return a-b

})      

还可以简写为 arr.sort((a,b)=>a-b)

这是因为:如果箭头函数的函数体之间只有一行代码并且是return形式,则可以简化为 sort( (a,b)=>a-b ).

(4)模板字符串

在调用console.log(`  这里可以写模板内容  ${引用内容}   `)通过${}  在大括号内引用外部的变量,函数等等.

 

---------------------------------------------完

 

nodejs传送门https://www.cnblogs.com/CIBud/p/14169722.html

 

posted @ 2020-12-16 22:18  ComeIntoBud  阅读(240)  评论(0编辑  收藏  举报