前端总结

JS基础知识

(一)JS中原始范例
(1)原始值有六种:boolean,null,undefined,number,string,symbol
(2)原始范例存储的都是值,没有函数可以挪用,可以函数挪用是因为举行了强迫范例转换,转换成对象范例
(3)number范例为浮点型范例 eg:0.1+0.2!=0.3 string范例是不可变 string范例挪用任何要领,不会转变其值
(二)JS对象范例
原始范例和对象范例的区分?

  • 原始范例存储值,对象范例存储地点(指针)

(1)函数参数是对象的状况?
函数传参是通报对象指针的副本
(2)typeof vs instanceof
typeof是否能准确推断范例?instanceof准确推断对象的道理?

  • typeof对原始范例除了null都可以推断出范例 对象范例除了function 其他全显现object typeof是一个一元运算符
  • function本质上也是一个对象,然则function对象与一般对象比拟,其内部有一个[[Call]]要领,用来示意这个对象是可挪用的,typeof操纵
    符在推断Object时,假如内部完成了[[Call]]要领,就返回function。
  • instanceof是一个双目运算符 内部完成机制是经由过程原型链来推断 Symbol.hasInstance能自定义instanceof行动的东西

(三)范例转换
(1)转Boolean

除了undefined null false NaN '' 0 -0 其他一切值都转为true 包含一切对象

(2)对象转原始范例

对象在转换范例的时刻,会挪用内置的 [[ToPrimitive]] 函数 该要领在转原始范例时挪用优先级最高。
 let a = {
     valueOf() {
    return 0
  },
  toString() {
    return '1'
  },
  [Symbol.toPrimitive]() {
    return 2
  }
}
1 + a // => 3

(3)四则运算符
加法运算符的特性:

  • 运算中个中一方为字符串,那末就会把另一方也转换为字符串(优先转化成字符串)
  • 假如一方不是字符串或许数字,那末会将它转换为数字或许字符串(布尔值转化为数字 其他优先字符串)

除了加法运算符,其他运算符只需个中一方是数字,那末另一方就会被转为数字
比较运算符

  • 假如是对象,就经由过程toPrimitive转换为对象
  • 假如是字符串,就经由过程unicode字符索引来比较

(四)this
怎样准确推断this?箭头函数的this是什么?
this指向那里的优先级划定规矩:new>bind>obj.foo()>foo() 箭头函数一旦被绑定,就不会再被任何体式格局所转变

《前端总结》

(五)== vs ===
== vs === 有什么区分?
==:假如范例差别,会举行范例转换
推断一方是boolean会转化成number 再举行比较 可能会继承范例转换
推断一方是object且另一方为string、number、symbol会把object转为原始范例再举行推断
(六)闭包
什么是闭包?内部函数可以接见外部函数的变量
轮回中运用闭包处理‘var’定义函数的题目

for (var i = 1; i <= 5; i++) {
  setTimeout(function timer() {
    console.log(i)
  }, i * 1000)
}

setTimeout是个异步函数,会把轮回悉数实行终了,i 就是6
处理办法一

for (var i = 1; i <= 5; i++) {
  (function(j) {
    setTimeout(function timer() {
      console.log(j)
    }, j * 1000)
  })(i)
}

运用了马上实行函数将 i 传入函数内部,这个时刻值就被固定在了参数 j 上面不会转变,当下次实行 timer 这个闭包的时刻,就可以运用外部函数的变量 j(实行上下文 作用域链 优先寻觅近来的)

处理办法二

for (var i = 1; i <= 5; i++) {
  setTimeout(
    function timer(j) {
      console.log(j)
    },
    i * 1000,
    i
  )
}

运用 setTimeout 的第三个参数,这个参数会被当做 timer 函数的参数传入
处理办法三

for (let i = 1; i <= 5; i++) {
  setTimeout(function timer() {
    console.log(i)
  }, i * 1000)
}

运用 let 定义 i 了来处理题目了
(七)深浅拷贝
什么是浅拷贝?怎样完成浅拷贝?什么是深拷贝?怎样完成深拷贝?
Object.assign浅拷贝 只会拷贝一切的属性值到新的对象中,假如属性值是对象,拷贝的是地点
经由过程睁开运算符…一样完成浅拷贝
浅拷贝只处理第一层的题目
深拷贝:经由过程JSON.parse(JSON.stringify(object))
局限性:会疏忽undefined,symbol,不能序列化函数,不能处理轮回援用的对象
lodash完成深拷贝
(八)原型
怎样明白原型?怎样明白原型链?

    原文作者:喝冬瓜汤的丁小白
    原文地址: https://segmentfault.com/a/1190000018340987
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞