A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

Css相关1. display:none与visibility:hidden的区别(2018拼多多前端笔试真题)

答案:在视觉效果上,两者是相同的,但是对于操作dom上是不同的 。 dispaly:none 会让dom的整个宽、高等相关位置元素失效,整个消失; visibility:hidden 只是让该元素不可见,但是width以及原有位置是不会改变的

javascript1. 基本问题1) 是否可以使用 typeof bar === 'object'来检测bar是不是object类型,有和风险?

答案: 有风险,js的基本数据类型有 String Number Boolean undefined null和一种复杂数据类型object(ES6新增了symbol)。

对于复杂数据类型object,其实typeof null返回的也是object,因为本质上null就是一个占位用的对象。另一方面,数组Array也不能用typeof检测数据类型,因为同样会返回object。

因此,如果想要检测bar是不是object,可以这样子:

    console.log((bar !== null) && (tiopnuiop[yuiop[]\\]poi456/ypeof bar ==='object'))    //当然,如果认为function也是 object,可以用下面的语句    console.log((bar !== nul)&& (typeof bar ==='object')||(typeof bar ==='function'))

除此以外,还有比如Array的情况,因为Array也会返回object,如果我们不像让Array被认为是Object,就必须真正的认清Array,人情Array的方法有:

console.log( bar instanceof Array)  // 如果数组,返回true console.log( Array.isArray(bar))  //ES5方法 console.log( Ojbect.prototype.toString.call(arr) === '[object Array]')
2) 以下两个函数是否等价function foo1(){  return {      bar: "hello"  };}function foo2(){  return  {      bar: "hello"  };}

答案: 不等价!! 注意,第二个函数返回的是undefined

console.log(foo1()); // {bar : "hellp"}console.log(foo2()); // undefined

这也是为什么函数返回对象时,或写大括号时,把{写在一边,因为第二个函数js会默认return后面返回的东西(是空),等价于

return undefined{xxx}//后面当然,当然是写了也白写
3) NaN是什么?它是什么类型?如何检测一个变量是不是NaN?

答案: NaN即Not A Number,但实际上它是Number类型 typeof NaN 将会返回Number。 这个东西比较厉害,因为

NaN === NaN  //false

你会发现,它自己都不等于它自己,因此判断变量是否是它,不能使用===。 可以使用isNaN方法

//检查变量是否是nanisNaN(bar);Object.is(bar,NaN); //ES6方法,这个方法会修正JS中的一些小bug

Object.is()方法,要求严格相等,且Object.is(NaN,NaN)会返回true

2.作用域相关问题

以下程序的输出是什么:

(function(){  var a = b = 3;})();console.log("a defined? " + (typeof a !== 'undefined'));console.log("b defined? " + (typeof b !== 'undefined'));

答案: a defined? false
b defined? true
理解这道题的核心在于如何理解var a = b = 3这句话,实际上这句话等于

var a; b = 3;

这样子,实际上,b是声明在了全局变量中(编译器在预编译帮你声明了,然而在严格模式下是不行的) a是局部变量,所以在函数之外是没有定义的。

3.this&对象&数组1)下面程序输出是什么var myObject = {    foo: "bar",    func: function() {        var self = this;        console.log("outer func:  this.foo = " + this.foo);        console.log("outer func:  self.foo = " + self.foo);        (function() {            console.log(this);            console.log("inner func:  this.foo = " + this.foo);            console.log("inner func:  self.foo = " + self.foo);        }());    }};myObject.func();//答案outer func: this.foo = barouter func: serl.foo = barinner func: this.foo = undefinedinner func: self.foo = bar

分析: 搞清楚this的指向。记住以下几种规则

  • 谁调用,this指向谁 xxx.fun()
  • new一个对象,this指向实例本身var c = new fun()
  • 使用call/apply/bind修改this指向。

看题目,outer func显然是第一种情况,谁调用,this指向谁,这个时候都是myOjbect。 而在立即执行函数中,在这里this是没有进行绑定指向的,自然从属于window,所以这里this.foo是undefied

补充关于箭头函数的this

function a() {    return () => {        return () => {                console.log(this)        }    }}console.log(a()()())

注意:箭头函数其实是没有 this 的,这个函数中的 this 只取决于他外面的第一个不是箭头函数的函数的 this。在这个例子中,因为调用 a 符合前面代码中的第一个情况,所以 this 是 window。并且 this 一旦绑定了上下文,就不会被任何代码改变。

2)数组的filter,以下输出结果是什么(2018拼多多前端原题)var arr = [1,2,3];arr[10] = 9;arr.filter((item)=> {    return item === undefined?})//答案[]

解析: 是的,答案的确是[],不是[undefined x 7]。 首先,看下前两句执行后,arr是什么

console.log(arr)//[1,2,3, emptyx7, 9]console.log(arr[5])//undefined

从上面结果可以看出,的确中间未定义的(显示为empty的是undefined)。那么,filter之后,不是应该返回为undefined的数据吗?

是的,但是,当数组中都是undefined时,数组就是空,或者说[empty x 7] === []

4. JS小数计算不准确的bug

以下代码返回值是什么

console.log(0.1 + 0.2);console.log(0.1 + 0.2 == 0.3);//答案: 0.30000000000000004        false

解析: 详细的解析见连接,这里说一下解决办法 0.1+0.2 != 0.3

//解决办法parseFloat((0.1+0.2).toFixed(10));
5. 算法/思路相关1) 讨论实现判断变量是否是整数的函数isInter(x)的实现

答案: 在ES6中,是有现成的方法Number.isInteger可以使用的。如果自己实现,思路是什么呢

//1 异或运算function isInter(x) {    return x ^ 0 === x}//2 取整return Math.round(x) === x  //同样可以用floor ceil//取余return (typeof x === 'number')&&(x % 1 === 0)
2) 写一个sum方法,可以实现以下两种调用方式console.log(sum(2,3)) //5console.log(sum(2)(3)) //5

答案:

//方法1var sum = function(x,y) {    if(y === undefined) {        return function(y) {            return x + y;        }    }else {        return x + y;    }}//方法2var sum = function(x){    if( arguments.length === 1) {        return function (y) {            return x + y;        }    } else {        console.log('here');        return arguments[0] + arguments[1];    }}
3) 使用递归的方法,将obj变为obj2的格式(拼多多2018前端笔试真题)obj = [    {id:1,parent:null},    {id:2,parent:1},    {id:3,parent:2}]obj2 = {    obj:{        id: 1,        parent: null,        child: {            id: 2,            parent: 1,            child: {                id: ,3,                parent: 2            }        }    }}

评分

参与人数 1黑马币 +4 收起 理由
亢龙有悔。 + 4 很给力!

查看全部评分

2 个回复

正序浏览
简洁
回复 使用道具 举报
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马