JavaScript

javascript 

定义:

JavaScript(简称“JS”) 是一种具有函数优先的轻量级,解释型或即时编译型的编程语言。

虽然它是作为开发Web页面的脚本语言而出名的,但是它也被用到了很多非浏览器环境中,JavaScript 基于原型编程、多范式的动态脚本语言,并且支持面向对象、命令式和声明式(如函数式编程)风格。

一.数据类型:

分为两大类:原始类型和引用类型。

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

1.数据类型转换

分为强制转换和隐式转换

(1)强制转换

  • 强制转换成数值型

Number()中  字符串中包含数字、布尔类型、null 都会强制转换成数值型

Number('3') //3
Number(true) //1
Number(false) //0
Number(null)  //0
Number(undefined) //NaN
Number('3a')  //NaN
  • 强制转换成整型

parseInt()

通常用于小数和字符串为整型,其他的数据类型转换成NaN

parseInt(3.94)  //3
parseInt('6.18')  //6
parseInt('8a')  //8
parseInt('a8')  //NaN
  • 强制转换成浮点型

parseFloat()

用于将字符串型转为浮点型

parseFloat('3.14') //3.14
parseFloat('6.18a') //6.18
parseFloat('a6.18') //NaN
  • 强制j将数值和布尔型转换成字符串型

toString()

var num=2;
var num1=true;
var str=num.toString()//'2'
var all=num1.toString()//'true'

 (2)隐式类型转换(在运算过程中进行转换)

1.数值加字符串

2+‘1’ // ‘21’

  • 数值加布尔型

1+true //2

1+false //1

  • 布尔型加字符串

true+'1'//  '2'

2.运算符

运算符分为: 算数运算符、比较运算符、位运算符(了解就行,所以就不展示了)、赋值运算符、三目运算符

  • .算数运算符

  +     -     *     /   %    ++     --

注释: % 取余   9%2=1

 ++自增   让变量在原来的基础上进行加一

 -- 自减    让变量在原来的基础上减一;

var b1=1;
//先执行赋值,再执行自增
var b2=b1++; //b1=2 , b2=1
var c1=4;
//先执行自增,再执行赋值
var c2=++c1; //c1=5, c2=5
  • 比较运算符

    >      <     >=     <=      ==等于    !=     ===(全等于)

   ==   等于     比较两个值是否相等  只是比较值

  === 全等于   比较值和类型   两个都相同结果才是true

     数字与字符串比较  将字符串隐式转换为数字进行比较

    字符串之间比较    比较 首字母的Unicode码大小

3>'10'// false     
'3'>'10'//true     
3>'10a' //false
3<'10a' //false
3=='10a' //falsez
注释 :NaN和任何值比较 ( >  <  >=  <=  ==  === ) 结果都是false
  • 逻辑运算符

&&            ||            !

&& :逻辑与  两者皆为true  ,结果为true;

|| :逻辑或  两者有一为true ,结果为true;

!  :   取反;

 

  • 短路逻辑

&&:两者有一为false,不再执行第二个;

||:如果有一为true,不再执行第二个;

短路逻辑主要是看第二行是否执行,无需关注整体是true or false;

  • 位运算符

链接:https://www.cnblogs.com/Steeland/p/7142158.html

  • 三目运算符

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

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

如果条件为true ,执行表达式一

如果条件为false,执行表达式二

二、浏览器端函数

alert()弹出警示框

prompt ()弹出输入框 需要使用保存用户输入的值。类型是字符串类型,如果点击取消浏览器页面显示空白,控制台显示null

 

三、控制端

程序=数据+算法

程序的执行:顺序执行、选择执行、循环执行

  • 流程控制

(1)if 语句

注释:以下数据作为条件会发生隐式转换(数据类型中查看)为false(0,NaN,   ' '  , undefined null ;

(2)if-else 语句

//属于多项判断语句
if(条件表达式1){
  语句块1
}else  if(条件表达式n){
  语句块n
}else{
  语句块n+1  //以上所有的条件都是false
}

  

(3)switch case语句

//属于特殊的多项分支语句,只能进行全等于的比较
switch(表达式){
  case 值1:  //用表达式和值1比较    表达式===值1
    语句块1
    break; //结束,跳出switch-case
  case 值n:
    语句块n
    break;
  default:
    语句块n+1   //以上表达式和每一个值比较都是false
}

  

  • 循环:

循环的两个要素

    循环条件:控制循环是否往后执行

    循环体:要重复执行的代码

(1)while循环

(2)break

在循环中使用,用于强制结束循环,不再执行任何循环的代码

(3)do-while 循环

do{
    循环体
  }while(循环条件);

(4)for循环

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

 (5)continue和break

break:结束循环,不再执行任何循环代码

continue:跳过某一次循环,不再执行本次条件下的循环

  • 循环嵌套(第一次接触可能很难理解,注意多练习,多思考)

在一个循环体内的内部有出现其他的循环

任意两个循环直接相互嵌套

注释:我会在最后添加相关的练习题 。

  • 函数

Number()/parseInt()/parseFloat()...

四、函数分为系统函数和自定义函数

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

(1)创建函数

 

function 函数名称(){
    函数体 —— 封装的重复执行的代码
  }

 

(1)函数调用

函数名称()//执行函数体中的代码

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

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

 创建函数时的参数称为形参,调用函数时的参数称为实参,实参会赋值给形参,实参的数量和形参的数量可以不匹配,如果形参未赋值则值为undefined

 

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

return用于返回函数调用后的结果;如果函数中没有return或者return后不加任何值,则结果为undefined,

 

1-等待付款  2-等待发货  3-运输中  4-已签收  5-已取消  其它-无法追踪

  对比return和break
return用于函数中,结束函数的执行
break用于switch-case和循环,结束对应语句的执行
 
3.变量的作用域
 全局变量:在全局作用域下声明的变量,可以在任意的作用域下访问到
 局部变量:在函数作用域下声明的变量,只能在当前的函数作用域下访问到
 函数内不加var声明的变量是全局变量
变量声明提升:程序执行前,会将var声明的变量提升到所在作用域的最前边,只是声明提升,赋值不提升
 
4.递归
在函数内调用自身这个函数,本身是一个循环,用来解决循环问题。
在递归的使用:需要有边界条件,结合着return;同时递归函数前也需要加return,为了把最终的值传递给外层
注释:js属于单线程运行,深层次的递归嵌套会对CPU要求比较高
5.匿名函数
function(){}
函数名称 以及 函数名称+()的对比
   函数名称:本质上就是一个变量,保存了一个函数
   函数名称():在调用函数,执行函数中的代码,得到函数的返回值
函数声明函数表达式 的不同
  函数表达式在函数的整体提升,可以先写调用在写创建
  函数表达式指示变量声明提升,必须先写创建在写调用
 
   五、 对象及数组API
1.检测对象是否含有某个属性
 对象.属性名===u'ndefined   存在 false   不存在 true
 对象.hasOwnProperty('属性名') 存在 true  不存在  false
 ‘属性名’ in 对象   存在  true  不存在  false
 
2.对象中的方法
方法对应的就是一个函数
var person={
  play: function(){
     this //指代调用方法play的对象
  }
};
person.play();

3.原始类型和引用类型数据的存储

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

引用类型:将数据存在堆内存中 。同时会生成一个地址,把地址存储在栈内存中

 
引用类型数据如果不被任何的地址所引用就会自动销毁
null:表示空地址,不指向任何堆内存数据
直接给引用类型赋值为null,即可销毁引用类型数据
  •    数组
数组就是一组数据的集合,每个数据称为元素
(1)数组字面量创建数组
   [元素1,元素2...]  可以存放任意类型数据
(2)访问数组元素
   数组[下标]
下标:自动为每个元素添加编号,0及以上的整数
如果元素不存在则为undefined
(3)数组的长度
数组.length  获取数组元素的个数据
数组[数组.length]=值   在数组的末尾添加元素
(4)构造函数创建数组
new Array(3) 创建数组,初始化长度3,可以添加更多元素
new Array(元素1,元素2...)
(5)数组的分类
索引数组:以0以上整数作为下标
关联数组:以字符串作为下表,需要单独的添加每个元素,无法使用length属性获取长度
(6)数组的遍历
循环访问数组中的每个元素
循环 —— 推荐方法
for(var i=0;i<数组.length;i++){
  i  代表下标
  数组[i]  下标对应的元素
}

 六 、API

## 数组和对象混合使用 数据结构 [{...},{...},{...}]  

一个对象包含一种事物的相关属性,而一个数组包含多个对象

 ## 数组遍历   

1. for..in   key  索引数组: 表示数字下标  关联数组: key是字符串变量

2. for循环  只限制于索引数组

 ## 数组API(数组中定义好的一些方法,我们可以直接使用)

1. .length      获取数组的长度  数组最大的下标是数组长度-1

2. .concat()    数组的拼接,返回一个新数组                  

3. .join()      数组转为字符串,还可以按照指定的分隔符转化   

4. .toString()  数组转为字串                              

5. .sort()      排序(顺序,降序),默认Unicode码          

括号中只能接受函数(比较,应该具有2个参数),规定排序顺序

 sort(function(a,b){

   return a-b  顺序

   return b-a  降序

})

5. .reverse()   反序                                                

 

6. 添加/删除元素                    

- 头部/尾部的添加

头部: unshift()  返回数组的新长度(改变原来的数组)

尾部: push()     返回数组的新长度 

 

- 头部/尾部的删除

头部: shift()   返回删除的元素

尾部: pop()     返回删除的元素

 

7. .slice       数组元素的截取                           

1个参数情况: 代表开始点位置,从指定位置开始截取,一直截止到结尾,包含开始点位置内容

正数: 从左往右找位置, 从左往右截取,一直到结尾

负数: 从右往左找位置, 从左往右截取,一直到结尾

当超出范围是,如果是正数,返回空数组,如果是负数,返回全部内容

 

2个参数情况: 代表开始点 结束点,从指定位置开始截取,一直到指定位置结束,包含开始点位置内容,但不包含结束点位置内容

全为正数: 从左往右找位置, 从左往右截取,一直到结束点,不包含结束点位置内容

 

一正一负: 从右往左找位置, 从左往右截取,一直到结束点,不包含结束点位置内容

总结:在写题目前了解题目的需求,根据不同的题目要求应用各类循环和if判断,不同的题目有不同的解法,可以尝试用多种方法解决。提升思维逻辑性。

# 数组API

1. .splice()              

删除/添加数组元素,会改变原数组

一个参数:相当于开始点

正数: 从左往右寻找位置,从当前下标删除,从左往右删,一直删到结尾

负数: 从右往左寻找位置,从当前下标删除,从左往右删,一直删到结尾

 

两个参数: 相当于开始点和个数

正数: 第一参数表示开始位置,第二参数表示长度,而不是下标,从左往右寻找位置,从当前下标删除,从左往右删

一正一负:  第一参数可以是正/负数,但是第二参数应当是正数,从右往左寻找位置,从当前下标删除,从左往右删

 

多个参数:例子(arr.splice(1,3,'小艺','小宇')) 会改变原来元素索引的位置,删除和添加同时存在

 

2. .includes()           

检测数组中的值,如果存在返回true,不存在返回false,大小写敏感,不涉及数据类型转化

当.includes() 存在第二参数时,表示从该位置进行搜索,

如果是正数,从左往右找位置,然后在从左往右找存不存在内容,

如果是负数,从右往左找位置,然后在从左往右找存不存在内容,

 

  1. .indexOf()第一次出现的位置  
  2. .lastIndexOf() 最后一次出现的位置     

   如果找不到返回-1, 存在第二参数,代表开始检索的索引位置

 4. .reduce 高阶函数    

对数组中的所有元素调用指定的回调函数,该回调函数的返回值为累积结果, 在下一次调用回调函数时,上一个回调函数的返回值会做为参数提供

简单理解: 此方法可以接受一个函数作为累加器,对数组中的所有元素调用这个累加器,最终得出结果

高阶函数是一个函数,它可以接受函数作为参数或者把函数作为返回值

语法: arr.reduce(callback(previousValue[累加器],currentValue[正在处理的元素],[currentIndex[当前索引],array[数组]...]))

 5. 后续~ 在第三阶段中还会学习到关于数组更多的骚操作

盘点学过的数组API:concat sort includes slice splice  join pop push shift unshift reverse toString indexOf()  lastIndexOf()

# 数组API

flat() 所有数组中的元素以递归方式连接到指定深度(把数组展平)

如果参数填写 infinity表示不管有多少层嵌套(不管是多少维数组)都变成一维数组

 # 字符串对象及API   

字符串是一个原始类型,对象是引用类型,将原始类型包装成对象后就可以像引用类型一样,拥有属性和方法

 1. 创建

   字面量    var str = '小艺';

   构造函数   这2个内容用起来没什么区别

   var str = new String(2);   对象

   var str = String(2);       字符串

 

2. 访问  字符串名[下标]

 

3. 转义符 \   一种引用单个字符的方法  是字符的一种间接表达形式,在特殊语境中,无法直接使用字符自身,可以使用转义符

退格符      \b

换页符      \f

垂直制表符   \v

换行符      \n    \u000A  unicode值

转义\       \\

...

单双引号的包裹关系  不能包裹其自身,但是可以互相包裹

 

## 字符串API

1. .length属性 求字符串长度  转义符,空格都会被计算

 2. toUpperCase()  字符串大写           

 3. toLowerCase()  字符串小写         

 4. trim()         

去除2边的空格,内容空格去不掉

 5. indexOf()      

返回指定字符串第一次出现的的位置,找不到返回-1,默认从0开始,也可以从指定位置出查询

 

 6. lastIndexOf() 

返回指定字符串最后一次出现的的位置

 

 7.charAt()       

获取下标对应的字符串, 如果下标不存在返回空字符串,如果填写不存在的字符串类型下标,会返回第一个字符串内容

 

8.  search()        

字符串查找,元素第一次出现的位置,找不到返回-1,且大小写敏感,可以通过/i来忽略大小写,支持正则表达式

 

9.  repeat()  

# 字符串API

1. charCodeAt()             

返回指定位置的字符串unicode码,括号内需要一个大于等于0,小于字符串长度的整数,如果不是数值默认为0     

 

2. slice()                   

按照下标截取,不同参数个数,情况不同,参数的正负也会影响结果

一个参数的情况下: 代表开始点位置,从指定的位置开始截取,一直到结尾,包括开始点内容

正数: 从左往右找,从左往右截

负数: 从右往左找,从左往右截

超出范围,如果是正数不报错,返回空字符串,如果是负数返回全部内容

二个参数的情况下: 开始点,结束点,从指定的位置开始截取,包括开始点,不包括结束点

 3. substr尽管没有被严格废弃,但是不建议在生产中使用,应该用substring()代替

 4. substring                 

按照长度截取,不同参数个数,情况不同,参数的正负也会影响结果

一个参数的情况下: 代表开始点位置,从指定的位置开始截取,一直到结尾,包括开始点内容

正数: 从左往右找,从左往右截

负数: 返回全部内容

超出范围,如果是正数不报错,返回空字符串,如果是负数返回全部内容

 

二个参数的情况下: 

1,如果2个参数的值一样,返回空字符串

2,任意一个参数小于0或者为NaN都会被当做0

3,如果开始点大于结束点,执行效果类似于2个参数位置互换

4,如果任意参数大于字符串长度,仍然会默认最大字符串长度

 

5. split                   

将字符串按照一定的格式分割,分割后变成数组

1,分割后分隔符消失,不会出现在数组元素中

2,如果不写参数或者如果指定的分隔符不存在, 直接把整个字符串作为数组的1个元素返回

3,字符串中的具有一定意义的字符也可以作为符号来分割

4,可以指定分割次数,如果超出次数或者为负数,默认返回最大分割数量的数组元素,

5,默认大小写敏感,可以通过 /i 来取消

6. replace           

字符串替换,不会改变原来的字符串,括号可以使用正则表达式

默认执行1次(/g,全局搜索)且大小写敏感(/i)

 

七、ES6

 ECMA

 ECMAScript   ES6  是JS的第六套标准规范

 JQuery

 ES2021  ES2020  

 (1)块级作用域

  let声明的变量不存在变量声明提升,不允许重复声明。

  大括号{}之间的语句块就是块级作用域,例如:for,if,else...

  块级作用域下,let和const声明的属于局部,不能被外部访问。

 对比var、let、const var声明的变量存在变量声明提升,允许重复声明 let和const声明的变量不存在提升,
不允许重复声明 const声明后必须赋值,不允许重新赋值 var声明的变量不存在块级作用域,
let和const声明的存在块级作用域 var在全局作用域下声明的变量是全局变量 let和const声明的在任何作用域下都不是全局的

 (2)参数增强   可以给参数设置默认值,如果没有提供实参会自动使用默认值

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

  b=b||0;  //ES6之前的写法

}

add(8000)

(3)箭头函数   简化了匿名函数的写法,不等价于匿名函数   ()=>{   }  arr.sort( (a,b)=>{   return a-b; } )

如果箭头函数的函数体中只有一行代码,并且是return形式的可以进一步简化为    arr.sort( (a,b)=>a-b )   

(4)模板字符串   解决了字符串的拼接   `  反引号之间的内容就是模板字符串 ${JS表达式}  `

 

 

  

 

 

posted @ 2021-09-09 15:30  野居青年  阅读(113)  评论(0)    收藏  举报
/*鼠标跟随效果*/ /* 点击爆炸效果*/ /* 鼠标点击求赞文字特效 */