1、用两个栈实现一个队列
转载:http://www.cnblogs.com/wanghui9072229/archive/2011/11/22/2259391.html
思路
入队:将元素进栈1;
出队:判断栈2是否为空,如果为空,则将栈1中所有元素pop,并push进栈2,栈2出栈; 如果不为空,栈2直接出栈。
大多数人的思路是:始终维护s1作为存储空间,以s2作为临时缓冲区。
入队时,将元素压入s1。
出队时,将s1的元素逐个“倒入”(弹出并压入)s2,将s2的顶元素弹出作为出队元素,之后再将s2剩下的元素逐个“倒回”s1。
见下面示意图:
(2个栈都为空的时候,出队操作一定会引起异常)
2、javascript中的深拷贝和浅拷贝
链接:https://www.zhihu.com/question/23031215/answer/124017500
3、
var callbacks = [] for(var i =0;i<3;i++){ callbacks.push(function(){ console.log(i) }) } callbacks.forEach(cb => cb());
结果 3 3 3.
4、javascript 如何判断变量foo类型是不是
String? typeof foo === "string"
Number? typeof foo === "number"
Date? Object.prototype.toString.call(foo) === '[object Date]'
Array? Object.prototype.toString.call(foo) === '[object Array]'
Object? Object.prototype.toString.call(foo) === '[object Object]'
5 如下代码
function doSomething() { console.log(this) } var obj = { doSomething2: doSomething } var doSomething3 = doSomething var doSomething4 = obj.doSomething2 // 请描述this doSomething() //Window obj.doSomething2() // Object doSomething3() // Window doSomething4() // Window doSomething4.apply("abc",[obj]) // String
6 请填写输出结果
function print(num) { console.log(num); } print(1) setTimeout(function(){print(2)},100) print(3) setTimeout(function(){print(4)},0) // 1 3 4 2
7、假设一个极大的对象数组(比如100万)主键id ,如果要频繁的查找元素,如何才能最快的查找到
8、关于dtd 你知道哪些
9、css选择器有哪些,css3新增伪类举例
10、ajax 请求post 和get区别解释jsonp原理。
jsonp原理:能利用scrip标签src的属性来实现跨域。通过前端方法,作为参数传递给服务器,服务区注入参数后再返回,就是服务器提供一个回调函数,用来接受
json数据,再浏览器执行,并处理要过来的数据。
区别:
get 使用url和cookie传参,post将参数数据放在body中
GET的URL会有长度上的限制,则POST的数据则可以非常大。
POST比GET安全,因为数据在地址栏上不可见
GET请求的参数会保存在浏览器的历史记录中
11、继承几种方式
// 原型链继承和构造函数继承 function Parent(age) { this.name = ["mike", "jack"]; this.age = age; } Parent.prototype.run = function() { return this.name = "are both" + this.age; } function Child(age) { Parent.call(this, age); } Child.prototype = new Parent();
// 寄生组合继承 function object(o) { function F() {} f.prototype = o; return new F(); } function inheritPrototype(sub, sup) { var prototype = object(sup.prototype); prototype.constructor = sub; sub.prototype = prototype; }
function extend(sub, sup) { // 目的: 实现只继承父类的原型对象 var F = new Function(); // 1 创建一个空函数 目的:空函数进行中转 F.prototype = sup.prototype; // 2 实现空函数的原型对象和超类的原型对象转换 sub.prototype = new F(); // 3 原型继承 sub.prototype.constructor = sub; // 4还原子类的构造器 //保存一下父类的原型对象: 一方面方便解耦 另一方面方便获得父类的原型对象 sub.superClass = sup.prototype; //自定义一个子类的静态属性 接受父类的原型对象 //判断父类的原型对象的构造器 (加保险) if (sub.prototype.constructor == Object.prototype.constructor) { sup.prototype.constructor = sup; } }
12、一个页面从输入 URL 到页面加载完的过程中都发生了什么事情