pb getchild 返回-1_ES5 ES6(1)

e49903dba0d8186d8194e43e2da81a55.png

1. js有哪些数据类型,如何强制数据类型转换?

  1. 数据类型:string number boolean null undefined object symbol
  2. 相关数据类型转换题目具体请查看 js数据类型转换

2.手写bind

   Function.prototype.myBind = function(obj){
      const func = this;  // 这里绑定this
      const args = [...arguments].slice(1); // 拿到初始参数
      return function(){  // 返回一个新的函数
      // 参数不确定用 apply ,这里合并调用新函数时的参数   
         func.apply(obj,args.concat([...arguments])) 
      }
   }

   function fn(a,b){
      console.log(this.name,"测试this绑定")
      console.log(a.age,"测试初始参数")
      console.log(b,"测试新函数的参数")
   }
   const o = {
      name:"Alias"
   }
   const myFn = fn.myBind(o,{age:18});
   myFn('hello world');

结果:

bd6a18698fba54f0025ced14e771bb21.png

3.闭包是什么 查看 关于闭包的理解

闭包形成的本质是:外层函数调用之后,外层函数内的作用域对象无法被销毁,被内层函数引用着,无法直接释放内存,比普通函数要占更多的内存

举例:

4bfbc83fbe9d07d75579ebdee80dfc8f.png

4.事件模型:冒泡 + 捕获,根据 addEventListener的 第三个参数区分,默认false为冒泡

不支持冒泡的事件:

UI:load scroll resize

焦点事件:focus,blur

鼠标事件:mouseleave,mouseenter

5.事件委托:

父元素可以监听未出生得到子元素,动态添加元素时使用居多,这里不多说了。。

6.this是什么,这段代码this指向是什么

this是call的第一个参数,表示函数执行的作用域。

  1. fn() 里面的 this 就是 window
  2. fn() 是 strict mode,this 就是 undefined
  3. a.b.c.fn() 里面的 this 就是 a.b.c
  4. new Fn() 里面的 this 就是新生成的实例
  5. () => console.log(this) 里面 this 跟外面的 this 的值一模一样
  6. $("#btn").on("click",function(){ 事件监听里面的this是监听的那个DOM对象,就是#btn})
  7. 使用事件委托的事件监听里面的this仍然是开头绑定的DOM对象
  8. setInterval,setTimeout 里面的this:箭头函数的this看它外面的this,匿名函数为window

62d3c0c6afa42b369b855233e24e3cbe.png

举例1:

745435ba3305749a4f613852db5a69ac.png

难度1:结合闭包

a982138a21445b62848ef0a83c7d22bd.png

难度2:

4f917828b6af346f97101d628a3a167c.png

7.es5,es6继承,new操作符做了什么:查看 对js继承的理解

8.正则及使用:正则实践与详解

9.DOM深度遍历,遍历一个指定父节点的所有后代节点

function getChild(parent){
  if(!parent.children){return}
  let children = parent.children;
  [...children].forEach((node,i) => {
    getChild(node)
    console.log(node.classList)
  })
}
let parent = document.querySelector(".box");
getChild(parent);

d03bb86e621546223c697e0094910dad.png

10.为什么要使用虚拟DOM,直接操作DOM的弊端

1.书上的比喻:把DOM和JavaScript(这里指ECMScript)各自想象为一个岛屿,它们之间用收费桥梁连接,ECMAScript每次访问DOM,都要途径这座桥,并交纳“过桥费”,访问DOM的次数越多,费用也就越高。因此,推荐的做法是尽量减少过桥的次数,努力待在ECMAScript岛上。

2.修改DOM树结构会发生浏览器的重排重绘,消耗CPU和内存

虚拟DOM与真实DOM区别:

1.虚拟DOM不会发生重排重绘操作,真实DOM频繁排版与重绘的效率是相当低的造成性能损耗

2.虚拟DOM进行频繁修改,然后一次性比较(差异对比)并修改真实DOM中需要改(局部修改)的部分。

11.0.1+0.2===0.3?原因

这是一件非常诡异的事情,不过接触JavaScript的时间越长,你会不断发现许许多多不合逻辑的问题,比如下面的示例:

e3d4ca0241a890d66ec66efebe9368b3.png

1f0d85f2f8eab48c60f692d7ea4f0884.png

关于0.1 + 0.2的问题,参考 为什么0.1+0.2不等于0.3

因为计算机不能精确表示0.1, 0.2这样的浮点数,计算时使用的是带有舍入误差的数,并不是所有的浮点数在计算机内部都存在舍入误差,比如0.5就没有舍入误差,具有舍入误差的运算结可能会符合我们的期望,原因可能是“负负得正”。

那么如何来解决这种问题?

这里使用原生JS API:

parseFloat((数学表达式).toFixed(digits))

3bef406872307bcc91053f13769542a9.png

12.Number()的存储空间是多大,如果后台发送了一个超过最大字节的数字怎们办

根本原因:JavaScript的Number类型有个最大值(安全值),即2的53次方,为9007199254740992。如果超过这个值,那么js会出现不精确的问题。

解决:

  • 后端使用字符串格式发送数据
  • 控制用户新建数据时id的长度

13.JavaScript垃圾回收机制

更多阅读:

JS函数详解

如果文章有任何问题,或者您有任何疑虑,非常以及强烈建议指出!

为避免形成误导,我也会随时更正文章内容

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值