开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第4天,点击查看活动详情
为什么 JS 是单线程, 而不是多线程
单线程是指 JavaScript 在执行的时候,有且只有一个主线程来处理所有的任务。 目的是为了实现与浏览器交互。 我们设想一下,如果 JavaScript 是多线程的,现在我们在浏览器中同时操作一个 DOM,一个线程要求浏览器在这个 DOM 中添加节点, 而另一个线程却要求浏览器删掉这个 DOM 节点, 那这个时候浏览器就会很郁闷,他不知道应该以哪个线程为准。 所以为了避免此类现象的发生,降低复杂度,JavaScript 选择只用一个主线程来执行代码,以此来保证程序执行的一致性。 请说出以下结果输出什么?为什么?
for(var i = 0; i < 5; i++) { setTimeout(function(){ console.log(i) }, 0) } 答案:5个5 解释:异步代码需要等同步代码先执行,所以当异步定时器执行时, 同步的for循环已经循环完毕
请说出以下flag的结果?为什么?
function show(){}
function getName() { return '牛夫人' }
var flag = show() || getName() 答案:flag值为'牛夫人' 解释:1.函数都会有一个默认的返回值undefined 2.逻辑或如果第一个值成立就直接返回第一个值,否则直接返回第二个值
请解释一下什么是重排与重绘?
重排:当改变dom结构的时候,就会从dom树开始从新渲染页面,这过程叫重排比如添加或者删除可见的DOM元素、元素尺寸改变、元素内容改变、浏览器窗口尺寸改变等等 重绘:当改变样式(不改变几何结构)的时候,它会从render树开始重新开始渲染页面,这过程叫重绘,比如改变颜色,透明等 怎么减少重排与重绘?
尽量避免操作DOM元素 避免多次修改dom结构或者css,集中处理,只引发一次重绘或者重排 请解释一下什么是防抖与节流
防抖(debounce) 总结:就是指触发事件后在 n 秒内函数只能执行一次,如果在 n 秒内又触发了事件,则会重新计算函数执行时间。 节流(throttle) 总结:就是每次触发事件的隔间至少要大于等于n秒,不会重置计时 说一下call、apply、bind三者的作用 与 区别
作用:三者的作用都是可以改变函数的this指向(function对象自带的方法) 区别:1.call、apply会直接调用原函数,bind不会直接调用函数,而会拷贝一份返回一个新函数 call、bind传参时一个个传入,而apply是把所有参数放到一个数组中传入 JS严格模式的使用与作用 答案:在代码前面使用"use strict"就可以开启严格模式;
作用:
消除 Javascript 语法的一些不合理、不严谨之处,减少一些怪异行为; 消除代码运行的一些不安全之处,保证代码运行的安全; 提高编译器效率,增加运行速度; 为未来新版本的 Javascript 做好铺垫。 举例JS严格模式的特点
变量必须要通过修饰符进行声明 函数的参数不能有同名属性,否则报错 禁止 this 指向全局对象 增加了保留字(比如 protected 、 static 和 interface ) 不能删除变量 delete prop 执行下面代码打印什么?为什么?
var a = {};
var b = {key: 'b'};
var c = {key: 'c'};
var d = [3,5,6];
a[b] = 123;
a[c] = 345;
a[d] = 333;
console.log(a[b]);
console.log(a[c]);
console.log(a[d]);
console.log(a[b]); // 打印:345
console.log(a[c]); // 打印:345
console.log(a[d]); // 打印:333
为什么:对象转化字符串会变成一个'[object Object]'