面试题答疑

在看一篇面试题的汇总,有的作者附上了答案,有的则省略了,我看到几个有价值的问题,在这里记录下来,以便以后查阅。

css部分

  1. 视差滚动效果,如何给每页做不同的动画?
    有一篇博文,写得很好,详细阐述了视察滚动的原理。链接
  2. ::before 和 :after中双冒号和单冒号 有什么区别?解释一下这2个伪元素的作用。
    涉及到伪元素和伪类的差别,css2.1中伪元素和伪类都是单冒号,在css3中,为了区分二者,伪元素要写成双冒号。链接
    伪元素的作用,有一篇文章写的很好。链接
  3. 如何修改chrome记住密码后自动填充表单的黄色背景 ?
    解决这个问题,看这个链接
  4. 你对line-height是如何理解的?
    line-height是指行高,你可以有5种方式来定义line-height:
    1.line-height可以被定义为:body{line-height:normal;}
    2.line-height可以被定义为:body{line-height:inherit;}
    3.line-height可以使用一个百分比的值body{line-height:120%;}
    4.line-height可以被定义为一个长度值(px,em等) body{line-height:25px;}
    5.line-height也可以被定义为纯数字, body{line-height:1.2}
    参考深入理解css之line-height,也可以看看张大神的 css行高line-height的一些深入理解及应用
  5. 怎么让Chrome支持小于12px 的文字?
    Chrome 中文界面下默认会将小于 12px 的文本强制按照 12px 显示,可通过加入 CSS 属性 -webkit-text-size-adjust: none; 解决。
  6. 让页面里的字体变清晰,变细用CSS怎么做?
    -webkit-font-smoothing: antialiased;
  7. font-style属性可以让它赋值为“oblique” oblique是什么意思?
    font-style: oblique 选择字体族的 oblique 变体。italic 选择字体族的 italic 变体,如果没有 italic 变体就妥协到 oblique 变体。如果字体族连 oblique 也未提供,则由浏览器合成倾斜的仿 oblique。
    比如 font-family: Georgia, serif 时,指定 font-style: italic,则浏览器使用 Georgia Italic。若 font-family: Microsoft YaHei, sans-serif 时指定 font-style: italic,因为微软雅黑没有 italic 或 oblique 变体,浏览器只得将 regular 变体倾斜以自动合成仿 oblique。
    没有什么应当使用 oblique 的场景。
  8. 有一个高度自适应的div,里面有两个div,一个高度100px,希望另一个填满剩下的高度。
    网页给出了四种回答:
    (1)示例1
    (2)示例2
    (3)示例3
    (4)示例4

JavaScript部分

  1. Javascript如何实现继承?
    在ES5之前,js是通过原型链来实现继承的,ES6带来了class新特性,但是也只是语法糖而已,还是通过原型链来实现,只是代码上看起来会规范很多。
    参考MDN的文章
  2. 谈谈This对象的理解。
    MDN关于this的文章
    在《javaScript语言精粹》这本书中,把 this 出现的场景分为四类,简单的说就是:
    • 有对象就指向调用对象
    • 没调用对象就指向全局对象
    • 用new构造就指向新对象
    • 通过 apply 或 call 或 bind 来改变 this 的所指。
  3. javascript 代码中的”use strict”;是什么意思 ? 使用它区别是什么?
    除了正常运行模式,ECMAscript 5添加了第二种运行模式:”严格模式”(strict mode)。顾名思义,这种模式使得Javascript在更严格的条件下运行。
    目的:
      - 消除Javascript语法的一些不合理、不严谨之处,减少一些怪异行为;
      - 消除代码运行的一些不安全之处,保证代码运行的安全;
      - 提高编译器效率,增加运行速度;
      - 为未来新版本的Javascript做好铺垫。
    语法和行为改变:

    1. 全局变量显式声明
      在正常模式中,如果一个变量没有声明就赋值,默认是全局变量。严格模式禁止这种用法,全局变量必须显式声明。

      1. 静态绑定
        (1)禁止使用with语句
        (2)创设eval作用域
        正常模式下,Javascript语言有两种变量作用域(scope):全局作用域和函数作用域。严格模式创设了第三种作用域:eval作用域。
        正常模式下,eval语句的作用域,取决于它处于全局作用域,还是处于函数作用域。严格模式下,eval语句本身就是一个作用域,不再能够生成全局变量了,它所生成的变量只能用于eval内部。
        (3)增强的安全措施
        禁止this关键字指向全局对象,因此,使用构造函数时,如果忘了加new,this不再指向全局对象,而是报错。
        禁止在函数内部遍历调用栈,arguments.callee禁用。
        禁止删除变量,严格模式下无法删除变量。只有configurable设置为true的对象属性,才能被删除。
        显式报错,正常模式下,对一个对象的只读属性进行赋值,不会报错,只会默默地失败。严格模式下,将报错。严格模式下,对一个使用getter方法读取的属性进行赋值,会报错。严格模式下,对禁止扩展的对象添加新属性,会报错。严格模式下,删除一个不可删除的属性,会报错。
        重名错误,对象不能有重名的属性,函数不能有重名的参数。
        禁止八进制表示法。
        arguments对象的限制,不允许对arguments赋值,arguments不再追踪参数的变化,禁止使用arguments.callee。
        函数必须声明在顶层。

        内容来自Javascript 严格模式详解

  4. 关于 typeof 和 instanceof。
    MDN的文章

  5. 关于json和jsonp
    说说JSON和JSONP,也许你会豁然开朗,含jQuery用例