每天一点小提升,人人都是工程师

446 阅读5分钟

实现fn(2)(4)的打印结果为8

function (a) {
    return function (b) {
        console.log(a*b)
    }
}
fn(2)(4)

什么是原型链

每个对象都会在其内部初始化一个属性,就是prototype(原型),当我们访问一个对象的属性时,如果这个对象内部不存在这个属性,那么他就会去prototype里找这个属性,这个prototype又会有自己的prototype,于是就这样一直找下去,也就是我们平时所说的原型链的概念。

关系:instance.constructor.prototype = instance.proto

定位

论position的属性都有哪些

static:默认的属性值,按照标准流(包括浮动方式)进行布局。

relative:称为相对定位,使用相对的盒子的位置常以标准量的排版方式为基础,然后使盒子相对于它在原本的标准位置偏移指定的距离.相对定位仍在标准流中,它对父块和兄弟块盒子没有任何影响。

absolute:绝对定位,盒子的位置以它的包含框为基准进行偏移。绝对定位从标准流中脱离,并且以它最近的一个已经定位的祖先元素为基准进行定位。没有已经定位的祖先元素,则以浏览器窗口为基准进行定位 。 inherit:规定从父元素继承 position 属性的值。

fixed:固定定位,与绝对定位类似,以浏览器窗口为基准进行定位,拖动浏览器窗口的滚动条时,位置保持不变。

sticky: 粘性定位是相对定位和固定定位的混合。元素在跨越特定阈值前为相对定位,之后为固定定位。

vue都有哪些生命周期

beforeCreate  组件实例刚被创建

created 组件实例创建完,属性已被绑定,但是dom还未生成

beforeMount 模板编译挂载前

mounted 模板编译挂载后

beforeUpdate 组件更新之前

updated 组件更新之后

activated keep-alive激活时调用

deactivated  keep-alive移除时调用

beforeDestroy 组件销毁前调用

destroyed 组件销毁后调用

errorCapture 错误时被调用

浏览器标准模式和怪异模式之间的区别是什么

在HTML与CSS的标准化未完成之前,各个浏览器对于HTML和CSS的解析有各自不同的实现,而有很多旧的网页都是按照这些非标准的实现去设计的。在HTML与CSS标准确定之后,浏览器一方面要按照标准去实现对HTML与CSS的支持,另一方面又要保证对非标准的旧网页设计的后向兼容性。因此,现代的浏览器一般都有两种渲染模式:标准模式和怪异模式。在标准模式下,浏览器按照HTML与CSS标准对文档进行解析和渲染;而在怪异模式下,浏览器则按照旧有的非标准的实现方式对文档进行解析和渲染。这样的话,对于旧有的网页,浏览器启动怪异模式,就能够使得旧网页正常显示;对于新的网页,则可以启动标准模式,使得新网页能够使用HTML与CSS的标准特性。

在标准模式下,一个块的总宽度= width + margin(左右) + padding(左右) + border(左右)

alt

在怪异模式下,一个块的总宽度= width + margin(左右)(即width已经包含了padding和border值)

alt

声明式函数和表达式函数的区别

function a () {
        return '函数声明';
    }
var b = function () {
    return '函数表达式';
}

Javascript 中函数声明和函数表达式是存在区别的,函数声明在JS解析时进行函数提升,因此在同一个作用域内,不管函数声明在哪里定义,该函数都可以进行调用。而函数表达式的值是在JS运行时确定,并且在表达式赋值完成后,该函数才能调用。

js哪些操作会实行隐式转换

数值自动转换为字符串

var a = 123;
alert(a+'4'); // 输出 1234 “+”号为连接符

字符串自动转换为数字

var b = 1;
alert(b-'1'); // 减法 输出 0
alert(b*'2'); // 乘法 输出 2
alert(b/'1'); // 除法 输出 1
alert(b%'1') // 求余 输出0

“++”和“–”的类型转换

var c = '10';
c++;
alert(c); // 输出 11
 
var d = '10';
d--;
alert(d); // 输出 9

比较运算符的类型转换

alert('10' > 1) // 输出 true
alert('10' > '20') // 输出 false

等号运算符的转换

alert('10' == 10) // 输出 true
alert('10' === 10) // 输出 false

“!” 运算符的转换

alert(!true); // 输出false
alert(!false); // 输出 true
alert(!100); // 输出false
alert(!'哈哈哈哈哈'); // 输出 false

运算符其他之间的转换返回NaN

alert('哈哈哈'-10) // 输出NaN

用javascipt写一个方法,模拟实现bind方法

//bind() 方法会创建一个新函数。
//当这个新函数被调用时,bind() 的第一个参数将作为它运行时的 this
//之后的一序列参数将会在传递的实参前传入作为它的参数。(来自于 MDN )

Function.prototype.fakeBind = function(context) {
  if (typeof this !== "function") {
    throw new Error("Bind must be called on a function");
  }
  let self = this;
  // 获得第一个参数以外的其他参数
  let args = Array.prototype.slice.call(arguments, 1);

  let inner = function() {
    // 获得返回函数执行时被传入的参数
    let innerArgs = Array.prototype.slice.call(arguments);
    // 1 new 情况下,this 指向实例。此时 bind 时指定的 this 值应予以失效;
    // 2 实例 instanceof 构造函数 返回值 truefalse,确定是否为 new 调用;
    // 3 匿名函数直接调用 this 指向全局对象。此时应予以修改 this 的绑定
    return self.apply(
      this instanceof inner ? 
      this : 
      context, args.concat(innerArgs)
    );
  };
  // inner.prototype = this.prototype 
  // 按上面这么写的话,修改 返回函数原型对象(inner.prototype)的同时把 绑定函数的原型对象(this.prototype)也同时修改了。
  // 用匿名函数做中转,this.protptype 就安全了。画个原型链的图就清楚了。
  //注②
  let fNOP = function() {};
  fNOP.prototype = this.prototype;
  inner.prototype = new fNOP();
  return inner;
};