JavaScript面试题附答案汇总(2021年JavaScript面试题及答案大全)
JavaScript面试题及答案【最新版】JavaScript高级面试题大全(2021版),发现网上很多JavaScript面试题及答案整理都没有答案,所以花了很长时间搜集,本套JavaScript面试题大全,JavaScript面试题大汇总,有大量经典的JavaScript面试题以及答案,包含JavaScript语言常见面试题、JavaScript工程师高级面试题及一些大厂JavaScript开发面试宝典,面试经验技巧等,应届生,实习生,企业工作过的,都可参考学习!
这套JavaScript面试题汇总大全,希望对大家有帮助哈~
博主已将这些面试题整理成了一个JavaScript面试手册,是PDF版
下载链接:高清172份,累计 7701 页大厂面试题 PDF
1、如何添加一个dom对象到body中?innerHTML和innerText区别?
body.appendChild(dom元素);
innerHTML:从对象的起始位置到终止位置的全部内容,包括Html标签。
innerText:从起始位置到终止位置的内容, 但它去除Html标签
分别简述五个window对象、属性
成员对象
1、 window.event window.document window.history
2、 window.screen window.navigator window.external
3、 Window对象的属性如下:
4、 window //窗户自身
5、 window.self //引用本窗户window=window.self
6、 window.name //为窗户命名
7、 window.defaultStatus //设定窗户状态栏信息
8、 window.location //URL地址,配备布置这个属性可以打开新的页面
2、this是什么 在不同场景中分别代表什么###
(1)function a(){ this ?} //This:指向windows
(2)function b(){ return function(){ this ?}}b()(); //This:指向windows
(3)function c(){ return {s:function(){this}}}c().s(); //This:指向object
由于其运行期绑定的特性,JavaScript 中的 this 含义要丰富得多,它可以是全局对象、当前对象或者任意对象,这完全取决于函数的调用方式。
3、offsetWidth/offsetHeight,clientWidth/clientHeight与scrollWidth/scrollHeight的区别
1、 offsetWidth/offsetHeight返回值包含content + padding + border,效果与e.getBoundingClientRect()相同
2、 clientWidth/clientHeight返回值只包含content + padding,如果有滚动条,也不包含滚动条
3、 scrollWidth/scrollHeight返回值包含content + padding + 溢出内容的尺寸
4、call和apply 有什么好处?
用call和apply:实现更好的继承和扩展,更安全。
5、为什么此代码 obj.someprop.x 会引发错误?
const obj = {};console.log(obj.someprop.x);
显然,由于我们尝试访问someprop属性中的x属性,而 someprop 并没有在对象中,所以值为 undefined。记住对象本身不存在的属性,并且其原型的默认值为undefined。因为undefined没有属性x,所以试图访问将会报错。
6、如何判断值是否为数组?
我们可以使用Array.isArray方法来检查值是否为数组。当传递给它的参数是数组时,它返回true,否则返回false。
console.log(Array.isArray(5)); // false
console.log(Array.isArray("")); // false
console.log(Array.isArray()); // false
console.log(Array.isArray(null)); // false
console.log(Array.isArray({ length: 5 })); // false
console.log(Array.isArray([])); // true
如果环境不支持此方法,则可以使用polyfill实现。
function isArray(value){ return Object.prototype.toString.call(value) === "[object Array]" }
当然还可以使用传统的方法:
let a = [] if (a instanceof Array) { console.log('是数组') } else { console.log('非数组') }
7、&& 运算符能做什么
&& 也可以叫逻辑与,在其操作数中找到第一个虚值表达式并返回它,如果没有找到任何虚值表达式,则返回最后一个真值表达式。它采用短路来防止不必要的工作。
console.log(false && 1 && []); // false
console.log(" " && true && 5); // 5
使用if语句
const router: Router = Router();
router.get('/endpoint', (req: Request, res: Response) => {
let conMobile: PoolConnection;
try {
//do some db operations
} catch (e) {
if (conMobile) {
conMobile.release();
}
}
});
使用&&操作符
const router: Router = Router();
router.get('/endpoint', (req: Request, res: Response) => {
let conMobile: PoolConnection;
try {
//do some db operations
} catch (e) {
conMobile && conMobile.release()
}
});
8、defer和async
1、 defer并行加载js文件,会按照页面上script标签的顺序执行
2、 async并行加载js文件,下载完成立即执行,不会按照页面上script标签的顺序执行
9、如何在不使用%模运算符的情况下检查一个数字是否是偶数?
我们可以对这个问题使用按位&运算符,&对其操作数进行运算,并将其视为二进制值,然后执行与运算。
function isEven(num) { if (num & 1) { return false } else { return true } }
0 二进制数是 000 1 二进制数是 001 2 二进制数是 010 3 二进制数是 011 4 二进制数是 100 5 二进制数是 101 6 二进制数是 110 7 二进制数是 111
以此类推…
因此,当我们执行console.log(5&1)这个表达式时,结果为1。首先,&运算符将两个数字都转换为二进制,因此5变为101,1变为001。
然后,它使用按位怀运算符比较每个位(0和1)。101&001,从表中可以看出,如果a & b为1,所以5&1结果为1。
101 & 001
101
001
001
1、 首先我们比较最左边的1&0,结果是0。
2、 然后我们比较中间的0&0,结果是0。
3、 然后我们比较最后1&1,结果是1。
4、 最后,得到一个二进制数001,对应的十进制数,即1。
由此我们也可以算出console.log(4 & 1) 结果为0。知道4的最后一位是0,而0 & 1 将是0。如果你很难理解这一点,我们可以使用递归函数来解决此问题。
function isEven(num) {
if (num < 0 || num === 1) return false;
if (num == 0) return true;
return isEven(num - 2);
}
10、什么是作用域和作用域链?
作用域可以理解为一个独立的地盘,可以理解为标识符所能生效的范围。作用域最大的用处就是隔离变量,不同作用域下同名变量不会有冲突。ES6中有全局作用域、函数作用域和块级作用域三层概念。
当一个变量在当前块级作用域中未被定义时,会向父级作用域(创建该函数的那个父级作用域)寻找。如果父级仍未找到,就会再一层一层向上寻找,直到找到全局作用域为止。这种一层一层的关系,就是作用域链 。

