为什么JS是单线程?
假定js同时有两个线程,一个线程在某个DOM节点上添加内容,另一个线程删除了这个节点,这时候浏览器应该以哪个线程为准?
所以,为了避免复杂性,从一诞生,JavaScript就是单线程,这已经成了这门语言的核心特征
setTimeout时间延迟为何不准?
JS是单线程,先执行同步主线程,再执行异步任务队列
例举3种强制类型转换和2种隐式类型转换?
强制(parseInt,parseFloat,number)
隐式(+,-,*,/,%)
当加号运算符时,string和其它类型时,其它类型会转换成string,其它情况,都会转换成Number类型,
注:undefined 转化为Number是 为’NaN‘, 任何Number与NaN相加都为NaN
如何判断变量的类型?
- instanceof 用于检测构造函数的原型是否出现在某个实例对象的原型链上
- typeof 对于原始类型 (除null)是可以检测到的,但是引用类型就统一返回object
- Object.prototype.toString 会返回一个形如 "[object XXX]" 的字符串
console.log(typeof 'null') // string
console.log(typeof 123) // number
console.log(typeof false) // boolean
console.log(typeof null) // object
console.log(typeof undefined) // undefined
console.log(typeof {}) // object
求数组的最大值和最小值?
- Math.max()
值得注意的是:
1.如果有任一参数不能被转换为数值,则结果为 NaN。
2.如果没有参数,则结果为 -Infinity (注意是负无穷大) - 最原始的方法,莫过于循环遍历一遍
var arr = [6, 4, 1, 8, 2, 11, 23];
var result = arr[0];
for (var i = 1; i < arr.length; i++) {
result = Math.max(result, arr[i]);
}
console.log(result);
- reduce
既然是通过遍历数组求出一个最终值,那么我们就可以使用 reduce 方法:
var arr = [6, 4, 1, 8, 2, 11, 23];
function max(prev, next) {
return Math.max(prev, next);
}
console.log(arr.reduce(max));
- 排序
如果我们先对数组进行一次排序,那么最大值就是最后一个值:
var arr = [6, 4, 1, 8, 2, 11, 23];
arr.sort(function(a,b){return a - b;});
console.log(arr[arr.length - 1])
- apply 使用 apply 是另一种。
var arr = [6, 4, 1, 8, 2, 11, 23];
console.log(Math.max.apply(null, arr))
- ES6 ... 使用 ES6 的扩展运算符:
var arr = [6, 4, 1, 8, 2, 11, 23];
console.log(Math.max(...arr))
”==”和“===”的不同?
前者会自动转换类型,再判断是否相等 后者不会自动类型转换,直接去比较
new操作符都做了些什么?
创建一个空对象
将空对象的proto属性指向构造函数的原型
将this指向这个对象
返回这个对象
function myNew(fn, ...args) {
const obj = {}
obj.__proto__ = fn.prototype
fn.apply(obj, args)
return obj
}
平时工作中数组去重的方法?
- object key 得唯一性
- indexOf
- new Set() 成员值的唯一性
- 循环
promise对象 有什么优缺点吗?
优点
1.可以将异步操作 以同步操作的流程表达出来 避免层层嵌套
2.提供了统一的接口,使得控制异步操作更加容易
缺点
一旦建立就会立即执行,无法中途取消,不设置回调函数 内部抛出错误不会反应到外部当处于pending(进行中)状态时,无法得知目前的进展到哪一个阶段
instanceof 能否判断基本数据类型?
能 比如下面这种方式:
class Demo {
static [Symbol.hasInstance](x) {
return typeof x === 'number'
}
}
console.log(111, instanceof Demo)
其实就是自定义instanceof行为的一种方式,,这里将原有的instanceof方法重定义,换成了typeof,因此能够判断基本数据类型。
自己手写一个instanof
function myInstanceof(target, obj) {
if (typeof target !== 'object' || target === null) return false;
let proto = Object.getPrototypeOf(target);
while (true) {
if (target == null) return false;
if (proto === obj.prototype) return true;
proto = Object.getPrototypeOf(proto)
}
}
console.log(myInstanceof(dog1, Dog))
深拷贝和浅拷贝的区别?如何实现?
浅拷贝
- for... in 循环第一层
- Object.assign方法
- 直接用=赋值
- 扩展运算符
深拷贝
- 采用递归去拷贝所有层级属性
- JSON.parse
JSON.stringify与JSON.parse可以实现深拷贝,
就是利用JSON.stringify 将js对象序列化(JSON字符串),再使用JSON.parse来反序列化(还原)js对象
1.当json里面有RegExp、Error对象时,序列化的结果将只得到一个空对象;
2.当json里有function,undefined时,序列化的结果中function,undefined 会丢失
3.当json里有NaN、Infinity和-Infinity时,序列化结果后得到的为一个null值;
4.当json里有对象是由构造函数生成的时候,序列化的结果会丢弃该对象的 constructor
5.当对象中有在内存中的循环引用时,该方法将会报错。
网友评论