vlambda博客
学习文章列表

说说mongoDB和MySQL的区别

分享是一种生活的信念,明白了分享的同时,明白了存在的意义。

HTTP状态码

100 Continue 继续,一般在发送post请求时,已发送了http header之后服务端将返回此信息,表示确认,之后发送具体参数信息 200 OK 正常返回信息 201 Created 请求成功并且服务器创建了新的资源 202 Accepted 服务器已接受请求,但尚未处理 301 Moved Permanently 请求的网页已永久移动到新位置。 302 Found 临时性重定向。 303 SeeOther 临时性重定向,且总是使用 GET 请求新的 URI。 304 Not Modified 自从上次请求后,请求的网页未修改过。 400 BadRequest 服务器无法理解请求的格式,客户端不应当尝试再次使用相同的 内容发起请求。 401 Unauthorized 请求未授权。 403Forbidden 禁止访问。 404 NotFound 找不到如何与 URI 相匹配的资源。 500 InternalServer Error 最常见的服务器端错误。 503 ServiceUnavailable 服务器端暂时无法处理请求(可能是过载或维护)。

说说你对Promise的理解

依照 Promise/A+ 的定义,Promise 有四种状态:pending: 初始状态, 非fulfilled 或 rejected.fulfilled: 成功的操作.rejected: 失败的操作.settled: Promise已被fulfilled或rejected,且不是pending另外, fulfilled 与 rejected 一起合称 settled。Promise 对象用来进行延迟(deferred) 和异步(asynchronous ) 计算。Promise 的构造函数构造一个 Promise,最基本的用法如下
var promise = new Promise(function(resolve, reject) { if (...) { // succeed resolve(result); } else { // fails reject(Error(errMessage)); }  });

Promise 实例拥有 then 方法(具有 then 方法的对象,通常被称为 thenable)。它的使用方法如下:promise.then(onFulfilled, onRejected)接收两个函数作为参数,一个在 fulfilled 的时候被调用,一个在 rejected 的时候被调用,接收参数就是futureonFulfilled对应 resolve, onRejected 对应 reject

如何删除一个cookie

1)将时间设为当前时间往前一点。var date = newDate();date.setDate(date.getDate() - 1);//真正的删除setDate()方法用于设置一个月的某一天。

2expires的设置 document.cookie= 'user='+ encodeURIComponent('name') + ';expires = ' + newDate(0)<strong> <em> <b> <i> 标签<strong> 标签和 <em> 标签一样,用于强调文本,但它强调的程度更强一些。em 是 斜体强调标签,更强烈强调,表示内容的强调点。相当于html元素中的 <i>...</i> ;

< b > < i > 是视觉要素,分别表示无意义的加粗,无意义的斜体。em strong 是表达要素(phraseelements)

请解释什么是事件代理

事件代理(Event Delegation),又称之为事件委托。是 JavaScript 中常用绑定事件的常用技巧。顾名思义,事件代理即是把原本需要绑定的事件委托给父元素,让父元素担当事件监听的职务。事件代理的原理是DOM元素的事件冒泡。使用事件代理的好处是可以提高性能

说说网络分层里七层模型是哪七层

应用层:应用层、表示层、会话层(从上往下)(HTTPFTPSMTPDNS传输层(TCPUDP网络层(IP物理和数据链路层(以太网)每一层的作用如下:物理层:通过媒介传输比特,确定机械及电气规范(比特Bit数据链路层:将比特组装成帧和点到点的传递(帧Frame网络层:负责数据包从源到宿的传递和网际互连(包PackeT传输层:提供端到端的可靠报文传递和错误恢复(段Segment会话层:建立、管理和终止会话(会话协议数据单元SPDU表示层:对数据进行翻译、加密和压缩(表示协议数据单元PPDU应用层:允许访问OSI环境的手段(应用协议数据单元APDU

各种协议

ICMP协议:因特网控制报文协议。它是TCP/IP协议族的一个子协议,用于在IP主机、路由器之间传递控制消息。TFTP协议:是TCP/IP协议族中的一个用来在客户机与服务器之间进行简单文件传输的协议,提供不复杂、开销不大的文件传输服务。HTTP协议:超文本传输协议,是一个属于应用层的面向对象的协议,由于其简捷、快速的方式,适用

于分布式超媒体信息系统。DHCP协议:动态主机配置协议,是一种让系统得以连接到网络上,并获取所需要的配置参数手段。

说说mongoDBMySQL的区别

MySQL是传统的关系型数据库,MongoDB则是非关系型数据库mongodbBSON结构(二进制)进行存储,对海量数据存储有着很明显的优势。对比传统关系型数据库,NoSQL有着非常显著的性能和扩展性优势,与关系型数据库相比,MongoDB优点有:①弱一致性(最终一致),更能保证用户的访问速度:②文档结构的存储方式,能够更便捷的获取数据。

讲讲304缓存的原理

服务器首先产生ETag,服务器可在稍后使用它来判断页面是否已经被修改。本质上,客户端通过将该记号传回服务器要求服务器验证其(客户端)缓存。304HTTP状态码,服务器用来标识这个文件没修改,不返回内容,浏览器在接收到个状态码后,会使用浏览器已缓存的文件客户端请求一个页面(A)。服务器返回页面A,并在给A加上一个ETag。客户端展现该页面,并将页面连同ETag一起缓存。客户再次请求页面A,并将上次请求时服务器返回的ETag一起传递给服务器。服务器检查该ETag,并判断出该页面自上次客户端请求之后还未被修改,直接返回响应304(未修改——Not Modified)和一个空的响应体。

什么是函数柯里化?

柯里化,是函数式编程的一个重要概念。它既能减少代码冗余,也能增加可读性。另外,附带着还能用来装逼。先给出柯里化的定义:在数学和计算机科学中,柯里化是一种将使用多个参数的一个函数转换成一系列使用一个参数的函数的技术。柯里化的定义,理解起来有点费劲。为了更好地理解,先看下面这个例子:

function sum (a, b, c) { console.log(a + b + c);  } sum(1, 2, 3); // 6

毫无疑问,sum 是个简单的累加函数,接受3个参数,输出累加的结果。假设有这样的需求,sum的前2个参数保持不变,最后一个参数可以随意。那么就会想到,在函数内,是否可以把前2个参数的相加过程,给抽离出来,因为参数都是相同的,没必要每次都做运算。如果先不管函数内的具体实现,调用的写法可以是这样:

 sum(1, 2)(3); 或这样 sum(1, 2)(10); 。

就是,先把前2个参数的运算结果拿到后,再与第3个参数相加。这其实就是函数柯里化的简单应用。

创建对象有几种方法?

1、字面量对象 // 默认这个对象的原型链指向object

var o1 = {name: '01'};

2、通过new Object声明一个对象

var o11 = new Object({name: '011'});

3、使用显式的构造函数创建对象o2的构造函数是M

o2这个普通函数,是M这个构造函数的实例

4object.create()原型、构造函数、实例、原型链

1Object.prototype属性是整个原型链的顶端

2、原型链通过prototype原型和proto属性来查找的

3、所有的引用类型(数组、对象、函数),都具有对象特性,即可自由扩展属性(除了“null”)

4、所有的引用类型(数组、对象、函数),都有一个proto属性,属性值是一个普通的对象(null)

5、所有的函数,都有prototype属性,属性值也是一个普通的对象。

6、所有的引用类型(数组、对象、函数),proto属性指向它的构造函数prototype属性值

7、实例本身的属性和方法如果没有找到,就会去找原型对象的属性和方法。如果在某一级找到了,就会停止查找,并返回结果

怎样通过ES5ES6声明一个类?

传统的构造函数,声明一个类

function Animal() { this.name = 'name'; }

es6中的class声明

class Animal2{ constructor() { this.name = name;  }  }

callapply的共同点与区别?

1、改变了函数运行上下文

2call()apply()主要是能扩充函数赖以运行作用域。两者的作用方式相同,它们的区别在于接收参数的方式不同,对于call()而言,第一个参数thisapply()相同,其他的参数必须直接传给函数,要一个一个的列出来,而对于apply()来说,apply()可以接收一个数组或arguments对象。所以如何选择二者,在于哪种给函数传参数的方式最简单。

javascript实现对象的继承,继承的几种方式,这几种方式的优缺点?

方法1:借助构造函数实现继承(部分继承)

/*** 借助构造函数实现继承 */ function Parent1() { this.name = 'parent'; } Parent1.prototype.say = function() { }; // 不会被继承  function Child1() { // 继承:子类的构造函数里执行父级构造函数 // 也可以用apply // parent的属性都会挂载到child实例上去  // 借助构造函数实现继承的缺点: ①如果parent1除了构造函数里的内容,还有自己原型链上的东西, 自己原型链上的东西不会被child1继承 // 任何一个函数都有prototype属性,但当它是构造函数的时候, 才能起到作用(构造函数是有自己的 原型链的) Parent1.call(this);  this.type = 'child1';  } console.log(new Child1);

1)如果父类的属性都在构造函数内,就会被子类继承。

2)如果父类的原型对象上有方法,子类不会被继承

方法2:借助原型链实现继承

/*** 借助原型链实现继承 */ function Parent2() {  this.name = 'name'; this.play = [1, 2, 3] } function Child2() { this.type = 'child2';  } Child2.prototype = new Parent2(); // prototype使这个构造函数的实例能访问到原型对象上 console.log(new Child2().__proto__);  console.log(new Child2().__proto__ === Child2.prototype); // true  var s1 = new Child2(); // 实例 var s2 = new Child2(); console.log(s1.play, s2.play);  s1.play.push(4);  console.log(s1.__proto__ === s2.__proto__); // true // 父类的原型对象

1)原型链的基本原理:构造函数的实例能访问到它的原型对象上

2)缺点:原型链中的原型对象,是共用的

方法3:组合方式

* 组合方式 */ function Parent3() { this.name = 'name'; this.play = [1, 2, 3];  } function Child3() { Parent3.call(this); this.type = 'child3'; } Child3.prototype = new Parent3();  var s3 = new Child3(); var s4 = new Child3(); s3.play.push(4); console.log(s3.play, s4.play);  // 父类的构造函数执行了2次  // 构造函数体会自动执行,子类继承父类的构造函数体的属性和方法

①组合方式优化1

/*** 组合继承的优化方式1:父类只执行了一次 */ function Parent4() {  this.name = 'name'; this.play = [1, 2, 3]; } function Child4() { Parent4.call(this); this.type = 'child4'; } Child4.prototype = Parent4.prototype;  // 继承父类的原型对象  var s5 = new Child4();  var s6 = new Child4(); console.log(s5 instanceof Child4, s5 instanceof Parent4); // true console.log(s5.constructor);  // Parent4  //prototype里有个constructor属性, //子类和 父 类的原型对象就是同一个对象, // s5的constructor就是父类的constructor

②组合方式优化2(最优解决方案):

/*** 组合继承优化2 */ function Parent5() { this.name = 'name'; this.play = [1, 2, 3]; } function Child5() {  Parent5.call(this); this.type = 'child5';  } Child5.prototype = Object.create(Parent5.prototype);  // Object.create创建的对象 就 是参数  Child5.prototype.constructor = Child5; var s7 = new Child5(); console.log(s7 instanceof Child5, s7 instanceof Parent5);  console.log(s7.constructor); // 构造函数指向Child5

优缺点:原型链继承的缺点1、字面量重写原型一是字面量重写原型会中断关系,使用引用类型的原型,并且子类型还无法给超类型传递参数。2、借用构造函数(类式继承)借用构造函数虽然解决了刚才两种问题,但没有原型,则复用无从谈起。所以我们需要原型链+借用构造函数的模式,这种模式称为组合继承3、组合式继承组合式继承是比较常用的一种继承方法,其背后的思路是 使用原型链实现对原型属性和方法的继承,而通过借用构造函数来实现对实例属性的继承。这样,既通过在原型上定义方法实现了函数复用,又保证每个实例都有它自己的属性。

说说你对作用域链的理解?

作用域链的作用是保证执行环境里有权访问的变量和函数是有序的,作用域链的变量只能向上访问,变量访问到window对象即被终止,作用域链向下访问变量是不被允许的。

谈一谈this在各种情况的指向问题?

1、作为构造函数执行

function Foo(name) { this.name = name;  } var f = new Foo('zhangsan');

作为对象属性执行

var obj = { name: 'A',  printName: function() { console.log(this.name); }  } obj.printName();

、作为普通函数执行

function fn() { console.log(this); } fn();

call apply bind

function fn1(name, age) { alert(name);  console.log(this); } fn1.call({x: 100}, 'zhangsan', 20); fn1.apply({x:100}, ['zhangsan', 20]) var fn2 = function (name, age) {  //必须是函数表达式,不能是函数声明,即不能是function fn2(name, age) {} alert(name); console.log(this); }.bind({y:200}); fn2('zhangsan', 20);

闭包的特征有哪些?

1、函数嵌套函数

2.、函数内部可以引用外部的参数和变量

3、参数和变量不会被垃圾回收机制回收

闭包应用场景有哪些?

作为返回值

function fn() { var max = 10; return function (x) {  if (x > max) { console.log(x); } } } var f1 = fn(); f1(15);

作为参数传递

var max = 10; function fn(x) { if (x > max) { console.log(x); }  }(function(f) { var max = 100; f(15); })(fn)