js高级

面向过程
理解:亲力亲为

优点:性能高
面相对象
理解:把一个个东西当作对象来使用(对象,往往都是被人封装好的代码)

优点:好维护、复用、拓展

缺点:性能稍低

面向对象和面向过程都是一种思维

类 (构造函数) 模板

对象 具体的事物

		// 构造函数
        function Student(name,age){
            this.name = name;
            this.age = age
        }
        var xzp = new Student('谢志鹏',18)

        // 类  其实就是构造函数的语法糖
        class Ter{
            constructor(name,age){
                this.name = name;
                this.age = age
            }
        }
        var mly = new Ter('玛利亚',38);
        console.log(xzp);
        console.log(mly);
继承super
		class Jun{
            constructor(){
                this.money = 100;
            }
            poxie(){
                console.log('穿破鞋')
            }
        }
        class Lang extends Jun{
            constructor(){
                super()
            }
        }
        var l = new Lang()
        l.poxie()
        var j = new Jun();
        console.log(j.money);
        j.poxie()

注意事项

  1. 每一个class的时候都要注意 都应该拥有一个constructor
  2. 在继承父类的时候,constructor里面第一排就写上super()
  3. 在使用类里面的公用方法或者是属性的时候,前面一定要带this.
  4. 类没有预解析,不会有提升

能够直接插入文本

// div.insertAdjacentHTML(position,txt)
// xxxxxbegin  前面
// beforebegin  外面的前面
// afterbegin  里面的前面
// xxxxxend    后面
// beforeend    里面后面
// afterend    外面后面
显示位置:

beforebegin<div>afterbegin元素beforeend</div>afterend
div.insertAdjacentHTML('beforebegin',p)
静态和实例成员
// 模拟Date构造函数的基本内容
        function Date(){
            // 实例成员
            this.getFullYear = function(){
                console.log(1)
            }
            this.getMonth = function(){
                console.log(2)
            }
        }
        // 静态成员
        Date.now = function(){
            console.log(3)
        }
        Date()
        let d = new Date()
        console.log(d.getFullYear());

        console.log(Date.now());
原型

凡事有构造函数的地方,就默认自动生成一个原型对象

function Student(name){
            this.name = name;
            // this.gf = function(){
            //     // .......
            // }
        }
        Student.prototype.smoking = function(){
            console.log('走,莫西莫西')
        }
        Student.prototype.gf = function(){
            console.log('我绿了')
        }
        let kt = new Student('康涛');
        let xzp = new Student('谢志鹏');
        kt.smoking()
        xzp.smoking()
原形链

就近原则,原形链的图

__proto__


浏览器帮我们写好的一个非标准的方法
原形链的查找规则

就是先从自己开始找,自己没有的再找爸爸要,爸爸没有的再找爷爷要,一级一级往上找的规则就是原形链的查找规则

call
1. 改变this的指向
2. 传递参数
3. 借用函数
构造函数的继承
继承属性
// 1. 父构造函数
        function Father(uname, age) {
            // this 指向父构造函数的对象实例
            this.uname = uname;
            this.age = age;
        }
        // 2 .子构造函数 
        function Son(uname, age, score) {
            // this 指向子构造函数的对象实例
            Father.call(this, uname, age);
            this.score = score;
        }
        var son = new Son('刘德华', 18, 100);
        console.log(son);

类其实就是构造函数,就是一种语法糖

循环

forEach、some、filter、map、every

some  循环数组,只要有一个满足,就返回布尔值
every 循环数组,每一个都满足,就返回布尔值
filter 循环数组,收集满足条件的,返回一个新数组
map  循环数组(数组的加工厂),给数组中的每一项数据进行对应的处理,返回一个新数组
去除字符串两侧的空格
str.trim()
一般都用于获取表单元素里的内容

input.value.trim()或者用正则表达式
数据劫持
Object.definedProperty(目的对象,属性,{
	value  值
	writable 是否可以被修改,false
	enumerable 是否可以被遍历,false
	configurable 是否可以被操作,false
	set(){}
	get(){}
})
默认都是false,但是有一个条件,就是这个属性必须是通过definedProperty创建出来的新属性才具备

借调的几种方式

call、apply、bind
语法:
call
Array.prototype.push.call(调用者,参数,参数2,...)
被借用的方法.call(调用者,参数,参数2,...)
-----------------------------------------

apply
Array.prototype.push.apply(调用者,[参数,参数2,...])
被借用的方法.apply(调用者,[参数,参数2,...])
前面两者都是借用方法使用,但是自己没有这个方法
-----------------------------------------

bind
let fn = Array.prototype.push.bind(调用者,参数1,参数2,参数3,...)
fn()
let fn = 被借用的方法.bind(调用者,参数1,参数2,参数3)
fn()
上面用bind的方法借调的这个方法,只是把别人的方法借用过来,并且复制一份,自己随时可以调用(这里只是复制,没有调用)
严格模式

use strict 之后的所有代码就比较严格

1. 变量必须先声明再使用 let 、const
2. 新增保留字

书写的位置

1. 在所有的 js 的script标签的第一行 写入
2. 在函数内部写入

**

类似于作用域

**

几个基本变化

1. 变量必须先声明再使用
2. 不能删除已经声明好的变量
3. 全局调用的函数里面this 指向 undefined
4. 构造函数必须用new才能调用
5. 函数参数不能有重复变量
6. 函数不能在块级作用域中
高阶函数
===回调函数

把一个函数当作一个参数传递到另一个函数中去执行。

定时器、some、forEach
闭包
概念:有权访问另一个作用域的变量 、跨作用于访问变量

作用:延伸了变量的作用范围
递归
自己调用自己 递归

防止死循环
深浅拷贝
Object.assign(新对象,老对象)  只能够做浅拷贝
var obj = {
    name:'yj',
    age:19,
    arr:[1,2,3,4],
    obj2:{
    	name:'lang'
    }
}
为什么不能做深拷贝呢?

所有的复杂类型数据,都存储在堆中,那么会有一个变量名存储在栈。

如果要进行复杂类型的复制,会出现一个问题!只复制了栈中的地址而不是复制了复杂数据类型的真实数据
深拷贝:

直接复制简单数据类型,发现如果是数组或者对象。创建一个新的数组或者对象,然后再把值依次复制进去

简单的深拷贝(工作)

var obj = {
    name:'yj',
    age:19,
    arr:[1,2,3,4],
    obj2:{
    	name:'lang'
    }
}
简单数据类型
var obj = '{name:"yj",age:"19",arr:"[1,2,3,4]"}'
var obj2 = obj
// 利用了简单数据类型可以直接复制,字符串转对象和 对象转字符串的方法 可以很快的实现深拷贝
var obj2 = JSON.parse(JSON.stringify(obj));
obj2.obj2.name = '骚浪';
console.log(obj,obj2)
正则表达式

匹配字符串中的内容

正则表达式的两种声明方式

var reg = new RegExp('\u4e00-\u9fa5');
var reg2 = /^[\u4e00-\u9fa5]/;

以及最基本的使用方式

//  测试是否是中文 test
			正则表达式.text(需要被测试的内容)   如果存在中文,返回true 如果不存在,返回false
console.log(reg2.test('9999'));
边界类
包含a     /a/
以a开头   /^a/
以a结尾   /a$/
精确匹配a /^a$/
字符类
[] 包含、限定  [ab]
[^] 不包含、取反 [^a]
- 范围   [a-z]
连接 zA  a-zA-Z0-9
量词类
* 相当于 >=0
+ 相当于 >=1
? 相当于 0||1 
{}  自己定义个数
{n} ==n
{n,} >=n
{,m} <=m
{n,m} >=n  && <=m  
优先级
()  把里面的内容看做一个整体
例如:
/abc{3}/  重复3次c
/(abc){3}/ 重复3次abc  把括号内的abc看做一个整体来重复
预定义类
\d 只匹配数字
\D 是\d取反的意思
\w 只匹配字母数字下划线
\W 是\w取反的意思
\s 只匹配空格、换行
\S 是\s取反的意思
修饰符
g 全局
i 不区分大小写
gi  

一般和replace替换一起使用

replace?有什么问题? 每次执行只能替换一次

es6

他是一个集合,2015年后的所有es版本都统称es6

let
  • 作用域范围是块级

  • 先声明再使用

  • 暂时性死区 一个块级内,声明的let变量,只在当前作用域生效,而且外面的变量无法影响到里面

const
  • 块级作用域

  • 声明时必须有初始值

    const a = 1;
    
  • const声明的变量是一个常量,是一个不可以更改的(不能更改地址)

    const obj = {}  这个obj就是一个常量,我们不能够直接替换这个对象 obj.name = '1'
    
解构赋值
数组解构

把数据和对象中的一些数据,提取出来,用一个个的变量保存

let arr = [1,2,3,4,5];  提取出来的时候,就想函数的形参/实参
let [a,b,c,d] = arr
a  1
b  2
c  3
d  4
e  5
f  undefined
对象解构
let obj = {
    name:'yj',
    age:'19'
}
平常使用
obj.name
obj.age
解构
let {name,age} = obj;
解构使用
name
age

如果对象里面的属性很复杂

let objShopDateSeller = {
	objShopDateSeller_a:{},
	objShopDateSeller_b:[]
}
let {objShopDateSeller_a:a,objShopDateSeller_b:b} = objShopDateSeller;
objShopDateSeller_a和objShopDateSeller_b 使用
使用别名之后,直接就可以使用:后面的别名
a和b
箭头函数
function go(name){
	return name
}
// 普通函数转箭头函数
let go = ()=>{return name}
// 规则
// 变量来保存函数
// let go2 = 
// () 放的形式参数,什么时候可以省略() --- 形式参数只有一个的时候
// {} 放函数体,什么时候可以省略{}--- 函数体只有一句话的时候(并且可以帮助我们默认返回return) 
// 如果有return,并且默认一句话,那么可以省略return 和{}
// ()=>{}
let go3 = name => name
// 调用方式
go3('yj')

箭头函数没有this 。如果在箭头函数里面使用了this。这个this属于外面

dom操作是不能用箭头函数的,因为dom操作经常要控制当前元素

剩余参数

获取剩余的参数

let sum = (a,...pppp)=>{
    // console.log(a)
    console.log(pppp);
}
// 剩余参数要比argments更加强大。并且剩余参数是真实的真数组,可以调用任何数组的方法
sum(1,2,3,4,5,6,7,8,9,0)
拓展运算符

能够把数组中的每一项,以逗号形式分隔开

function sum(a,b,c,d){
	return a+b+c+d
}
// 以前的写法
// var a = 1;
// var b = 2;
// var c = 3;
// var d = 4;
var arr = [1,2,3,4];
let a = arr[0];
let b = arr[1];
let c = arr[2];
let d = arr[3];
console.log(sum(a,b,c,d));
// 拓展运算符的写法
// ...arr // 1,2,3,4
console.log(sum(...arr));
let arr1 = [1,2,3];
let arr2 = [4,5,6];
...arr1 //1,2,3
...arr2 //4,5,6
[1,2,3,4,5,6]
[...arr1,...arr2] //1,2,34,5,6
 ...伪数组  , , ,
 再用一个[] 包裹
 [...arr]
Array.from()

能够把伪数组转换为真数组

let 真数组 = Array.from(伪数组)
let 真数组 = Array.from(伪数组,v=>v+1)
find

遍历数组,找到匹配项 返回数组值

let item = arr.find(函数)
findIndex

遍历数组,找到匹配项 返回索引号

let index = arr.findIndex(函数)
函数中,只要匹配了就会返回   返回索引号
incluldes

遍历数组,找到匹配项 返回布尔值

let boolean = arr.includes(内容)
模版字符串
调用函数

使用变量

保存html格式

使用表达式

字符串新方法

startsWith

检测字符串是否以**开头

str.stratsWith('内容') 返回布尔值
endsWith

检测字符串是否以**结尾

str.endsWith('内容')   返回布尔值
repeat

将字符串重复多少次

str.repeat(n)  返回重复后的字符串

新的数据结构----类似于数据 但是他没有重复的项

新增 add
删除 delete
检测是否存在 has
清空 clear
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1 目标检测的定义 目标检测(Object Detection)的任务是找出图像中所有感兴趣的目标(物体),确定它们的类别和位置,是计算机视觉领域的核心问题之一。由于各类物体有不同的外观、形状和姿态,加上成像时光照、遮挡等因素的干扰,目标检测一直是计算机视觉领域最具有挑战性的问题。 目标检测任务可分为两个关键的子任务,目标定位和目标分类。首先检测图像中目标的位置(目标定位),然后给出每个目标的具体类别(目标分类)。输出结果是一个边界框(称为Bounding-box,一般形式为(x1,y1,x2,y2),表示框的左上角坐标和右下角坐标),一个置信度分数(Confidence Score),表示边界框中是否包含检测对象的概率和各个类别的概率(首先得到类别概率,经过Softmax可得到类别标签)。 1.1 Two stage方法 目前主流的基于深度学习的目标检测算法主要分为两类:Two stage和One stage。Two stage方法将目标检测过程分为两个阶段。第一个阶段是 Region Proposal 生成阶段,主要用于生成潜在的目标候选框(Bounding-box proposals)。这个阶段通常使用卷积神经网络(CNN)从输入图像中提取特征,然后通过一些技巧(如选择性搜索)来生成候选框。第二个阶段是分类和位置精修阶段,将第一个阶段生成的候选框输入到另一个 CNN 中进行分类,并根据分类结果对候选框的位置进行微调。Two stage 方法的优点是准确度较高,缺点是速度相对较慢。 常见Tow stage目标检测算法有:R-CNN系列、SPPNet等。 1.2 One stage方法 One stage方法直接利用模型提取特征值,并利用这些特征值进行目标的分类和定位,不需要生成Region Proposal。这种方法的优点是速度快,因为省略了Region Proposal生成的过程。One stage方法的缺点是准确度相对较低,因为它没有对潜在的目标进行预先筛选。 常见的One stage目标检测算法有:YOLO系列、SSD系列和RetinaNet等。 2 常见名词解释 2.1 NMS(Non-Maximum Suppression) 目标检测模型一般会给出目标的多个预测边界框,对成百上千的预测边界框都进行调整肯定是不可行的,需要对这些结果先进行一个大体的挑选。NMS称为非极大值抑制,作用是从众多预测边界框中挑选出最具代表性的结果,这样可以加快算法效率,其主要流程如下: 设定一个置信度分数阈值,将置信度分数小于阈值的直接过滤掉 将剩下框的置信度分数从大到小排序,选中值最大的框 遍历其余的框,如果和当前框的重叠面积(IOU)大于设定的阈值(一般为0.7),就将框删除(超过设定阈值,认为两个框的里面的物体属于同一个类别) 从未处理的框中继续选一个置信度分数最大的,重复上述过程,直至所有框处理完毕 2.2 IoU(Intersection over Union) 定义了两个边界框的重叠度,当预测边界框和真实边界框差异很小时,或重叠度很大时,表示模型产生的预测边界框很准确。边界框A、B的IOU计算公式为: 2.3 mAP(mean Average Precision) mAP即均值平均精度,是评估目标检测模型效果的最重要指标,这个值介于0到1之间,且越大越好。mAP是AP(Average Precision)的平均值,那么首先需要了解AP的概念。想要了解AP的概念,还要首先了解目标检测中Precision和Recall的概念。 首先我们设置置信度阈值(Confidence Threshold)和IoU阈值(一般设置为0.5,也会衡量0.75以及0.9的mAP值): 当一个预测边界框被认为是True Positive(TP)时,需要同时满足下面三个条件: Confidence Score > Confidence Threshold 预测类别匹配真实值(Ground truth)的类别 预测边界框的IoU大于设定的IoU阈值 不满足条件2或条件3,则认为是False Positive(FP)。当对应同一个真值有多个预测结果时,只有最高置信度分数的预测结果被认为是True Positive,其余被认为是False Positive。 Precision和Recall的概念如下图所示: Precision表示TP与预测边界框数量的比值 Recall表示TP与真实边界框数量的比值 改变不同的置信度阈值,可以获得多组Precision和Recall,Recall放X轴,Precision放Y轴,可以画出一个Precision-Recall曲线,简称P-R
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值