2024年前端面试题之(js基础篇)_实现对该数组的倒排,输出[5,1,4,2,6,3](1)

最后前端到底应该怎么学才好?

如果你打算靠自己摸索自学,那么你首先要了解学习前端的基本大纲,这是你将要学习的主要内容,理解以及掌握好这些内容,便可以找到一份初级的前端开发工作。你还需要有一套完整的前端学习教程,作为初学者最好的方式就是看视频教程学习,初学者容易理解接受。

不要选择买书学习,这样的方式没有几个人能学会,基本都是看不下去书,也看不懂书。如果喜欢看书的学弟,可以买一些经典的书籍作为辅助即可,主要还是以看教程为主。每天抽出固定几个小时学习,做好长期学习的准备。学习编程并不是每天光看视频,你学习编程最重要的目的是为了编写软件产品,提供给大众使用,所以用手写出代码实现功能才是我们要做的事情。

开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

7、IE和标准下有哪些兼容性的写法
a、获取事件对象:var ev = ev || window.event 
var ev=ev?ev:window.evnet; 
srcElement:IE9之前的浏览器用来获取事件目标元素 
target:IE9+、ff、chrome用来获取事件的目标元素 
b、获取事件目标元素:var target = ev.srcElement||ev.target 
c、innerText

8、call和apply的区别
考点:call和apply的用法

call和apply相同点:改变函数中this的指向

不同点:函数参数的传递形式 
call将函数参数依次传入 
apply将函数参数用一个数组的形式传入

无参数调用:
function fn(){
    alert(this.name);
}
var p1={name:1};
fn.call(p1);
fn.apply(p1);

有参数调用:

function fn2(name,age){
    this.name=name;
    this.age=age;
}
var p1={};
fn2.call(p1,“张三”,20);
fn2.apply(p1,[“张三”,20]);

2、原型继承第二种方式:
function Cat(name) {
    this.name = name;
}
function Animal() {}
Animal.prototype.run = function () {
    alert(“动物跑”);
};
Cat.prototype = new Animal();
Cat.prototype.constructor=Cat;

3、借用构造函数
function Cat(name,age) {
    Animal.call(this,name,age);
}
function Animal(name,age) {
    this.name = name;
    this.age=age;
}

4、经典继承
function create(obj) {
    if(Object.create) {
    return Object.create(obj);  
    } else {
    function F(){};
    F.prototype = obj;
    return new F();
    } 
}

10、JavaScript this、闭包、作用域
this:指向调用上下文

作用域:定义一个函数就开辟了一个局部作用域,整个js执行环境有一个全局作用域

闭包:一个函数可以访问其他函数中的变量(闭包是一个受保护的变量空间)

var f=(function fn(){
    var name=1;
    return function(){
        name++;
        console.log(name);
    }
})();

11、事件委托是什么
利用事件冒泡的原理,将事件绑定在父容器中,让父容器代为触发

12、闭包是什么,有什么特性,对页面有什么影响
闭包就是能够读取其他函数内部变量的函数。 
闭包的缺点: 
1 更多的内存消耗 
2 性能问题(跨作用域访问) 
3滥用闭包函数会造成内存泄露,因为闭包中引用到的包裹函数中定义的变量都永远不会被释放,所以我们应该在必要的时候,及时释放这个闭包函数

闭包是一种特殊的对象。它由两部分构成:函数,以及创建该函数的环境。 
可以把闭包简单理解成 “定义在一个函数内部的函数”,闭包就是将函数内部和函数外部连接起来的一座桥梁。闭包有如下特性: 
a. JavaScript允许你使用在当前函数以外定义的变量 
b. 即使外部函数已经返回,当前函数仍然可以引用在外部函数所定义的变量 
c. 闭包可以更新外部变量的值 
d. 用闭包模拟私有方法 
由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题

13、如何阻止事件冒泡和默认事件
阻止事件冒泡: 
IE9+ FF Chrome:e. stopPropagation(); 
window.event.cancelBubble=true;//ie9之前

默认行为:html标签所具有的默认行为,比如: 
a、点击a标签,就会默认跳转到指定的页面 
b、点击submit按钮,就会自动提交表单 
适用场景: 
1、异步操作 
2、提交表单之前对表单进行一些基本的验证,比如邮箱是否合法,用户名是不是满足指定的格式 
为了不让a点击之后跳转,我们就要给他的点击事件进行阻止 
3、文本框获得焦点

阻止默认行为: 
IE9之前:window.event.returnValue=false; 
IE9+ FF Chrome: e.preventDefault();

14、添加 删除 替换 插入到某个节点的方法
obj.appendChild() 
insertBefore 
obj.insertBefore(newElement, referenceElement ) 
参数1:被插入的元素 
参数2:目标元素

obj.replaceChild(newChild, oldChild)//替换
obj.removeChild(child)//删除

15、javascript的本地对象,内置对象和宿主对象
本地对象为Array RegExp等可以new实例化 
内置对象为global Math 等不可以实例化的 
宿主为浏览器自带的document,window 等

16、document load 和document ready的区别
document.onload 是在结构和样式加载完才执行js 
document.ready原生中没有这个方法,jquery中有 $().ready(function)

DOMCententLoaded事件:页面的文档结构(DOM树)加载完之后就会触发

window.onload:不仅仅要在结构和样式加载完,还要执行完所有的外部样式、图片这些资源文件,全部加载完才会触发window.onload事件

17、””和“=”的不同
==:会自动转换类型 
===:先判断左右两边的数据类型,如果数据类型不一致,直接返回false 
之后才会进行两边值的判断

1==”1”
null==undefined;//==true
18、javascript的同源策略
一段脚本只能读取来自于同一来源的窗口和文档的属性,这里的同一来源指的是主机名、协议和端口号的组合 
http,ftp:协议 
关键词解释: 
主机名:localhost、www.baidu.com 
协议:http https ftp 
端口:一个网站对应着一个端口, http协议的默认端口:80 
https协议的默认端口是8083 
同源策略带来的麻烦:ajax在不同域名下的请求无法实现, 
如果说想要请求其他来源的js文件,或者json数据,那么可以通过jsonp来解决 
跨域解决方式一 
跨域解决方式二

19、编写一个数组去重的方法
var arr=[1,1,3,4,2,4,7]; 
=>[1,3,4,2,7] 
思路1: 
1、先创建一个空数组,用来保存最终的结果 
2、循环数组元素,判断元素在新数组中是否有相同元素,如果没有就插入到新数组中 
3、返回新数组 
代码1:

function unique(arr){
    var result=[];
    for (var i = 0, len = arr.length; i < len; i++) {
        var arri = arr[i];
        if(result.indexOf(arri)<0){
            result.push(arri);
        }
    }
    return result;
}

20、JavaScript是一门什么样的语言,它有哪些特点?
弱类型、脚本语言、面向对象、 
没有标准答案。 
运行环境:JS引擎(v8(Chrome)/SpiderMonkey(FireFox)/JavaScriptCore(Safari) 
/Chakra(IE)) 
语言特性: 
1、面向对象:原型继承、构造函数、原型链 
2、动态语言:弱类型语言

//动态语言的特性
var num=10;//num是一个数字类型
num=“jim”;//此时num又变成一个字符串类型

//我们把一个变量用来保存不同数据类型的语言称之为一个动态语言
//静态语言:c# java c c++ OC
//int a;
//静态语言在声明一个变量就已经确定了这个变量的数据类型,
//  而且在任何时候都不可以改变他的数据类型

21、JavaScript的数据类型都有什么?
基本数据类型:number、string、boolean、undefined、null 
复杂数据类型:Object(Array,Date,RegExp,Function)

22、已知ID的Input输入框,希望获取这个输入框的输入值,怎么做?(不使用第三方框架)
document.getElementById(“ID”).value

23、希望获取到页面中所有的checkbox怎么做?(不使用第三方框架)
var domList = document.getElementsByTagName(“input”);
var ckList = [];//返回的所有的checkbox
var len = domList.length;
for (var i = 0; i < len; i++) {
    if (domList[i].type == “checkbox”) {
        ckList.push(domList[len]);
    }
}

24、设置一个已知ID的DIV的html内容为xxxx,字体颜色设置为黑色(不使用第三方框架)
    var dom = document.getElementById(“ID”);
dom.innerHTML = “xxxx”
dom.style.color = “#000”;//”black”

25、当一个DOM节点被点击时候,我们希望能够执行一个函数,应该怎么做?
HTML事件绑定:
DOM0事件绑定:xxx.onclick = test 
DOM2事件绑定:addEventListener(div1, ‘click’, test) 
扩展:Javascript的事件流模型都有什么? 
事件流: 
从最不确定的元素(最外层容器)到目标元素,再由目标元素到最不确定的元素(最外层容器); 
也就是说先经历事件捕获,到目标元素,再经历事件冒泡 
“事件冒泡”:事件开始由最具体的元素接受,然后逐级向上传播 
“事件捕捉”:事件由最不具体的节点先接收,然后逐级向下,一直到最具体的
26、看下列代码输出为何?解释原因。
    var a;
alert(typeof a); // “undefined”
//alert(b); // 报错 
b=10;
alert(typeof b);//”number”

答案:undefined、number 
undefined产生情况: 
1、一个变量定义了却没有被赋值 
2、想要获取一个对象上不存在的属性或者方法: 
3、一个数组中没有被赋值的元素 
4、调用函数,参数未传 
扩展:not defined语法错误

27、看下列代码,输出什么?解释原因。
    var a = null;
alert(typeof a); //object
28、看下列代码,输出什么?解释原因。
var undefined;//此时undefined这个变量的值是undefined
undefined == null; // true
1 == true;   // true
此时会把布尔类型的值转换为数字类型 true=1 false=0
2 == true;   // false
0 == false;  // true
0 == ‘’;     // true
NaN == NaN;  // false isNaN
[] == false; // true   解释:会把[]和false都通过Number()转换为数字类型
[] == ![];   // true   解释:![]:false
[]==[];//false

一个是number一个是string时,会尝试将string转换为number 
一个是number一个是boolean,将boolean转换为number,结果:true:1 false:0 
一个是object 另一个是string或number,将Object转换成number或string 
所以,对于0、空字符串的判断,建议使用 “=” 。“=”会先判断两边的值类型,类型不匹配时为false。

28.2、看下列代码会有什么样的输出?
var foo = “11”+2-“1”;  
console.log(foo);//112-1=111
console.log(typeof foo);//”number”

考点: 
1、数字和字符串都可以用加法运算符,数字和字符串相加,结果就是一个字符串 
2、但是减法运算符只能用于两个数字之间,想要执行减法运算,必须把两边数字都变成数字类型的 
答案:”111”、”number”

29、看代码给答案。
var a = new Object();
a.value = 1;
b = a; //b.value=1
b.value = 2;//b.value=2;a.value=2,因为a和b指向同一块引用类型的值
alert(a.value);

答案:2(考察引用数据类型细节)

30、已知数组var stringArray = [“This”, “is”, “Baidu”, “Campus”],alert出”This is Baidu Campus”。
考点:数组的join方法的使用 
答案:alert(stringArray.join(“ ”))

30.2、已知有字符串foo=”get-element-by-id”,写一个function将其转化成驼峰表示法”getElementById”。
    function combo(msg){
    var arr=msg.split(“-”);//[get,element,by,id]
    for(var i=1;i<arr.length;i++){
        arr[i]=arr[i].[0].toUpperCase()+arr[i].substring(1);//Element
    }
    msg=arr.join(“”);//msg=” getElementById”
    return msg;
}

31、var numberArray = [3,6,2,4,1,5];

  1. 实现对该数组的倒排,输出[5,1,4,2,6,3]

function reverseArray(arr){
    var result=[];
    //方法1:
    /*for (var i = arr.length - 1; i >= 0; i–) {
        result.push(arr[i]);
    }*/
    //方法2:
    for (var i = 0, len = arr.length; i < len; i++) {
        result.unshift(arr[i]);
    }
    return result;
}

  1. 实现对该数组的降序排列,输出[6,5,4,3,2,1] 
    冒泡排序过程演示

function sortDesc(arr) {
    for (var i = 0, len = arr.length; i < len; i++) {
        for (var j = i + 1, len2 = arr.length; j < len2; j++) {
            //>就是降序 <就是升序
            if (arr[j] > arr[i]) {
                var temp = arr[j];
                arr[j] = arr[i];
                arr[i] = temp;
            }
        }
    }
    return arr;
}

32、输出今天的日期,以YYYY-MM-DD的方式,比如今天是2014年9月26日,则输出2014-09-26
考点:日期对象Date相关API的使用

var d = new Date();
1
// 获取年,getFullYear()返回4位的数字 
var year = d.getFullYear(); 
// 获取月,月份比较特殊,0是1月,11是12月 
var month = d.getMonth() + 1; 
// 变成两位 
month = month < 10 ? ‘0’ + month : month; 
// 获取日 
var day = d.getDate(); 
day = day < 10 ? ‘0’ + day : day; 
alert(year + ‘-’ + month + ‘-’ + day);

**33、将字符串”{id}{id}{name}{id}”中的{id}”中的{id}替换成10,{KaTeX parse error: Expected 'EOF', got '}' at position 5: name}̲替换成Tony (使用正则表达…name}”.replace(/{$id}/g, ’10′).replace(/{$name}/g, ‘Tony’);

34、为了保证页面输出安全,我们经常需要对一些特殊的字符进行转义,请写一个函数escapeHtml,将<, >, &, “进行转义
function escapeHtml(str) {
1
//[<>”&]:中括号中字符只要其中的一个出现就代表满足条件 
//给replace第二个参数传递一个回调函数,回调函数中参数就是匹配结果,如果匹配不到就是null

return str.replace(/[<>”&]/g, function(match) {
    switch (match) {
      case “<”:
         return “<”;
      case “>”:
          return “>”;
      case “&”:
          return “&”;
      case “\””😕/双引号包裹一个单引号:“’” 单引号包裹一个双引号 ‘””’
         return “"”;
     }
  });
}

35、foo = foo||bar ,这行代码是什么意思?为什么要这样写?
这种写法称之为短路表达式 
相当于:

var foo;
if(foo){
    foo=foo;
}else{
    foo=bar;
}

答案:常用于函数参数的空判断 
短路表达式:作为”&&”和”||”操作符的操作数表达式,这些表达式在进行求值时,只要最终的结果已经可以确定是真或假,求值过程便告终止,这称之为短路求值。 
考点:if条件的真假判定 
记住以下是false的情况:空字符串、false、undefined、null、0

36、看下列代码,将会输出什么?
考点:1、变量作用域 2、变量声明提升

var foo = 1;
function f(){
    console.log(foo);
    var foo = 2;
    console.log(foo);
}
f();

答案:输出undefined 和 2。

37、用js实现随机选取10–100之间的10个数字,存入一个数组,并排序。
var iArray = []; 
function getRandom(istart, iend){
        var iChoice = iend - istart +1;
        return Math.floor(Math.random() * iChoice+ istart);
}
Math.random()就是获取0-1之间的随机数(永远获取不到1)
for(var i=0; i<10; i++){
var result= getRandom(10,100);
        iArray.push(result);
}
iArray.sort();

38、把两个数组合并,并删除第二个元素。
考点:1、数组的concat、splice用法 
splice() 方法删除数组的元素,或者向数组中添加元素,然后返回被删除的项目。 
参数1:从何处开始删除数组的元素(使用负数则从数组的末尾开始) 
参数2:要删除的元素个数(如果是0,就代表不删除) 
参数3,4,5。。。:要添加的元素

var array1 = [‘a’,‘b’,‘c’];
1
var bArray = [‘d’,’e’,’f’]; 
var cArray = array1.concat(bArray); 
cArray.splice(1,1);

39、怎样添加、移除、移动、复制、创建和查找节点(使用原生JS实现)
1)创建新节点 
createDocumentFragment() //创建一个DOM文档片段 
createElement() //创建一个具体的元素 
createTextNode() //创建一个文本节点 
2)添加、移除、替换、插入 
appendChild() //追加 
removeChild() //移除 
replaceChild() //替换 
insertBefore() //插入 
3)查找 
getElementsByTagName() //通过标签名称 
getElementsByName() //通过元素的Name属性的值 
getElementsByTagName() // 通过类名查找 
getElementById() //通过元素Id,唯一性

40、有这样一个URL:http://item.taobao.com/item.htm?a=1&b=2&c=&d=xxx&e,请写一段JS程序提取URL中的各个GET参数(参数名和参数个数不确定),将其按key-value形式返回到一个json结构中,如{a:’1′, b:’2′, c:”, d:’xxx’, e:undefined}。
答案:

function serlize(url){
    var result={};
    //1、寻找?后面的字符串
    url=url.substr(url.indexOf(“?”)+1);
    //2、将字符串用&分隔
    var args=url.split(“&”);//[“a=1”,”b=2”]
    for (var i = 0, len = args.length; i < len; i++) {
        var arg = args[i];
    var item = arg.split(‘=’);
        //3、对象的键=值
        result[item[0]]= item[1];
    }
    return result;
}

serlize(‘http://item.taobao.com/item.htm?a=1&b=2&c=&d=xxx&e‘);

41、正则表达式构造函数var reg=new RegExp(“xxx”)与正则表达字面量var reg=//有什么不同?匹配邮箱的正则表达式?
RegExp 
答案:当使用RegExp()构造函数的时候,不仅需要转义引号(即\”表示”),并且还需要双反斜杠(即\表示一个\)。使用正则表达字面量的效率更高。 
邮箱的正则匹配: 
var regMail = /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+((.[a-zA-Z0-9_-]{2,3}){1,2})$/; 
42、.看下面代码,给出输出结果。

for(var i=1;i<=3;i++){
  setTimeout(function(){
      console.log(i);    
  },0);  
}

答案:4 4 4。 
考点:setTimeout的执行原理——Javascript事件处理器在线程空闲之前不会运行。 
JavaScript运行机制:事件循环 
追问,如何让上述代码输出1 2 3? 
代码1:用立即执行函数

for(var i=1;i<=3;i++){ 
setTimeout((function(num){ 
return function(){ 
console.log(num); 
}

})(i),0);
1

代码2:使用闭包 
for(var i=1;i<=3;i++){ 
setTimeout((function(){ 
var j=i; 
return function(){ 
console.log(j); 
}; 
})(),0); 
}

42、写一个function,清除字符串前后的空格。(兼容所有浏览器)
使用自带接口trim(),考虑兼容性(IE9以下浏览器不支持): 
考点:1、原型扩展 2、正则表达式 3、字符串的replace方法 
if(typeof String.prototype.trim !=”function”){ 
String.prototype.trim=function(){ 
return this.replace(/^\s+|\s+$/g,”“); 


var str=” hello “;

43、Javascript中callee和caller的作用?
arguments.callee:获得当前函数的引用 
fn.caller是返回一个对函数的引用,该函数调用了当前函数;(被废弃) 
callee是返回正在被执行的function函数,也就是所指定的function对象的正文。

44、Javascript中, 以下哪条语句一定会产生运行错误? 答案( BC )
A、var _变量=NaN; 
B、var 0bj = []; 
C、var obj = //; 
D、var obj = {}; 
//正确答案:BC

45、以下两个变量a和b,a+b的哪个结果是NaN? 答案( C )
A、var a=undefind; b=NaN //拼写 
B、var a=‘123’; b=NaN 
C、var a =undefined , b =NaN 
D、var a=NaN , b=’undefined’ 
解析:A、拼写错误 B、结果是字符串 D、结果是字符串

46、var a=10; b=20; c=4; ++b+c+a++ 以下哪个结果是正确的?答案( B )
考点:++运算符的使用 21+4+10=35 
A、34 B、35 C、36 D、37 
//var a=10; b=20; c=4; 
//++b+c+a++ 
//21+4+10=35;

var a = 1; 
a++ + a++ = ? 
a = 1; 
a++ + ++a = ? 
a = 1; 
++a + a++ = ? 
a = 1; 
++a + ++a = ?

47、下面的JavaScript语句中,( D )实现检索当前页面中的表单元素中的所有文本框,并将它们全部清空
A. for(vari=0;i< form1.elements.length;i++) {
if(form1.elements.type==”text”)
form1.elements.value=”";
}

B. for(vari=0;i<document.forms.length;i++) {
if(forms[0].elements.type==”text”)
forms[0].elements.value=”“;
}
C. if(document.form.elements.type==”text”)
form.elements.value=””;
D. for(vari=0;i<document.forms.length; i++){
var form= document.forms[i];
for(var j=0;j< form.elements.length; j++){
if(form [j].type==”text”)
form.elements [j].value=”";
}
}

48、要将页面的状态栏中显示“已经选中该文本框”,下列JavaScript语句正确的是( A )
A. window.status=”已经选中该文本框” 
B. document.status=”已经选中该文本框” 
C. window.screen=”已经选中该文本框” 
D. document.screen=”已经选中该文本框”

49、以下哪条语句会产生运行错误:(A、D)
A.var obj = (); 
B.var obj = []; 
C.var obj = {}; 
D.var obj = //;

50、以下哪个单词不属于javascript保留字:(B)
A.with 
B.parent 
C.class 
D.void

51、请选择结果为真的表达式:(C)
考点:1、instanceof:用于检测某个对象是不是某个构造函数的实例 
2、==、===用于数据类型的判断 
A.null instanceof Object 
B.null === undefined 
C.null == undefined 
D.NaN == NaN

52、Javascript中, 如果已知HTML页面中的某标签对象的id=”username”,用_document.getElementById(‘username’) _方法获得该标签对象。
53、typeof运算符返回值中有一个跟javascript数据类型不一致,它是”function”。
考点:type运算符

54、定义了一个变量,但没有为该变量赋值,如果alert该变量,javascript弹出的对话框中显示undefined___ 。
55、分析代码,得出正确的结果。

var a=10, b=20 , c=30; 
++a; 
a++; 
e=++a+(++b)+(c++)+a++;//13+21+30+13 
alert(e); 
弹出提示对话框:77 
var a=10, b=20 , c=30; 
++a;//a=11 
a++;//a=11 
e=++a+(++b)+(c++)+a++; 
//a=12 13+21+30+13=77 
alert(e);

56、写出函数DateDemo的返回结果,系统时间假定为今天
function DateDemo(){ 
var d, s=”今天日期是:”; 
d = new Date(); 
s += d.getMonth() + “/”; 
s += d.getDate() + “/”; 
s += d.getFullYear(); 
return s;} 
考点:Date对象的api使用, 
注意点:getMonth()打印的是比当前月份小1的数字 
结果:今天日期是:

57、写出程序运行的结果?
for(var i=0, j=0; i<10, j<6; i++, j++){ 
//循环结束条件:j=5 i=5 
k = i + j;//k=10 

//结果:10 
for循环 
解析:最终的结果其实就是程序运行的最后一个表达式的值 
这里考的是逗号运算符的特性;

58、阅读以下代码,请分析出结果:
var arr = new Array(1 ,3 ,5);
最后

开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

最后写上我自己一直喜欢的一句名言:世界上只有一种真正的英雄主义就是在认清生活真相之后仍然热爱它

  • 10
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值