百度笔试题

大题:
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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值