JavaScript高频面试试题——2020.12.04

1.什么是JavaScript?

Js是一种具有面向对象能力的、解释型的程序设计语言。

2.JavaScript与ECMAScript的关系?

ECMAScript是js的规格,js是ECMAScript的一种实现。

3.变量的命名规则?

1.名字见名知义,遵循驼峰标识。例:userName passWord
2.变量名只能以字母,_,$开头
3.不能使用关键和保留字
4.变量名不要相同(后面的会覆盖前面)

4.window.onload的作用?

作用是:当文档和资源都加载完成后执行

5.js数据类型?

基本数据类型:Number、String、Boolean、Undefined、Null
复杂数据类型:Object、Array、Function…

6.null和undefined的区别?

Null访问一个不存在对象返回的值,表示空对象
Undefined:访问一个声明完没有赋值的变量返回的值,表示空变量

7.运算符的种类?

算术运算符:+ - * / % ++ –
赋值运算符:
比较运算符:
逻辑运算符:
三目运算符:

8.var a=10;var b=a++;a、b最后的结果?

b=10,a=11

9.==与===的区别?

===又叫全等,判断的时候先判断数据类型,在判断值
==只判断值是否相等

10.console.log(0.1+0.2==0.3)输出结果

false,有些小数在运算的过程中会出现偏差,因此最好不要用小数作为判断条件(精度丢失)

11.NaN会在什么情况下出现呢?列举出现这样情况的代码?

出现无法计算或者转换结果不是一个数值
1.Number(c)
2.‘a’/3

12.列举三种强制类型转换和2种隐私类型转换。

Number(“10”); 强转为Number
parseInt(“10.5”);强转为number,取整
parseFloat(“10.5”);强转为number,保留小数
String(10); 强转为字符串
10.toString(); 强转为字符串
“10”+20 ; 1020 +号遇到字符串变成连接符,20隐式转换为字符串
1+true; 2 true隐式转换为1
10==“10” “10”隐式转换为10

13.document.write()与innerHTML的区别?

document.write是直接将内容写入页面的内容流,会导致页面全部重绘,
innerHTML将内容写入某个DOM节点,不会导致页面全部重绘

14.break与continue的区别,举例说明并解释原因

break与continue都是在循环中,中止循环操作。Break是结束循环,后面的循环不再执行,continue是结束本次循环,执行下次循环

15.使用for循环打印由星号*组成的菱形?

 //打印上三角
        for (var i = 1; i <= 3; i++) {
            for (var k = 1; k <= 3 - i; k++) {
                document.write('&nbsp;');
            }
            for (var j = 1; j <= 2 * i - 1; j++) {
                document.write('*');
            }
            document.write('<br>');
        }
        //打印下三角
        for (var m = 1; m <= 3; m++) {
            for (var s = 0; s < m; s++) {
                document.write('&nbsp;');
            }
            for (var n = 1; n <= (-2 * m) + 5; n++) {
                document.write('*');
            }
            document.write('<br>');
        }

  
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

16.this对象的理解?

this存储任何地方,不同环境代表不同的含义,取决于调用时的环境。
A.事件处理函数中的this—触发事件的对象
document.onclick = function(){ alert(this) }
B.普通函数中的this—window
function sum(){ alert(this)} sum()

17.声明函数的方式有哪些?分别举例

函数声明(1),函数表达式(2~5),Function构造器(6)

function func1(a){}//函数声明
var func2=function(b){}//函数表达式
var func3=function func4(c){}//命名式函数表达式
var func5=(function(n1,n2){})();//立即执行的函数表达式
return function(){ };//作为返回值的函数表达式
var func6=new Function()//构造函数声明

  
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

18.使用函数计算50、100、150、200、1000以内所有奇数的和?

function sum(num) {
            //保存奇数的和
            var sum = 0;
            for (var i = 0; i < num; i++) {
                //判断是否为奇数
                if (i % 2 != 0) {
                    sum += i;
                }
            }
            console.log(sum);
        }
        sum(50);

  
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

19.写一个非行内样式的函数

 function getStyle(elem, attr) { //elem,attr
            if (elem.currentStyle) { //ie
                return elem.currentStyle[attr];
            } else { //标准
                return getComputedStyle(elem)[attr];
            }
        }

  
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

20.说说你对作用域链的理解

如果在当前作用域中没有查到值,就会向上级作用域去查,直到查到全局作用域,这么一个查找过程形成的链条就叫做作用域链。

21.请解释变量提升

浏览器解析js代码至少会经过两个过程,预解析和逐步执行
预解析:找东西var,function,如果找到var,会在内存中存储变量没有值,

function则会存储整个函数 逐步执行:逐行执行代码 console.log(a); //undefined 不会报错

找到var存储了变量a,但是没有赋值默认为 undefined var a = 10; //给内存中的a赋值10
console.log(a); //10

//2.function console.log(sum); //整个函数,找到函数会将整个函数都存储在内存中 sum();
//存储了整个函数,因此可以在前面调用 function sum() { console.log(10+20); }

22.函数声明和表达式声明的区别?

函数声明可以放在页面任意地方,而且都可以调用
表达式声明,需要在表达式声明后调用函数,如果在表达式的前面执行函数,会出现undefined,是因为var把函数名提升了,赋值却没有没提升,所以在赋值之前调用都是undefined

23.定时器的分类?他们的区别及用法是什么?

分为两类:setInterval和setTimeout
setInterval:重复执行或叫间歇执行,即隔一段时间就执行一次
setTimeout:延迟执行,延迟指定时间开始执行,只执行一次

24.生成4位随机验证码?

//四位数验证码
        function getRadom() {
            var n = '';
            while (n.length < 4) {
                var code = Math.floor(Math.random() * 74) + 48;
                if (code >= 48 && code <= 57 || code >= 65 && code <= 90 || code >= 97 && code <= 122) {
                    n += String.fromCharCode(code);
                }
            }
            return n;
        }

  
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

25.js有哪些内置对象?

Object Date String Array等等。。

26.把下面字符串去重,并去掉特殊字符,按照数字在前字母在后的顺序排序。
字符串如下:1231fdfsd&2424fdsaff&454545&454545444rfdsfs&687dsag

要求:数组去重,并去掉特殊字符,按照数字在前,字母在后的顺序排序
        var str = '1231fdfsd&2424fdsaff&454545&454545444rfdsfs&687dsag';
        var arr = str.match(/[0-9a-zA-Z]/g);
        var arr0 = [];
        for (var i in arr) {
            if (arr0.indexOf(arr[i]) == -1) {
                arr0.push(arr[i]);
            }
        }
        var res = arr0.join('');
        console.log(res);

  
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

27.截取字符串‘abcdefg’中的efg。

str.slice(3, 6);

28.有这样一个url:http://item.taobo.com/item.html?a=1&b=2&c=&d=xxx&e,请写
一段js程序提取url中各个get参数(参数名和参数个数不确定),将其key-value
形式返回到一个json结构中,如{a:“1”,b:“2”,c:“”,d:“xxx”,e:undefined}

var str = "http://item.taobo.com/item.html?a=1&b=2&c=&d=xxx&e";
        var s1 = str.split('?')[1]; //参数
        var arr = s1.split('&');
        var obj = {};
        for (var i in arr) {
            var key = arr[i].split('=')[0];
            var value = arr[i].split('=')[1];
            obj[key] = value;
        }
        console.log(obj);

  
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

29.判断一个字符串中出现次数最多的字符,并且统计次数

var str = "asddfssssaasswef";
        var obj = {};
        //遍历字符串,将出现的字符存入到数组中
        for (var i = 0; i < str.length; i++) {
            if (!obj[str.charAt(i)]) {
                obj[str.charAt(i)] = 1;
            } else {
                obj[str.charAt(i)]++;
            }
        }
        console.log(obj);
        var max = 0;
        var charmax;
        //遍历数组,找出出现最多的字母出现的次数
        for (var key in obj) {
            if (obj[key] > max) {
                max = obj[key];
                charmax = key;
            }
        }
        console.log("出现最多的字符是" + charmax + ",出现了" + max + "次");

  
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

30.DOM常用的API有哪些?

获取子节点
父节点.children
父节点.childNodes

获取父节点
子节点.parentNode
子节点.offsetParent

创建
document.createElement(‘标签名’)
document.createTextNode(‘文本内容’)

添加
父节点.appendChild(子节点)
父节点.insertBefore(newChild,refChild)

复制
被复制的节点.cloneNode(true)

删除:
节点.remove()
父节点.removeChild(子节点)

替换
父节点.replaceChild(newChild,refChild)

31.html和DOM有区别吗?

html是属性节点,
dom元素本质是对象,都有自己的内置属性(property) 叫做dom元素的属性

32.什么是window对象?什么是document对象?

window对象是一个顶级对象指浏览器打开的窗口。
document对象是Documentd对象(HTML文档对象)的一个只读引用,window对象的一个属性。

33.offsetWidth、clientWidth、scrollTop的区别?

offsetWidth----content+padding+border
clientWidth----content+padding
scrollTop-------被卷去的高

34.如何获取url地址中搜索内容?

使用location对象中的search可以获得?后面的字符串,以问号开头

35.IE与火狐的事件机制有什么区别?

IE是事件冒泡
Firefox同时支持两种事件模型,也就是:捕获型事件和冒泡型事件

36.如何阻止冒泡?兼容

e.stopPropagation?e.stopPropagation():e.cancelBubble = true;

37.事件绑定和普通事件有什么区别?

普通添加事件的方法不支持添加多个事件,最下面的事件会覆盖上面的,而事件绑定(addEventListener)方式添加事件可以添加多个。
addEventListener不兼容低版本IE addEventLisntener还支持事件冒泡+事件捕获

38.如何用原生js给元素绑定两个click事件?

oDiv.addEventListener(‘click’,fun1);
oDiv.addEventListener(‘click’,fun2);

39.解释一下事件流?

事件流:事件被触发之后会在DOM树的节点之间传递
三个阶段:事件捕捉,目标阶段,事件冒泡

  • 事件捕获阶段:当事件发生的时候,将事件从window依次往子元素传递
  • 确定目标阶段:确定事件目标
  • 事件冒泡阶段:事件目标开始处理事件,处理完以后会将事件依次传递给父元素,一直到window 事件都是在事件冒泡处理,ie只有冒泡

40.什么是事件委托?事件委托的原理是什么?他有哪些应用场景?

事件委托就是利用冒泡原理,将子元素所触发的事件,让他的父元素代替执行
一般应用于有新的子元素加入时,可以为后加入的元素添加事件

41.给1000个li添加点击事件。

事件委托,事件加给ul,需要this的地方用e.target代替

42.拖拽效果中有几种事件?

鼠标按下mousedown
鼠标按下过程中鼠标移动 mousemove
鼠标抬起 mouseup

43.什么是回调函数?

回调函数即callback,就是写一个函数,不需要自己去调用执行,让预写好的函数去调用。
自己直接调用的函数是直调,让系统调用的函数就是回调数。

44.数组方法pop() push() unshift() shift()的作用?

Push()在数值末尾添加
Unshift()在数值头部添加
Pop()删除末尾数据
Shift()删除开头数据

45.split() 与join()的区别?

Split()将字符串按照指定字符分割成一个数组
Join()将数组按照指定字符合并为一个字符串

46.编写至少两种数组去重的方法

//1.
//用来保存新数组
     var arr0 = [];
     for (var i in arr) {
         //如果新数组中没有出现就保存到新数组
         if (arr0.indexOf(arr[i]) == -1) {
             arr0.push(arr[i]);
         }
     }

//2.遍历数组进行比较
for (var i = 0; i < arr.length; i++) {
for (var j = i + 1; j < arr.length; j++) {
//如果发现相等,删除j
if (arr[i] == arr[j]) {
//删除j
arr.splice(j, 1);
//删除j后数组长度减少1,需要j–
//否则每删除一个,就会跳过后面的比较
j;
}
}
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

47.[‘1’, ‘2’, ‘3’].map(parseInt);

输出 [1, NaN, NaN]

48.冒泡算法排序?

// 冒泡法:相邻元素作比较,交换位置(小的在前面)
        var arr1 = [4, 3, 2, 1, 5, 6, 7, 9, 8, 0];
        //外层控制多少趟
        for (var i = 0; i < arr1.length; i++) {
            //内层控制每趟走多少次,每趟次数减少1(内层循环次数减少1)
            for (var j = 0; j < arr1.length - i; j++) {
                if (arr1[j] > arr1[j + 1]) {
                    var temp = arr1[j];
                    arr1[j] = arr1[j + 1];
                    arr1[j + 1] = temp;
                }
            }
        }
        console.log(arr1);
        //----------控制台输出------------
        //(10) [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

49.数组的随机排序?

方法一:javascript 
	 	var arr = [1,2,3,4,5,6,7,8,9,10]; 
	    function randSort1(arr){ 
	    	for(var i = 0,len = arr.length;i < len; i++ ){ 
	    		var rand = parseInt(Math.random()*len);
	    		var temp = arr[rand];
	    		arr[rand] = arr[i]; 
	    		arr[i] = temp; 
	    	} 
	    	return arr;    		
	    } 
	    console.log(randSort1(arr));
	方法二:
	 	var arr = [1,2,3,4,5,6,7,8,9,10];
        function randSort2(arr){
            var mixedArray = [];
            while(arr.length > 0){
                var randomIndex = parseInt(Math.random()*arr.length);
                mixedArray.push(arr[randomIndex]);
                arr.splice(randomIndex, 1);
            }
            return mixedArray;
        }
        console.log(randSort2(arr));
	方法三:推荐
		var arr = [1,2,3,4,5,6,7,8,9,10];
        arr.sort(function(){
            return Math.random() - 0.5;
        })
        console.log(arr);

 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

50.找出数组中的最大值,arr=[1,2,3,4,5];

Math.max.apply(Math, arr);	

 
 
  • 1
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Glider.js是一个高性能轻量级零依赖的轮播图组件,适用于移动端和桌面端。它具有以下特点: 1. 零依赖:不依赖任何第三方库,代码量小,易于维护。 2. 高性能:使用原生JavaScript实现,运行速度快,不会影响网页加载速度。 3. 支持响应式布局:自动适应不同的屏幕尺寸。 4. 支持无限循环:可以无限循环播放轮播图。 5. 支持滑动手势:支持手势切换轮播图。 使用Glider.js可以快速实现轮播图功能。下面是一个简单的示例: 首先,在HTML中引入Glider.js的CSS和JavaScript文件: ```html <link rel="stylesheet" href="glider.css"> <script src="glider.js"></script> ``` 然后,在HTML中创建一个包含轮播图的容器: ```html <div class="glider"> <div class="glider-track"> <div class="glider-slide">Slide 1</div> <div class="glider-slide">Slide 2</div> <div class="glider-slide">Slide 3</div> </div> </div> ``` 最后,在JavaScript中初始化Glider.js: ```javascript new Glider(document.querySelector('.glider'), { slidesToShow: 1, dots: '.dots', draggable: true, arrows: { prev: '.glider-prev', next: '.glider-next' } }); ``` 以上代码中,slidesToShow表示每次显示几张图片,dots表示是否显示小圆点,draggable表示是否支持手势滑动,arrows表示是否显示左右箭头。 通过上述简单的代码示例,你可以快速实现一个轮播图,并且Glider.js具有更多的配置项和API,可以满足各种不同的需求。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值