21道前端面试题,值得收藏~

不念不忘少年蓝@ 2022-12-11 12:30 279阅读 0赞

不点蓝字,我们哪来故事?

1、scrollWidth,clientWidth,offsetWidth的区别

scrollWidth:对象的实际内容的宽度,不包边线宽度,会随对象中内容超过可视区后而变大。clientWidth:对象内容的可视区的宽度,不包滚动条等边线,会随对象显示大小的变化而改变。offsetWidth:对象整体的实际宽度,包滚动条等边线,会随对象显示大小的变化而改变。

2、怎么让Chrome支持小于12px的文字?

  1. .size {
  2. font-size:10px;
  3. -webkit-transform:scale(0.8);
  4. display:block;
  5. }
  6. <div class="size">我是十号字</div>

3、写出最简单的去重方式

  1. //es6的new Set()方式
  2. let array=[1,2,3,4,5,6,2,3];
  3. [...new Set(array)]

4、数组对象全等比较

  1. 'abc' === 'abc' // true
  2. 1 === 1 // true
  3. [1,2,3] === [1,2,3] // false
  4. {a: 1} === {a: 1} // false
  5. {} === {} // false

5、变量提升

  1. var name = 'World!';
  2. (function () {
  3. if (typeof name === 'undefined') {
  4. var name = 'Jack';
  5. console.log('Goodbye ' + name);
  6. } else {
  7. console.log('Hello ' + name);
  8. }
  9. })();

理解这个,我们可以先看下面的题目:

  1. var x = 1; // Initialize x
  2. console.log(x + " " + y); // '1 undefined'
  3. var y = 2;

相当于

  1. var x = 1; // Initialize x
  2. var y; // Declare y
  3. console.log(x + " " + y); // '1 undefined'
  4. y = 2; // Initialize y

所以上面的自调用函数可以如下理解:

  1. var name = 'World!';
  2. (function () {
  3. var name;
  4. if (typeof name === 'undefined') {
  5. name = 'Jack';
  6. console.log('Goodbye ' + name);
  7. } else {
  8. console.log('Hello ' + name);
  9. }
  10. })();

输出结果:

  1. Goodbye Jack

6、局部变量和全局变量

  1. (function(){
  2. var x = y = 1;
  3. })();
  4. console.log(y);
  5. console.log(x);

输出结果:

  1. 1
  2. Uncaught ReferenceError: x is not defined

7、看以下代码输出什么?(一道经典面试题)

  1. // 这道题涉及了异步、作用域、闭包
  2. // 因为是setTimeout是异步的。正确的理解setTimeout的方式(注册事件): 有两个参数,第一个参数是函数,第二参数是时间值。 调用setTimeout时,把函数参数,放到事件队列中。等主程序运行完,再调用。
  3. for(var i = 1; i <= 3; i++){ //建议使用let 可正常输出i的值
  4. setTimeout(function(){
  5. console.log(i);
  6. },0);
  7. };

输出结果:

  1. 4 4 4

8、Javascript的基本数据类型

  1. undefined null number string boolen

9、console.log(8+ ‘9’)输出什么?undefinde==null?

  1. console.log(8+'9') // '89'
  2. console.log(null == undefined ) // true

10、判断一个字符串中出现次数最多的字符,统计这个次数

  1. var str = 'asdfssaaasasasasaa';
  2. var json = {};
  3. for (var i = 0; i < str.length; i++) {
  4. if(!json[str.charAt(i)]){
  5. json[str.charAt(i)] = 1;
  6. }else{
  7. json[str.charAt(i)]++;
  8. }
  9. };
  10. var iMax = 0;
  11. var iIndex = '';
  12. for(var i in json){
  13. if(json[i]>iMax){
  14. iMax = json[i];
  15. iIndex = i;
  16. }
  17. }
  18. console.log('出现次数最多的是:'+iIndex+'出现'+iMax+'次');

11、JS 对象(Object)和字符串(String)互转方法

  1. // 字符串转化为 对象
  2. var jsonString = '[{"name":"天鸽"},{"name":"梅花"},{"name":"台风"}]';
  3. var jsArr = JSON.parse(jsonString);
  4. jsArr.push({"name":"帕卡"});
  5. console.log(jsArr);
  6. // 把js对象 数组 转化为 JSON格式的字符串
  7. var result = JSON.stringify(jsArr);
  8. console.log(result);

12、var boo = ‘11’ + 2 - ‘1’输出什么

  1. var boo = '11' + 2 - '1'
  2. console.log(boo) // 111
  3. console.log(typeof boo) // number

13、css中box-sizing可以设置哪些属性?

  • content-box 宽度和高度分别应用到元素的内容框。在宽度和高度之外绘制元素的内边距和边框
  • border-box 为元素指定的任何内边距和边框都将在已设定的宽度和高度内进行绘制
  • inherit 规定应从父元素继承 box-sizing 属性的值

14、Javascript的事件流模型都有什么?

“事件冒泡”:事件开始由最具体的元素接受,然后逐级向上传播

“事件捕捉”:事件由最不具体的节点先接收,然后逐级向下,一直到最具体的

“DOM事件流”:三个阶段:事件捕捉,目标阶段,事件冒泡

15、看下列代码,输出什么?解释原因。

  1. var a = null;
  2. alert(typeof a);

输出结果:object 解释:null是一个只有一个值的数据类型,这个值就是null。表示一个空指针对象,所以用typeof检测会返回”object”。

16、target、currentTarget的区别?

currentTarget当前所绑定事件的元素

target当前被点击的元素

17、export和export default的区别?

  1. export default xxx
  2. import xxx from './'
  3. export xxx
  4. import {xxx} from './'

18、请用代码写出(今天是星期 x)其中 x 表示当天是星期几,如果当天是星期一,输出应该是”今天是星期一”

  1. var days = ['日','一','二','三','四','五','六'];
  2. var date = new Date();
  3. console.log('今天是星期' + days[date.getDay()]);

19、如何判断一个对象是否为数组

如果浏览器支持 Array.isArray()可以直接判断否则需进行必要判断

  1. function isArray(arg) {
  2. if (typeof arg === 'object') {
  3. return Object.prototype.toString.call(arg) === '[object Array]';
  4. }
  5. return false;
  6. }

20、forEach、for in、for of三者区别

  1. forEach更多的用来遍历数组
  2. for in 一般常用来遍历对象或json
  3. for of数组对象都可以遍历,遍历对象需要通过和Object.keys()
  4. for in循环出的是keyfor of循环出的是value

21、使用结构赋值,实现两个变量的值的交换

  1. let a = 1;
  2. let b = 2;
  3. [a,b] = [b,a];

感谢大家

  • 爱心三连击 「点赞,转发,在看」,您的点赞,是我最大的动力
  • 关注公众号「前端小喵」,有更多好文推荐哦!
  • 阅读往期推荐好文

format_png

●从基础开始学起,http协议那些事

●不容错过!css阴影趣味用法大全~

●金九银十必看前端面试基础(一)

●值得收藏的前端必备javascript,this指向详解~

发表评论

表情:
评论列表 (有 0 条评论,279人围观)

还没有评论,来说两句吧...

相关阅读