JS知识点(五)+试题
1、Js内存泄漏情况:
- 意外的全局变量;
- 闭包;
- 未被清空的定时器;
- 未被销毁的事件监听;
- DOM 引用
2、判断
var min = Math.min(); max = Math.max(); console.log(min < max); // false
- MDN 相关文档是这样解释的
- Math.min 的参数是 0 个或者多个,如果多个参数很容易理解,返回参数中最小的。如果没有参数,则返回 Infinity,无穷大。
- 而 Math.max 没有传递参数时返回的是-Infinity.所以输出 false
3、为什么js是单线程
参考答案:
这主要和js的用途有关,js是作为浏览器的脚本语言,主要是实现用户与浏览器的交互,以及操作dom;这决定了它只能是单线程,否则会带来很复杂的同步问题。 举个例子:如果js被设计了多线程,如果有一个线程要修改一个dom元素,另一个线程要删除这个dom元素,此时浏览器就会一脸茫然,不知所措。所以,为了避免复杂性,从一诞生,JavaScript就是单线程,这已经成了这门语言的核心特征,将来也不会改变
扩展:
什么是进程?
进程:是cpu分配资源的最小单位;(是能拥有资源和独立运行的最小单位)
什么是线程?
线程:是cpu调度的最小单位;(线程是建立在进程的基础上的一次程序运行单位,一个进程中可以有多个线程)
浏览器是多进程的?
放在浏览器中,每打开一个tab页面,其实就是新开了一个进程,在这个进程中,还有ui渲染线程,js引擎线程,http请求线程等。 所以,浏览器是一个多进程的。
为了利用多核CPU的计算能力,HTML5提出Web Worker标准,允许JavaScript脚本创建多个线程,但是子线程完全受主线程控制,且不得操作DOM。所以,这个新标准并没有改变JavaScript单线程的本质。
4、写一个判断是否是空对象的函数
function isEmpty(value) { return ( value === null || value === undefined || (typeof value === 'object' && Object.keys(value).length === 0) ) }
5、倒计时,立即执行
6、字符串中的单词逆序输出(手写)
//法一
function strReverse(str) { return str.split("").reverse().join("") }
//法二 function strReverse(str) { var i=str.length; var nstr = ""; i=i-1; for (var x = i; x >=0; x--) { nstr+=str.charAt(x) } return nstr }
//法三 function strReverse(str) { return str.split('').reduce((prev, next) => next + prev); }
//法四 charAt(i) 函数 是获取字符串中i+1位置的字符 function strReverse(str) { var newstr=""; for(var i=0;i){ newstr=str.charAt(i)+newstr; } return newstr }
//法五
function strReverse(str) { if(str.length===1){ return str } return str.slice(-1)+strReverse(str.slice(0,-1)); }
7、判断
console.log([]==[]); // false console.log([]== 0); // true
- 原始值的比较是值的比较:
- 它们的值相等时它们就相等(==)
- 对象和原始值不同,对象的比较并非值的比较,而是引用的比较:
- 即使两个对象包含同样的属性及相同的值,它们也是不相等的
- 即使两个数组各个索引元素完全相等,它们也是不相等的,所以[]!=[]
- []==0,是数组进行了隐式转换,空数组会转换成数字0,所以相等
8、三数之和
给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。
采用排序+双指针的思路来做,遍历排序后的数组,定义指针l和r,分别从当前遍历元素的下一个元素和数组的最后一个元素往中间靠拢,计算结果跟目标对比
var threeSum = function(nums) { if(nums.length < 3){ return []; } let res = []; // 排序 nums.sort((a, b) => a - b); for(let i = 0; i < nums.length; i++){ if(i > 0 && nums[i] == nums[i-1]){ // 去重 continue; } if(nums[i] > 0){ // 若当前元素大于0,则三元素相加之后必定大于0 break; } // l为左下标,r为右下标 let l = i + 1; r = nums.length - 1; while(l<r){ let sum = nums[i] + nums[l] + nums[r]; if(sum == 0){ res.push([nums[i], nums[l], nums[r]]); while(l < r && nums[l] == nums[l+1]){ l++ } while(l < r && nums[r] == nums[r-1]){ r--; } l++; r--; } else if(sum < 0){ l++; } else if(sum > 0){ r--; } } } return res; };
9、去掉字符串前后的空格
//正则
//jQuery $.trim(str) function trim(str){ return str.replace(/^(\s|\u00A0)+/,'').replace(/(\s|\u00A0)+$/,''); }