大题:
1.替换链接
找出所有的以http://、https://和www.开头的链接,用户点击,跳转到新窗口
问答题:
1.移动端前端开发和PC端的区别
系统设计题
实现js**无限级**树形控件,点开箭头,子菜单展开,选中或取消父菜单,所有子菜单都取消。
在栈空的情况下,不能退栈
邻接矩阵顶点数和边数
nodejs怎么获取当前脚本所在的路径
定义带正方形的列表:list-style:square
表单提交只能是get和post方法,默认是get方法,
数据通过设置的action属性提交到指定位置
" str hah ".replace(/\s+$/g,"");
1+'0'===1
'0'
undefined
'0'+1===1
==进行类型转换时,一个是数值,一个是字符串,比较之前先将字符串转为数字
var bb=1;
function aa(bb){bb=2;console.log(bb);};
aa(bb);
console.log(bb);//函数中的bb已失效。
setTimeout(function(){console.log(1);},0)
Promise.resolve(function(){console.log(2);})
new Promise(function(resolve){console.log(3);});
console.log(4);
输出:3 4 undefined 1
参考:https://segmentfault.com/q/1010000011124511
setTimeout(function(){
console.log(1);
}, 0)
new Promise(function executor(resolve){
console.log(2);
for(var i = 0; i < 1000; i++){
i = 9999 && resolve();
}
console.log(3);
}).then(function(){
console.log(4);
})
console.log(5);
解析:
之前说过,在定时器,事件,ajax等操作的时候,会是一个异步操作,会把该操作放到一个task queue里,需要等当前主线程的任务完成后,会读取任务队列(task queue)中的事件。
那么,setTimeout会放到任务队列中,代码继续往下走。
所以先输出2 3。
promise中的then操作是放在执行栈,也就是主线程的最后。
那么主线程会继续往下走咯。
所以输出 5 4
最后主线程的任务搞完了,才会去执行task queue中的任务。
所以最后执行1
// 2, 3, 5, 4, 1
function fn1() {
console.log(10);
}
function fn2() {
console.log(20);
function fn3() {
fn1();
}
fn3();
}
fn2();
var a,b,c;
a=b=c=[1,2];b=[3,4];
c.length=1;console.log(a)
//输出[1]
变量a指向c的引用,中断了指向b的引用。b指向c的引用。
c始终指向[1,2];
var name=null;var domain=`${name??'jd'}.com`;
/^d+[^d]+/.test("d7d");
上述式子中,第一个^表示开始符,第二个^表示非,d表示字母d,+匹配前面的子表达式一次或多次
/^d+[^d]+/.test("123def");
区分:\d 匹配一个数字字符。等价于 [0-9]。
var Test ={
foo:"test",
func:function () {
var self=this;
console.log(this.foo);
console.log(self.foo);
(function () {
console.log(this.foo);
console.log(self.foo);
})();
}
};
Test.func();
输出 test test undefined test
回答:https://segmentfault.com/q/1010000011133004?_ea=2533240
注意:1.立即执行函数,没有明确的调用对象,因此就是最外层的window,this指向window.(之类的没有明确的指明调用对象,只是想对语义上的)
2.另外注意的是:如果一个函数是自身调用,没有其他的对象调用的话,在非严格模式下,this指针指向的是全局对象,也就是window对象,如果在严格模式下,this指针指向的是undefined
知识点:this的指向 ,用法:对象函数调用,哪个对象调用就指向哪个对象
this永远指向的是最后调用它的对象,也就是看它执行的时候是谁调用的;
Test.func();这里是Test**在调用**,所以this指向它,所以前两个指的就是’test’,
而下面的立即执行函数第一个this在非严格模式下指的是window,这里window没有定义foo,所以就是undefined
最后的self就是它的最外层的this
this的指向分为以下四种情况:
1、由new调用?->绑定到新创建的实例;
2、由call或者apply(或者bind)调用?->绑定到指定的对象;
3、由上下文对象调用?->绑定到那个上下文对象;
4、默认:在严格模式下绑定到undefined,否则绑定到全局对象。
参考:http://blog.csdn.net/lxcao/article/details/52750575
题目变形:
var foo = "global-foo";//全局变量
var Test ={
foo:"test",
func:function () {
var self=this;
console.log(this.foo);
console.log(self.foo);
(function () {
console.log(this.foo);
console.log(self.foo);
})();
}
};
Test.func();
输出 test test global-foo test
var a="baidu";
var b=new String("baidu");
console.log(typeof a);//string
console.log(typeof b);//object
var a=1;
function f(){
var a=2;
var e=eval;
e('console.log(a)')
}
f();
//输出1
知识点:执行eval会把参数放到全局执行
如果你间接的使用 eval(), 如通过一个引用来调用它而不是直接的调用eval。 从ECMAScript 5起它工作在全局作用域而不是局部作用域中;这里是var e=eval;所以是间接调用了,所以是全局的
参考:mdn
function Test(){
var x=0;
return function(){
console.log(x++);
}
}
var f1=Test(),
f2=Test();
f1();//0
f1();//1
f2();//0
var arr=[1,2,3];
arr.shift();
arr.push(1);
arr.unshift(2);
var arrNew=arr.concat([1,2]);
console.log(arrNew);
输出:[2, 2, 3, 1, 1, 2]
知识点:shift删除数组第一个元素,并返回该值,会更改数组;
unshift在数组开头添加若干个元素。更改数组
var x='undefined';
var y='false';
var z="";
var a= undefined;
var b= null;
var c = 0;
function assert(xVar){
if(xVar)
console.log(true);
else
console.log(false);
}
assert(x);//true
assert(y);//true
assert(z);//false
assert(a);//false
assert(b);//false
assert(c);//false
知识点:
ES会使用B**oolean()转换函数**将这个表达式的结果转换为一个布尔值。
以下情况会被认为返回false:
“” 空的字符串
为 0 的数字
为 null 的对象
为 undefined 的对象
布尔值 false
反之为真
for(var i=1;i<=3;i++){
setTimeout((function (a){
console.log(a);
})(i),0);
}
//1 2 3
知识点:利用闭包的特性保存值
参考:http://www.jianshu.com/p/9b4a54a98660