面试

1.如何实现下列函数

已知 f(2)(3) + 5 === 10
又已知 f(2) + 5 === 7

请问怎么实现 'f' 这个函数

看到这个题目一脸懵逼,为什么一个函数又可以返回一个函数,又可以返回一个常数,后来实在想不出来,人人网的大哥就告诉我利用 函数是一个对象,利用 toString 方法对其改写

function f(a) {
  var res = function(b) {
    return a + b;
  }
 
  // res函数是一个对象,这个对象设置另一个函数
  // 这个方法要和 '+' 进行类型转换
  res.toString = function() {
    return a;
  }

  return res;
}

# 现在
f(2)(3) + 5 === 10

f(2) + 3 === 5

# 如果直接调用函数
f(2)
// 返回
f 2

2.this指向问题

面试题目

var x = 1
var obj = {

  a: {
    x: 2,
    b: {
      x: 3,
      sayThis: function() {
        console.log(this.x)
      }
    }
  }
}

var s = obj.a.b
s.sayThis()
obj.a.b
# 请问打印的值是什么

我的答案是

3
3

原因是

obj.a.b 是引用类型,所以两处的应该是一样的,都是指向对象obj.a.b内部的x

但是面试官大哥告诉我,因为对象s是定义在window下的,所以s应该指向的是window下的 'x',所以答案是

1
3

后来我回家之后发现我的答案是对的

今天是2017-10-08 突然想到那天的题目实际上是

var s = obj.a.b.sayThis   // 这个对象是在window下定义的
s()
obj.a.b.sayThis()

# 打印结果是
1
3

3.闭包的问题

function fun() {
  var i = 0;
  return function() {
    console.log(i++)
  }
}

var f1 = fun()
var f2 = fun()

f1() 
f1()
f2()

请问打印什么

我一开始看成了这个,因为经常看到的下面这个例子
function fun() {
  var arr = []
  for (var i = 0; i <= 4; i++) {
    arr.push(function() {
      console.log(i);
    })
  }
  return arr;
}

var funArr = fun();

for (var i = 0; i < funArr.length; i++) {
  funArr[i]()
}
// 结果
5
5
5
5
5

所以想到没想,就将上面的3个函数的结果写为了
2
2
2

后来才发现这2个例子不一样,本题答案是

0
1
0

4.BFC

问我 BFC 是什么,虽说经常看到这个东西,一开始以为是清楚浮动用的,后来实在想不到,就让面试官大哥直接告诉我了

直接也差了一下文档,BFC(Block Formatting Context) 是Web页面中盒模型布局的CSS渲染模式

一个BFC是一个html盒子并且自杀后满足下列条件中的任何一个:

  • float的值不为0
  • position的值不为static或者relative
  • display的值为 table-cell, table-caption, inline-block, flex 或者 inline-flex中的一个
  • overflow的值不为visible

参考文章:

5.下面图片地下空白是什么

img.jpg
// html
  <div class="container">
    ![](http://fillmurray.com/300/300)
    <span>1</span>
  </div>

// css
.container {
  width: 400px;
  background-color: lightgreen;
}

红色框部分是为什么会出现,我一开始以为是图片的高度不够,后来才知道是 vetical-align 的原因,因为这个值的默认值是 baseline, 下面设置其为 bottom 即可

img {
  vetical-align: bottom
}
vetical-align.jpg

6.数字格式化

把数字格式户

  1. 1234567899 每4位顺着就加一个空格 1234 5678 99
  2. 1234567899 每4位就倒着加一个逗号 1,234,567,899

我知道这个格式化数据考的是正则,奈何我正则很垃圾,基本上都是直接网上抄一下,现在让我手写有点懵逼

# 首先返回的是一个字符串, 肯定现将数字转换为字符串

#1
'1234567899'.replace(/(.{4})/g, '$1 ')
"1234 5678 99"

'123'.replace(/(.{4})/g, '$1 ')
"123"


# 2
'1234567899'.replace(/(\d)(?=(\d{3})+(?!\d))/g, "$1,")
"1,234,567,899"

'12345'.replace(/(\d)(?=(\d{3})+(?!\d))/g, '$1,')
"12,345"

或者
// ?!^  表示不能是开头的位置
// ?=(\d{3}) 表示3位数字前面的位置
'12345'.replace(/(?!^)(?=(\d{3})+$)/g, ',')
"12,345"
  • ?= 称之为 positive lookahead, 中文名称之为 正向先行断言
  • ?! 称之为 negative lookback, 中文名称之为 负向先行断言

参考文章:

  1. js 每隔四位加一个空格
  2. Number Formatting Using string.replace in JavaScript

7.事件冒泡和事件捕获的区别 以及如何用js实现事件委托

文章:

8.如何在容器宽高已知的情况下 让文字居中

一开始我就问可不可以使用 flex,面试官说可以,我就说

// html
<div>
  <span>
    Lorem ipsum dolor sit amet, consectetur adipisicing elit. Deleniti 
    quibusdam ullam doloremque nam nesciunt repellat consectetur enim at, 
   autem libero, magnam numquam officia eligendi, laborum nulla, iste 
   quasi corporis accusamus.
  </span>
</div>

// css
.container {
  width: 400px;
  height: 500px;
  padding: 10px;
  background-color: lightgreen;
  display: flex;
  justify-content: center;
  align-items: center;
}

面试官还告诉我另一种方式

// html
<div>
  <span>
  <span>
    Lorem ipsum dolor sit amet, consectetur adipisicing elit. Deleniti 
    quibusdam ullam doloremque nam nesciunt repellat consectetur enim at, 
   autem libero, magnam numquam officia eligendi, laborum nulla, iste 
   quasi corporis accusamus.
  </span>
  </span>
</div>

9.为什么span之间会有空格,如何解决

看到这个问题一脸懵逼,我也不知道为什么,以为是 padding | margin 的原因

// html
<div class="container">
     <span>1</span>
     <span>2</span>
     <span>3</span>
 </div>

// css
.container {
  width: 400px;
  height: 500px;
  padding: 10px;
  background-color: lightgreen;
}
span空格.jpg

我的解决办法是

span {
  margig: 0;
  padding: 0;
}

估计面试我的大佬觉得这小伙子是不是傻子,这么简单会让你做吗

回来谷歌了一下,找到了答案

下面是解决办法

# 解决办法1
在父容器中添加 'font-size:0' 样式,然后再定义span字体的大小

// html
<div class="container" style="font-size: 0;">
     <span>1</span>
     <span>2</span>
     <span>3</span>
 </div>

// css
span {
  font-size: 14px;
}


# 解决办法2
使用注释的方式
<div class="container">
     <span>1</span><!--
     --><span>2</span><!--
     --><span>3</span>
</div>

10.如何让一个盒子左右可以拖动

这个个人感觉实现起来比较难,可以参考以下以下链接:

总结

还有一些布局方面的题目没有写下来,待改天补充。感觉一次面试能够学到很多平常注意不到的一些细节,很感谢人人网的那位面试官大佬细心的讲解,感觉大佬十分的平易近人,真心学到了很多知识点,也暴露了自己在js,css方面的不足。

以下是以后重点学习的地方:

  • 了解基础原理
  • 学好正则表达式

最后向大佬们学习~

2017年9月30日 23:32:50

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,544评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,430评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,764评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,193评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,216评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,182评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,063评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,917评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,329评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,543评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,722评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,425评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,019评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,671评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,825评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,729评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,614评论 2 353

推荐阅读更多精彩内容