function myInstanceOf(left, right){
if(typeof left !== 'object' || left === null || typeof right !== "function"){
return false;
}
let proto = Object.getPrototypeOf(left)
let prototype = right.prototype
while(true){
if(!proto) return false;
if(proto===prototype) return true;
proto = Object.getPrototyoeOf(proto)
}
}
function Person(name){
var o = new Object();
o.name = name;
o.getName = function(){
console.log(this.name)
}
return o;
}
var person1 = new Person("kkk");
console.log(person1 instanceof Person);
console.log(person2 instanceof Object);
1、JavaScript有哪些数据类型,它们的区别?
可以分为堆和栈
2、数据类型检测的方式有哪些
typeof
instanceof
constructor
Object.prototype.toString.call()
console.log(a.call(2));
4、 null和undefined区别
5、typeof null 的结果是什么,为什么?
因为对象在底层是用二进制表示的,在js中二进制前三位都为0的话会被判定为object类型 object,前三个低位(其实是就是后3位)为000会被判断为obj,所以null全是0,所以就是obj
6. intanceof 操作符的实现原理及实现
递归、proto、prototype。 instanceof会递归L的proto原型链,查看是否存在右侧的prototype原型。
7. 为什么0.1+0.2 ! == 0.3,如何让其相等
js的小数位是2的53次方,一共是52+符号为。一共是53位,而0.1和0.2的二进制是无限循环的小数,所以在进制转换过程中精度损失了,在计算的过程中对介运算也精度损失了,所以精度损失可能出现在进制转换和对阶运算过程中。 怎么解决
将数字转换为整数
第三分库
tofixed
对于这个问题,一个直接的解决办法就是设置误差范围,通常称为机器精度。对于js来说,这个值通常为2-52,在ES6中,提供了Number.EPSLON****属性,只要判断0.1+0.2-0.3是否小于Number.EPSILON,如果小于,就可以判断为0.1+0.2\=\=\=0.3。
8. typeof NaN 的结果是什么?
Number
9. isNaN 和 Number.isNaN 函数的区别?
函数isNan接收参数后,会尝试将这个参数转换为数值,任何不能被转换为数值的都会返回true,因此非数字值传入也会返回true,会影响Nan的判断。 函数Number.isNan会首先判断传入参数是否为数字,如果是数字再继续判断是否为NaN,不会进行数据类型的转换,这种方法对于NaN的判断更为准确。
10. == 操作符的强制类型转换规则?
==
在进行对比时,也会先进行类型转换。判断流程:
11. 其他值到字符串的转换规则?
12. 其他值到数字值的转换规则?
13. 其他值到布尔类型的值的转换规则?
false
true
14. Object.is() 与比较操作符
===
,==
的区别?双等号会进行强制类型转换
三等号不会进行类型转换
Object.is一般和三等号判断逻辑相同,但是会处理特殊情况,-0和+0不相等,两个NaN是相等的
15. JavaScript 中如何进行隐式类型转换?
js中隐式类型转换是指在某些操作中,js会自动将一个数据类型转换为另一个数据类型,以完成表达式的计算或操作。
16. let、const、var的区别
17. const对象的属性可以修改吗
不可以,但是引用类型可以,因为引用类型指向的是指针,包括对象和数组
18. 如果new一个箭头函数的会怎么样
不能new,因为箭头函数没有prototype,也没有this,也没有arguments,所以不能new
19. 箭头函数与普通函数的区别
20. 箭头函数的this指向哪⾥?
捕获上下文的this
21. Proxy 可以实现什么功能?
proxy可以自定义对象中的操作
22. 对 rest 参数的理解
扩展运算符被用在函数形参上,可以把分离的参数整合成一个数组:
23. ES6中模板语法与字符串处理
模板语法
my name is ${name}
字符串方法:
24. new操作符的实现原理
25. map和Object的区别
26、map和weakMap的区别
27. JavaScript脚本延迟加载的方式有哪些?
28. JavaScript 类数组对象的定义?
一个拥有length属性和若干索引属性的对象就可以被称为类数组对象,类数组对象和数组类似,但是不能调用数组的方法。厂家的类数组对象有arguments和DOM方法的返回结果,还有一个函数也可以看作是类数组对象,因为它含有length属性值,代表可以接收的参数个数。
29. 为什么函数的 arguments 参数是类数组而不是数组?如何遍历类数组?
30. 什么是 DOM 和 BOM?
31. 对类数组对象的理解,如何转化为数组
splice.call() slice.call() concat.apply()
32. 对AJAX的理解,实现一个AJAX请求
ajax是asynchronous javascript and xml的缩写,指的是通过js的异步通信,从服务器获取xml文档中提取数据,再更新当前网页的对应部分,而不用刷新整个网页。
步骤:
xhr.onreadystatechange = function(){ if(this.readyState !== 4) return; if(this.status === 200){ handle(this.response); } else{ console.error(this.statusText); } } xhr.onerror = function(){ console.error(this.statusText); } xhr.responseType = "json";
xhr.setRequestHeader("Accept", "application/json") xhr.send(null)
33.JavaScript为什么要进行变量提升,它导致了什么问题?
34.ES6模块与CommonJS模块有什么异同?
35.常见的DOM操作有哪些
36.for...in和for...of的区别
37.如何使用for...of遍历对象
for of是es6新增的,允许遍历好友iterator接口的数据结构,普通对象用for of 会出错
38.ajax、axios、fetch的区别
39.数组的遍历方法有哪些
40.forEach和map方法有什么区别
41.对原型、原型链的理解
每个元素都有一个prototype属性,它指向另一个对象或null。当访问一个对象的属性和方法时,如果这个对象没有,就会顺着原型链向上查找,直到找到这个属性或者方法为止。
42.原型修改、重写
43.原型链指向
44.原型链的终点是什么?如何打印出原型链的终点?
45.如何获得对象非原型链上的属性?
用hasOwnProperity()方法
46.对闭包的理解
闭包实现了外部访问函数内部变量的功能,让这些变量的值始终可以保存在内存当中。
47.对作用域、作用域链的理解
作用域是一套规则,可以存储变量、访问变量的规则
作用域链是当访问变量的作用域的时候,如果在当前作用域没找到,就会继续向上查找,直到找到该变量或者不存在父级作用域。
48.对执行上下文的理解
全局执行上下文
函数执行上下文
执行上下文
49.对this对象的理解
this是执行上下文的一个属性,它指向最后一次调用这个方法的对象。在实际开发中,this的指向可以通过4种调用模式来判断。
50.call() 和 apply() 的区别?
作用一样,区别在于传入参数不同
51.实现call、apply 及 bind 函数
52.异步编程的实现方式?
53.setTimeout、Promise、Async/Await 的区别
54.对Promise的理解
Promise是异步编程的一种解决方案,它是一个对象,可以获取异步操作消息,避免了回调地狱。
55.Promise的基本用法
操作成功返回resolve,操作失败返回reject,
56.Promise解决了什么问题
回调地狱
57.Promise.all和Promise.race的区别的使用场景
59.await 到底在等啥?
等待一个async的返回值
60.async/await的优势
读起来更同步,promise的链式调用会带来额外的阅读负担
promise传递中间值麻烦
错误提示优化,兼容trycatch
调试友好
61.async/await对比Promise的优势
读起来更同步,promise的链式调用会带来额外的阅读负担
promise传递中间值麻烦
错误提示优化,兼容trycatch
调试友好
62.async/await 如何捕获异常
try,catch
63.什么是回调函数?回调函数有什么缺点?如何解决回调地狱问题?
返回一个函数,容易写出回调地狱。
解决方法:
64.setTimeout、setInterval、requestAnimationFrame 各有什么特点?
65.对象创建的方式有哪些?
var person1 = new Person();
寄生构造函数模式 基于一个已有的类型,在实例化时对实例化的对象进行扩展。这样既不用修改原来的构造函数,也达到了扩展对象的目的。它的缺点是和工厂模式一样,无法实现对对象的识别。
66.对象继承的方式有哪些?
原型链实现基础,缺点是包含有引用类型的数据,会被所有的实例对象所共享,容易造成修改的混乱。在创建子类型的时候不能向父类型传递参数。
借用构造函数的方式
组合继承
原型链继承
寄生式继承
es6的extends
67.浏览器的垃圾回收机制
68.哪些情况会导致内存泄漏
69.请说一说this指向