发表日期: 2021-05-07 11:19:29 浏览次数:52
兰考400电话申请开通【兰考企业网站建设】兰考微信公众号小程序开发运营价格、兰考微信公众号APP软件客户端设计运营、兰考网页页面设计公司费用、兰考公司网站制作方案流程改版维护大概需要多少钱
兰考,河南省开封市下辖县 [1-2] ,河南省直管县 [2] ,位于九曲黄河最后一道弯 [3] ,总面积1116平方公里 ,总人口85.91万人。 [4] 是河南省“一极两圈三层”中“半小时交通圈”的重要组成部分。 [5] 兰考县在春秋时为户牖邑,秦朝于县北置济阳县是兰考建县之始。公元前5年,汉光武帝刘秀生于县北济阳宫。 [6-7] 9年,改东昏县为东明县。1218年,东明县城被废为通安堡,新县城迁至黄河之北冤句县旧地。1232年,以黄河之南地析置为兰阳县、仪封县两县。1783年3月,考城县县城首次迁至兰考县境内。1825年,仪封县并入兰阳县,称兰仪县,仪封以乡隶之。1909年,为避溥仪帝讳,改兰仪县为兰封县。1954年6月,兰封县与考城县西部合并,以二县首字为名,称兰考县。 [6]
陇海铁路、郑徐高铁穿境而过设兰考站、兰考南站,兰考至菏泽菏兰城际铁路、兰考至菏泽至青岛董家口港铁路、兰考至开封郑开兰城际铁路等即将开工建设。国道G220、G310、G106在县城交汇,连霍高速公路、日南高速公路、兰焦高速公路(规划)在境内交叉而过。距离新郑机场仅1小时,距离连云港仅4小时。 [5]
兰考是泡桐之乡 [5] 、国家园林县城 、国家卫生县城 [8] 、全国文明城市提名城市 [9] 、省级生态县、全国双拥模范县、国家新型城镇化试点县 [10] 、首批国家级生态保护与建设示范区、全国社会信用体系建设综合性示范试点县 [11] 、全国首个普惠金融改革试验区 [12] 、省级可持续发展实验区 [13] 、河南改革发展和加强党的建设综合试验示范县、2019年全国村庄清洁行动先进县 [14-15] 、县城新型城镇化建设示范县。 [16]
77-JS 原型链,原型链的顶端是什么?Object 的原型是什么?Object 的原型的原型是什么?在数组原型链上实现删除数组重复数据的方法
首先明白原型是什么,在ES6 之前,JS 没有类和继承的概念,JS 是通过原型来实现继承的,在JS 中一个构造函数默认带有一个prototype 属性,这个的属性值是一个对象, 同时这个prototype 对象自带有一个 constructor 属性,这个属性指向这个构造函数,同时每一个实例都会有一个_proto_属性指向这个prototype 对象,我们可以把这个叫做隐式原型
我们在使用一个实例的方法的时候,会先检查这个实例中是否有这个方法,没有的话就会检查这个 prototype 对象是否有这个方法
基于这个规则,如果让原型对象指向另一个类型的实例,即constructor1.protoytpe=instance2
这时候如果试图引用constructor1 构造的实例instance1 的某个属性p1,
首先会在instance1 内部属性中找一遍,
接着会在instance1.proto(constructor1.prototype)即是instance2 中寻找p1
搜寻轨迹:instance1->instance2->constructor2.prototype……->Object.prototype;这即是原型链,原型链顶端是Object.prototype
补充学习:
每个函数都有一个prototype 属性,这个属性指向了一个对象,这个对象正是调用该函数而创建的实例的原型,那么什么是原型呢,可以这样理解,每一个JavaScript 对象在创建的时候就会预制管理另一个对象,这个对象就是我们所说的原型,每一个对象都会从原型继承属性,如图:
那么怎么表示实例与实例原型的关系呢,这时候就要用到第二个属性_proto_ 这是每一个JS 对象都会有的一个属性,指向这个对象的原型,如图:
既然实例对象和构造函数都可以指向原型,那么原型是否有属性指向构造函数或者实例呢,指向实例是没有的,因为一个构造函数可以生成多个实例,但是原型有属性可以直接指向构造函数,通过 constructor 即可
接下来讲解实例和原型的关系:
当读取实例的属性时,如果找不到,就会查找与对象相关的原型中的属性,如果还查不到,就去找原型的原型,一直找到最顶层,那么原型的原型是什么呢,首先,原型也是一个对象,既然是对象,我们就可以通过构造函数的方式创建它,所以原型对象就是通过Object 构造函数生成的,如图:
那么Object.prototype 的原型呢,我们可以打印console.log(Object.prototype. proto === null),返回true
null 表示没有对象,即该处不应有值,所以Object.prototype 没有原型,如图:
图中这条蓝色的线即是原型链, 最后补充三点:
constructor: function Person(){
}
var person = new Person();
console.log(Person === person.constructor);
原本person 中没有constructor 属性,当不能读取到 constructor 属性时,会从 person 的原型中读取,所以指向构造函数 Person
proto :
绝大部分浏览器支持这个非标准的方法访问原型,然而它并不存在与 Person.prototype 中, 实际上它来自Object.prototype,当使用obj. proto 时,可以理解为返回来Object.getPrototype(obj)
继承:
前面说到,每个对象都会从原型继承属性,但是引用《你不知道的JS》中的话,继承意味着复制操作,然而JS 默认不会复制对象的属性,相反,JS 只是在两个对象之间创建一个关联,这样子一个对象就可以通过委托访问另一个对象的属性和函数,所以与其叫继承,叫委托更合适。
78-什么是 js 的闭包?有什么作用,用闭包写个单例模式
MDN 对闭包的定义是:闭包是指那些能够访问自由变量的函数,自由变量是指在函数中使用的,但既不是函数参数又不是函数的局部变量的变量,由此可以看出,闭包=函数+函数能够访问的自由变量,所以从技术的角度讲,所有JS 函数都是闭包,但是这是理论上的闭包
还有一个实践角度上的闭包,从实践角度上来说,只有满足
1、即使创建它的上下文已经销毁,它仍然存在
2、在代码中引入了自由变量,才称为闭包
闭包的应用:
模仿块级作用域。
2、保存外部函数的变量。
3、封装私有变量单例模式:
var Singleton = (function(){
var instance;
var CreateSingleton = function (name) {
this.name = name;
if(instance) { return instance;
}
// 打印实例名字
this.getName();
// instance = this;
// return instance; return instance = this;
}
// 获取实例的名字
CreateSingleton.prototype.getName = function() {
console.log(this.name)
}
return CreateSingleton;
})();
// 创建实例对象 1
var a = new Singleton('a');
// 创建实例对象 2
var b = new Singleton('b');
console.log(a===b);
79-promise+Generator+Async 的使用
参考回答: Promise
解决的问题:回调地狱Promise 规范:
promise 有三种状态,等待(pending)、已完成(fulfilled/resolved)、已拒绝(rejected).Promise的状态只能从“等待”转到“完成”或者“拒绝”,不能逆向转换,同时“完成”和“拒绝”也不能相互转换.
promise 必须提供一个 then 方法以访问其当前值、终值和据因。
promise.then(resolve, reject),resolve 和 reject 都是可选参数。
如果 resolve 或reject 不是函数,其必须被忽略. then 方法必须返回一个 promise 对象.
使用:
实例化promise 对象需要传入函数(包含两个参数),resolve 和reject,内部确定状态.resolve 和reject 函数可以传入参数在回调函数中使用.
resolve 和reject 都是函数,传入的参数在then 的回调函数中接收.
var promise = new Promise(function(resolve, reject) {
setTimeout(function(){
resolve('好哈哈哈哈');
});
});
promise.then(function(val){
console.log(val)
})
//then 接收两个函数,分别对应resolve 和reject 状态的回调,函数中接收实例化时传入的参数.
promise.then(val=>{
//resolved
},reason=>{
//rejected
})
catch 相当于.then(null, rejection)
//当then 中没有传入rejection 时,错误会冒泡进入catch 函数中,若传入了rejection,则错误会被rejection 捕获,而且不会进入catch.此外,then 中的回调函数中发生的错误只会在下一级的then 中被捕获,不会影响该promise 的状态.
new Promise((resolve,reject)=>{ throw new Error('错误')
}).then(null,(err)=>{
console.log(err,1);//此处捕获
}).catch((err)=>{
console.log(err,2);
});
// 对比
new Promise((resolve,reject)=>{
throw new Error('错误')
}).then(null,null).catch((err)=>{
console.log(err,2);//此处捕获
});
// 错误示例
new Promise((resolve,reject)=>{
resolve('正常');
}).then((val)=>{
throw new Error('回调函数中错误')
},(err)=>{
console.log(err,1);
}).then(null,(err)=>{
console.log(err,2);//此处捕获,也可用 catch
});
两者不等价的情况:
此时,catch 捕获的并不是p1 的错误,而是 p2 的错误,
p1().then(res=>{
return p2()//p2 返回一个 promise 对象
}).catch(err=> console.log(err))
1
2
3
一个错误捕获的错误用例:
该函数调用中即使发生了错误依然会进入then 中的resolve 的回调函数,因为函数p1 中实例化promise 对象时已经调用了catch,若发生错误会进入catch 中,此时会返回一个新的promise,因此即使发生错误依然会进入p1 函数的then 链中的resolve 回调函数.
function p1(val){
return new Promise((resolve,reject)=>{
if(val){
var len = val.length;//传入 null 会发生错误,进入 catch 捕获错resolve(len);
}else{
reject();
}
}).catch((err)=>{
console.log(err)
})
};
p1(null).then((len)=>{
console.log(len,'resolved');
},()=>{
console.log('rejected');
}).catch((err)=>{
console.log(err,'catch');
})
Promise 回调链:
promise 能够在回调函数里面使用 return 和 throw, 所以在 then 中可以return 出一个promise 对象或其他值,也可以throw 出一个错误对象,但如果没有 return,将默认返回undefined,那么后面的then 中的回调参数接收到的将是 undefined.
function p1(val){
return new Promise((resolve,reject)=>{
val==1?resolve(1):reject()
})
};
function p2(val){
return new Promise((resolve,reject)=>{
val==2?resolve(2):reject();
})
};
let promimse = new Promise(function(resolve,reject){
resolve(1)
})
.then(function(data1) {
return p1(data1)
//如果去掉return,则返回undefined 而不是p1 的返回值,会导致报错
})
.then(function(data2){
return p2(data2+1)
})
.then(res=>console.log(res))
Generator 函数: generator 函数使用:
1、分段执行,可以暂停
2、可以控制阶段和每个阶段的返回值
3、可以知道是否执行到结尾
function* g() {
var o = 1;
yield o++;
yield o++;
}
var gen = g();
console.log(gen.next());
// Object {value: 1, done: false} var xxx = g();
console.log(gen.next());
// Object {value: 2, done: false} console.log(xxx.next());
// Object {value: 1, done: false} console.log(gen.next());
// Object {value: undefined, done: true}
generator 和异步控制:
利用Generator 函数的暂停执行的效果,可以把异步操作写在yield 语句里面,等到调用next 方法时再往后执行。这实际上等同于不需要写回调函数了,因为异步操作的后续操作可以放在yield 语句下面,反正要等到调用 next 方法时再执行。所以,Generator 函数的一个重要实际意义就是用来处理异步操作,改写回调函数。
async 和异步: 用法:
async 表示这是一个 async 函数,await 只能用在这个函数里面。await 表示在这里等待异步操作返回结果,再继续执行。
await 后一般是一个 promise 对象
示例:async 用于定义一个异步函数,该函数返回一个 Promise。
如果async 函数返回的是一个同步的值,这个值将被包装成一个理解 resolve 的Promise, 等同于return Promise.resolve(value)。
await 用于一个异步操作之前,表示要“等待”这个异步操作的返回值。await 也可以用于一个同步的值。
let timer = async function timer(){
return new Promise((resolve,reject) => { setTimeout(() => {
resolve('500');
},500);
});
}
timer().then(result => {
console.log(result); //500
}).catch(err => {
console.log(err.message);
});
//返回一个同步的值
let sayHi = async function sayHi(){
let hi = await 'hello world';
return hi; //等同于 return Promise.resolve(hi);
}
sayHi().then(result => {
console.log(result);
});
兰考400电话申请开通【兰考企业网站建设】兰考微信公众号小程序开发运营价格、兰考微信公众号APP软件客户端设计运营、兰考网页页面设计公司费用、兰考公司网站制作方案流程改版维护大概需要多少钱
备案号: 苏ICP备11067224号
CopyRight © 2011 书生商友信息科技 All Right Reserved
24小时服务热线:400-111-6878 E-MAIL:1120768800@qq.com QQ:1120768800
网址: https://www.768800.com 网站建设:上往建站
关键词: 网站建设| 域名邮箱| 服务器空间| 网站推广| 上往建站| 网站制作| 网站设计| 域名注册| 网络营销| 网站维护|
企业邮箱| 虚拟主机| 网络建站| 网站服务| 网页设计| 网店美工设计| 网站定制| 企业建站| 网站设计制作| 网页制作公司|
400电话办理| 书生商友软件| 葬花网| 调温纤维| 海洋馆运营维护| 北京保安公司| 殡仪馆服务| 殡葬服务| 昌平殡葬| 朝阳殡葬|
欢迎您免费咨询,请填写以下信息,我们收到后会尽快与您联系
服务热线:400-111-6878