JavaScript基础(三)

流程控制

while循环语法

while(条件){

​ 循环体

}

dowhile语法

do{

​ 循环体

}while(条件)

while do while 的区别

while:先判断条件是否成立,然后执行循环体

do while :新执行一次循环体,在判断条件

如果初始条件不成立,do while 会执行一次循环体

for 和while 和do while的区别

知道循环的次数,优先考虑for循环,如果知道的是循环的条件用while或者do while

循环里的跳转语句

​ break:跳出当前所在的 整个循环

​ continue:跳出当前循环,如果条件满足,继续执行下一次循环。

数组

用来存储一系列相同或相关的容器

定义数组

  • var arr=[ ]

    初始化数组元素

数据类型(object)

初始化数组元素

声明的同时进行赋值

var arr=[ 1,2,3,4,5,6]

声明之后进行赋值、

var arr=[]

arr[0]=1,arr[1]=2

访问数组元素

通过下标的方式进行访问

var arr=[1,2,3,4,5,6]

arr[0],arr[1]

下标

下标从0开始

下标范围:0-length-1

允许 越界访问,不会报错,没有赋值,默认undefined

注意

数组长度是可变的

数组可以存储任意的数据类型

数组元素的默认值是undefined

属性/方法

属性:属性值是一个初始数据类型

方法:属性值是函数

数组去空:数组非空元素放到另一个数组

如何能够快速的实现任意行,任意列的表格?

**函数(function)

实现某一个特定功能的代码片段,重复调用。

优点:代码的逻辑结构清晰

​ 方便维护

定义一个函数

基本语法:

function functionName([形参1],[形参2]……){
​ //函数体

​ [turn] 返回值,

​ []:可有可无

自变量/字面量

​ var variable=function([形参1],[形参2]……){

​ //函数体

​ []return] 返回值,}

对象的方式

调用一个函数

函数名+()functionName();

变量名+()variable();

注意

alert(tan) 变量值 tan()调用函数

自变量方式声明的函数存在覆盖,先声明,后调用

基本语法声明的函数,在声明前后都可调用,也存在覆盖

+++基本语法和自变量声明同一个函数,赋值之前进行调用基本语法声明的函数

​ 赋值之后调用自变量声明函数

函数的参数

参数能够动态的改变函数体内部的变量,函数更加灵活,更加强大

形参

函数定义时候,()里写的变量,接收实参

实参

函数调用时,()里的值,用来给形参传递值

参数可以是任意的数据类型*

参数的个数

​ 个数相同,从前往后,一一对应

​ 实参少于形参,多余的形参默认undefined

​ 实参多于形参,多余的实参,用argument对象接收

argument对象

​ argument:用来接收参数的详细信息,

​ 在函数内部js自动创建的一个对象,只能在函数内部调用

​ 函数内部的对象,每个函数里都有,

参数默认值(有些参数,可传可不传)

​ 1 分支结构 if else

​ 2 三元表达式

​ 3 逻辑运算符 ||

​ 4 给一个默认值:function functionName(variable=值){ } 【es6】

注意

​ 形参不要有重复的(重名的)

​ 一般情况,带有默认值的参数写到最后

​ undefined会触发默认参数

rest参数

​ 剩余的参数,当做形参写在函数里面。写在最后面

​ 直接用,就是一个数组

return(返回值)

​ 给函数一个返回值,将函数内部的一个数据返回到函数调用的地方,在函数外部使用函数内部的数据,

​ 如果函数没有返回值,默认是undefined

​ return只能返回一个值,值可以是任意的数据类型

​ return会终止函数的执行,return后面的不执行,

08-02变量的作用域

​ 变量或者函数起作用的范围。

作用域的分类(通过函数划分)

全局作用域

​ 全局变量:任意的地方都能访问到的变量

声明方式:声明在函数最外边的变量

​ 不加关键字var 声明的变量

局部作用域

​ 局部变量:只能在函数内部访问的变量

声明方式:通过var关键字修饰声明在函数内部的变量

形参也是局部变量

        局部变量优势:函数运行结束,局部变量可以节省内存

函数也是有作用域的

局部作用域

环境

宿主环境

​ 浏览器运行的环境

执行环境

​ 决定函数,变量的作用域

​ 变量的作用域是在声明时候决定的,

解析过程

​ 从上往下,按照script标签对依次进行解析

​ 到script标签对里解析关键字,将 var function等放进内存

*调函数(四则运算)

​ 将一个函数作为一个参数进行传递,在另一个函数里面进行调用这个参数,就相当于调用外部的函数,将该函数称为回调函数。

递归(不是循环)(深拷贝/浅拷贝)

​ 函数直接或间接调用自己本身

​ 递归函数必须有一个出口

深拷贝

拷贝的是值

浅拷贝

拷贝的是地址

闭包

箭头函数

var b=num =>num

alert(b(1))

等价于

var b=function(num){

return num

}

alert(b(1))

08-03变量的声明方式(let)

let

块级作用域

​ 1 let只能在大括号里用

​ 2 let声明变量后,不存在变量的提升(声明之前不可调用)

​ 3 暂时性的死区(TDZ)/隐式暂时性死区

4 同一个作用域里,不允许重复声明变量

/ 5 参数不允许用let再声明

​ 6 块级作用域允许嵌套块级作用域

​ 7 全局作用域对var let 都是有效的

const(常量的声明)(默认大写,声明在最前面)

​ 声明后不可修改

​ 声明赋值必须同时进行,先声明后赋值会报错

​ 必须先声明后调用

​ 识别块级作用局,局部作用域

​ 区分大小写

内置顶层函数

数据类型转换(强制数据类型转换)

escape(编码)unescape(解码): 将汉字转换成数字字母特殊字符相结合的

Number(): 0打头表示8进制

​ 布尔值转换成0/1,null转换成0,undefined转换成NaN

​ 字符串里面不识别进制,会删去无用的0

​ 只有数字型字符串,能转换成数字,

String():. 任意数据类型都能转换成字符串数据类型

Boolean: 0 ‘’ false undefined null NaN 转换成false,其余全true

isNaN:(能否转换成数字) true/false

parseInt(将字符串转换成数字) 不识别小数点,不识别进制,会删掉无意义的东西

​ 允许有字符,从开头开始,一直找到第一个非字符结束

​ 以数字 空格 + -开头的字符串才能转换,会忽略掉空格,

​ NaN

parseFloat(转换成浮点数) 识别小数点,只识别第一个小数点,规则和parseInt相同

数据的隐式类型转换

​ 四则运算时会默认调用Number()

​ if while

​ 三元表达式中也存在隐式数据类型转换

对象

类:对象的抽象

对象:一系列属性和方法的无序集合

创建一个对象

​ 1 json(js原生,天然就支持的):let obj={ }

​ 2 构造函数的方式:function phone(){ }

​ let apple=new phone()

​ 3 let a=new object

​ 4 class Person{

​ }

​ let zhangsan=new Person

​ alert(typeof zhangsan)

声明同时进行添加属性和方法

let zhangsan={

​ ‘heught’:180,

​ ‘age’:20

​ //方法

​ ’eat‘:function(){

​ alert(’eat‘)

​ }

}

定义属性

​ 属性名:属性值,‘height’:20,

​ 属性名:属性值

访问属性

​ 对象.属性名 zhangsan.height

​ 对象[‘height’] zhangsan[‘height’]

访问方法

​ alert(zhangsan.eat())

声明之后添加属性和方法

​ zhangsan.xueli=’本科‘

​ alert(xueli)

​ zhangsan.study=function(){

​ alert(’学习‘)

}

alert(study)

构造函数方式

function Phone(){

}

let apple=new Phone();

apple.brand=‘iPhone’

apple.size=’5.5’

apple.color=’red’

//方法

apple.call=function(){

​ alert(‘call’)

}

​ alert(apple.size)//alert(apple[‘color’])

apple.call()

属性和方法在构造函数内部

this.谁来调用构造函数,就指向谁,

class

class Person{

​ constructor(){

​ //属性

​ this.name=‘zhangsan’

​ this.age=20;

​ this.sex=”nan”;

​ }

​ //方法

​ eat(){

​ alert(‘eat’)

​ }

​ play(){

​ alert(‘play’)

}

}

let zhangsan= new Person()

alert(zhangsan.name)

/数字只能用方括号访问/

08-04对象(复合数据类型)

console.dir()输出对象的详细属性

当访问的对象没有该属性,不会报错,显示undefined;

​ 没有方法,会报错

加括号,表示调用方法,不加括号,表示调用属性

对象遍历

​ 使用for in i代表字符串,所以用[ ]访问i的值

​ for(let i in zhangsan){

​ console.log(zhangsan[i])

​ }

​ 删除对象的某一个属性或某一个方法:delete 对象.属性/方法

​ 删除一个对象:对象名=null

比较

复合数据类型中,数组,对象,函数比的是地址而不是值

判断一个对象是否从某个函数中实例出来的/是否属于某一个类

​ 1 对象 instanceof 函数名

​ eg:zhangsan instanceof person

​ 2 弹出构造函数(每个对象都对应有一个constructor)

​ eg:alert(zhangsan.constructor == person)

判断是不是一个数组(instanceof / constructor)

​ let arr=new Array()

​ alert(arr instanceof Array)

​ arr.constructor ===Array

原型对象(prototype)

属性和方法可以定义在构造函数里面,也可以定义在构造函数的原型对象(prototype)上面

原型对象上的属性或方法的地址一样

prototype存在代码段里,

​ 类名.prototype={ }

作用

​ 1 用来进行继承,不同对象拥有相同的属性/方法地址

​ 2 可以节省一些空间,习惯把属性写在构造函数中,方法写在原型对象(prototype)上

对象的两个属性

​ 每个对象都有constructor,通过constructor指向构造函数

​ 每个对象上面都有_ _ proto _ _,指向构造函数的原型对象

继承:如果自己构造函数上的,其次原型对象,最后继承父元素的方法属性

_ proto _ 每个对象都有的属性,指向对象的原型对象

prototype:函数才有的属性,指向当前函数 作为构造函数构造出来的的对象的原型对象

08-07

function Student(){
this.name=’aaaa’,
this.sex=’nv’
}
Student.prototype={
study:function(){
alert(‘study’)
},
tall:190
}

    function Person(){
        this.name='zhangsan'
        this.age=20
        this.sex='nan'
        this.say=function(){
            alert(1)
        }   
    }

    Person.prototype={
        say:function(){
            alert(1)
        },
        tall:180
    }
    Person.Hello="hello wlord"               //添加给Person而不是zhangsan,zhangsan不会有hello属性
    Person.prototype = new Student()        //继承Student方法和属性
    let zhangsan= new Person()
    let lisi= new Person()

类如何实现继承

class Person{
class Person{
constructor(){
this.name=’zhangsan’;
this.sex=’nv’
}
}
class Student extends Person{
constructor(){
super(); //将Person中的this实例化出来
// this.age=20;
this.sex=’nan’;
}
}
let zhangsan=new Student();
console.log(zhangsan.name)

js中的内置对象

对象的分类

内置对象

​ Global(理论上的全局对象)

​ Object(顶层对象)

​ Number

​ String

​ Boolean

​ Array

​ Date

​ RegExp(正则)

​ Math

​ Object

宿主对象

​ BOM

​ DOM

Math

本身就是一个对象,不需要new实例化

math中常用方法
console.log(Math.abs(-1)) //绝对值
console.log(Math.round(5.8)) //四舍五入
console.log(Math.floor(5.11)) //向下取整
console.log(Math.ceil(5.11)) //向上取整
console.log(Math.max(1,2,3,4,5,6,7)) //最大值
console.log(Math.min(1,2,3,4,5,6,7)) //最大值
console.log(Math.pow(x,y)) //x的y次幂
console.log(Math.sqrt(9)) //开根号,平方根
console.log(Math.random()) //随机数

let a = [1,3,5,7]
console.log(Math.max(..a))        //相当于把数组a拆开,求最大值(ES6中的扩展运算符)

随机数

//随机数      random(范围0-1,不包括01)
for(let i=0;i<10;i++){
    console.log(Math.random()*10)    // *10表示求0-10之间的随机数
}
//-10-10的随机数,
for(let j=0;j<10;j++){
    console.log(Math.random()*20-10)
}

String

查看对象的属性和方法

​ console.dir()

​ str._proto _

属性:

​ 字符串的length属性是不可写的,不可修改,

console.log(str.constructor)   //构造函数
console.log(str.length)//(只读)字符串的长度,不区分中英文,识别空格(一空格代表一个属性)
方法

查找

str.charAt(1)           //获取特定位置的字符,只能是正数   
str.charCodeAt(n)       //返回指定位置的字符的unicode编码
String.fromCharCode(n)       //返回指定位置的unicode编码对应的字符

位置

str.indexOf('ab' )     //用来返回某字串在另一个字符串中首次出现的位置,找不到返回-1
str.lastIndexOf('ab' ) //用来返回某字串在另一个字符串中最后一次出现的位置,找不到返回-1

存在,返回下标,不存在返回-1

查找

​ str.match(‘ab’)//判断是否包含某元素包含匹配到的元素,位置,返回数组,如果匹配不到,返回null

包含

​ str.includes(‘zhangsan’)//判断是否包含某元素,返回true/false

替换

​ console.log(str.replace(‘str1’,’str2‘)) //只能替换第一个,替换之后原来字符串不会改变

重复

​ str.repeat(num) //重复若干次

​ serch

转换

​ str1.split(字符,length) //把字符串拆分成数组,length用来指定转换之后数组的长度

去空

​ console.log(str1.trim()) //去空,之后对原字符串没有影响

转换大小写

    console.log(toUpperCase())          //转换成大写
    console.log(toLowerCase())          //转换成小写

改变颜色,大小

    document.write('asdf'.fontcolor('red')) //改变颜色
    document.write('asdf'.fontsize(7)) //改变大小

截取

都不会影响原来字符串;

str.slice(start,end) //接收两个参数,开始位置,结束位置,不包括结束位置

​ //不给定结束位置默认截取到最后,支持负数,从末尾开始计数

str.substring(start,end) //和slice一样,不支持负数

str.substr(start,length) //不给定长度,默认截取到末尾

Array(数组)

创建数组

​ let arr=[]

​ 面向对象

  • letarr=new Array(1,2,3,4)

​ 如果构造函数直接接受一个参数,并且这个参数是一个数字,这个数字代表数组的长度

​ 解决方法:Array.of(num)

​ Array.isArray(arr):判断对象是不是数组///constructor///intancesof

属性

constructor //返回构造函数

length //返回 或 设置数组长度

方法

添加或者删除

​ arr.push(1,2,3) //数组的末尾添加一个或多个元素,并且返回新数组的长度,修改数组

​ arr.unshift //数组的开头添加新的元素,返回新数组的长度

​ arr.pop //删除数组的最后一个元素,返回被删掉的元素

​ arr.shift //删除数组的第一个元素,返回被删掉的元素

​ arr.splice(start,num,ele1,ele2…)

​ //万能的添加或删除,start:删除的位置,num:要删除的个数,ele:要添加的元素,返回被删的元素

​ arr.sort //排序,按ASCII码排序

​ arr.sort(function(a,b){

​ return a-b} ) //从小到大排序

合并

​ arr.concat(1,2,,3,) //合并,返回合并后的数组,对原数组无影响 /可传数组,字符串,也可以直接传数组元素

​ arr.push(…[1,2,3] ) //合并,改变原数组 /把数组拆开用

转换

​ arr.join(‘连接符’) //数组转化为字符串,数组通过特定的连接符转换为字符串,默认的是逗号,对原数组无影响

indexOf lastIndexOf
reverse(翻转)

​ arr.reserve //会改变原来的数组

forEach //执行某一个特定的回调函数

arr.forEach(function(value,index,obj){

​ sum +=value

})

接收回调函数 接收三个参数 value(数组元素)index(数组下标)ob(当前遍历的数组)

仅用来遍历,无返回值

​ 遍历:

​ 1 使用循环for

​ 2 for in (i) //代表对应的下标,把数组当作对象

    3  for of (i)//对应的是对象的值,把数组当作对象

​ 4 forEach(function(value,index,obj){})//仅用来遍历,无返回值

判断some every

每一个数组元素都会执行回调函数(判定函数)根据回调函数的结果返回true/false

some只要有一个元素执行回调函数返回true,some返回true

every需要所有都返回true,every返回true

​ let result = arr.some(function(value){

​ return value >0

​ })

映射

得到新的数组,元素数组中的每一个元素调用回调函数,用回调函数的返回值作为新数组的元素

对原数组无影响

arr.map(function(value,index){

​ return value*2 //通过一个数组得到另一个数组

})

筛选

得到新的数组,新数组是原数组的子集,元素数组中的每一个元素调用回调函数,用回调函数的返回值为true的作为新数组的元素,对原数组无影响

arr.filter(funtion(value,index){

​ return typeof value == ‘String’ //返回数组中的字符串

})

箭头函数(一般写在回调函数里面)

1  不可当做构造函数用

2  没有arguements对象,但有...rest参数

​ rest:接收剩余参数

​ arguement:接收所有的参数

​ 3 箭头函数的this由定义的时候决定的,function的this是由调用时候决定的,

arr.filter(value=>value%2==0)

​ 名字 参数 代码块

let fn = (num,num1) =>num+num1

let fn1 = (num,num1) =>{alert(num);alert(num1)} //语句过多,用{ } 包起来,{}不是一个对象

let fn3 = () =>({name:’zhangsan’,age:15}) //用小括号包起来可识别成对象

模板字符串“(制表符)

识别样式,可排成2行 ,可运算,可执行函数

${} 识别变量

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值