欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

js面试题及答案

程序员文章站 2022-06-09 18:58:36
...

介绍js的基本数据类型。

Undefined、Null、Boolean、Number、String、

ECMAScript 2015 新增:Symbol(创建后独一无二且不可变的数据类型 )

介绍js有哪些内置对象?

Object 是 JavaScript 中所有对象的父对象

数据封装类对象:Object、Array、Boolean、Number 和 String

其他对象:Function、Arguments、Math、Date、RegExp、Error

说几条写JavaScript的基本规范?

  • 1.不要在同一行声明多个变量。

  • 2.请使用 ===/!==来比较true/false或者数值

  • 3.使用对象字面量替代new Array这种形式

  • 4.不要使用全局函数。

  • 5.Switch语句必须带有default分支

  • 6.函数不应该有时候有返回值,有时候没有返回值。

  • 7.For循环必须使用大括号

  • 8.If语句必须使用大括号

  • 9.for-in循环中的变量 应该使用var关键字明确限定作用域,从而避免作用域污染。

JavaScript原型,原型链 ? 有什么特点?

每个对象都会在其内部初始化一个属性,就是prototype(原型),当我们访问一个对象的属性时,

如果这个对象内部不存在这个属性,那么他就会去prototype里找这个属性,这个prototype又会有自己的prototype,

于是就这样一直找下去,也就是我们平时所说的原型链的概念。

关系:instance.constructor.prototype = instance.proto

特点:

JavaScript对象是通过引用来传递的,我们创建的每个新对象实体中并没有一份属于自己的原型副本。当我们修改原型时,与之相关的对象也会继承这一改变。

当我们需要一个属性的时,Javascript引擎会先看当前对象中是否有这个属性, 如果没有的话,

就会查找他的Prototype对象是否有这个属性,如此递推下去,一直检索到 Object 内建对象。

function Func(){}

Func.prototype.name = "Sean";

Func.prototype.getInfo = function() {

  return this.name;

}

var person = new Func();//现在可以参考var person = Object.create(oldObject);

console.log(person.getInfo());//它拥有了Func的属性和方法

//"Sean"

console.log(Func.prototype);

// Func { name="Sean", getInfo=function()}

如何实现数组的随机排序?

方法一:

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);

Javascript作用链域?

全局函数无法查看局部函数的内部细节,但局部函数可以查看其上层的函数细节,直至全局细节。

当需要从局部函数查找某一属性或方法时,如果当前作用域没有找到,就会上溯到上层作用域查找,

直至全局函数,这种组织形式就是作用域链。

谈谈This对象的理解。

this总是指向函数的直接调用者(而非间接调用者);

如果有new关键字,this指向new出来的那个对象;

在事件中,this指向触发这个事件的对象,特殊的是,IE中的attachEvent中的this总是指向全局对象Window;

eval是做什么的?

它的功能是把对应的字符串解析成JS代码并运行;

应该避免使用eval,不安全,非常耗性能(2次,一次解析成js语句,一次执行)。

由JSON字符串转换为JSON对象的时候可以用eval,var obj =eval(’(’+ str +’)’);、

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

window对象是指浏览器打开的窗口。

document对象是Documentd对象(HTML 文档对象)的一个只读引用,window对象的一个属性。

null,undefined 的区别?

null 表示一个对象是“没有值”的值,也就是值为“空”;

undefined 表示一个变量声明了没有初始化(赋值);

undefined不是一个有效的JSON,而null是;

undefined的类型(typeof)是undefined;

null的类型(typeof)是object;

Javascript将未赋值的变量默认值设为undefined;

Javascript从来不会将变量设为null。它是用来让程序员表明某个用var声明的变量时没有值的。

typeof undefined

//"undefined"

undefined :是一个表示"无"的原始值或者说表示"缺少值",就是此处应该有一个值,但是还没有定义。当尝试读取时会返回 undefined;

例如变量被声明了,但没有赋值时,就等于undefined

typeof null

//"object"

null : 是一个对象(空对象, 没有任何属性和方法);

例如作为函数的参数,表示该函数的参数不是对象;

注意:

在验证null时,一定要使用 === ,因为 == 无法分别 null 和 undefined

null == undefined // true

null === undefined // false

写一个通用的事件侦听器函数。

// event(事件)工具集,来源:github.com/markyun

markyun.Event = {

	// 页面加载完成后

	readyEvent : function(fn) {

		if (fn==null) {

			fn=document;

		}

		var oldonload = window.onload;

		if (typeof window.onload != 'function') {

			window.onload = fn;

		} else {

			window.onload = function() {

				oldonload();

				fn();

			};

		}

	},

	// 视能力分别使用dom0||dom2||IE方式 来绑定事件

	// 参数: 操作的元素,事件名称 ,事件处理程序

	addEvent : function(element, type, handler) {

		if (element.addEventListener) {

			//事件类型、需要执行的函数、是否捕捉

			element.addEventListener(type, handler, false);

		} else if (element.attachEvent) {

			element.attachEvent('on' + type, function() {

				handler.call(element);

			});

		} else {

			element['on' + type] = handler;

		}

	},

	// 移除事件

	removeEvent : function(element, type, handler) {

		if (element.removeEventListener) {

			element.removeEventListener(type, handler, false);

		} else if (element.datachEvent) {

			element.detachEvent('on' + type, handler);

		} else {

			element['on' + type] = null;

		}

	},

	// 阻止事件 (主要是事件冒泡,因为IE不支持事件捕获)

	stopPropagation : function(ev) {

		if (ev.stopPropagation) {

			ev.stopPropagation();

		} else {

			ev.cancelBubble = true;

		}

	},

	// 取消事件的默认行为

	preventDefault : function(event) {

		if (event.preventDefault) {

			event.preventDefault();

		} else {

			event.returnValue = false;

		}

	},

	// 获取事件目标

	getTarget : function(event) {

		return event.target || event.srcElement;

	},

	// 获取event对象的引用,取到事件的所有信息,确保随时能使用event;

	getEvent : function(e) {

		var ev = e || window.event;

		if (!ev) {

			var c = this.getEvent.caller;

			while (c) {

				ev = c.arguments[0];

				if (ev && Event == ev.constructor) {

					break;

				}

				c = c.caller;

			}

		}

		return ev;

	}

};

Ajax 是什么? 如何创建一个Ajax?

ajax的全称:Asynchronous Javascript And XML。

异步传输+js+xml。

所谓异步,在这里简单地解释就是:向服务器发送请求的时候,我们不必等待结果,而是可以同时做其他的事情,等到有了结果它自己会根据设定进行后续操作,与此同时,页面是不会发生整页刷新的,提高了用户体验。

  • (1)创建XMLHttpRequest对象,也就是创建一个异步调用对象

  • (2)创建一个新的HTTP请求,并指定该HTTP请求的方法、URL及验证信息

  • (3)设置响应HTTP请求状态变化的函数

  • (4)发送HTTP请求

  • (5)获取异步调用返回的数据

  • (6)使用JavaScript和DOM实现局部刷新

Ajax 解决浏览器缓存问题?

1、在ajax发送请求前加上 anyAjaxObj.setRequestHeader(“If-Modified-Since”,“0”)。

2、在ajax发送请求前加上 anyAjaxObj.setRequestHeader(“Cache-Control”,“no-cache”)。

3、在URL后面加上一个随机数: “fresh=” + Math.random();。

4、在URL后面加上时间戳:“nowtime=” + new Date().getTime();。

5、如果是使用jQuery,直接这样就可以了 $.ajaxSetup({cache:false})。这样页面的所有ajax都会执行这条语句就是不需要保存缓存记录。

同步和异步的区别?

同步的概念应该是来自于OS中关于同步的概念:不同进程为协同完成某项工作而在先后次序上调整(通过阻塞,唤醒等方式).同步强调的是顺序性.谁先谁后.异步则不存在这种顺序性.

同步:浏览器访问服务器请求,用户看得到页面刷新,重新发请求,等请求完,页面刷新,新内容出现,用户看到新内容,进行下一步操作。

异步:浏览器访问服务器请求,用户正常操作,浏览器后端进行请求。等请求完,页面不刷新,新内容也会出现,用户看到新内容。

如何解决跨域问题?

jsonp、 iframe、window.name、window.postMessage、服务器上设置代理页面

页面编码和被请求的资源编码如果不一致如何处理?

documen.write和 innerHTML的区别

document.write只能重绘整个页面

innerHTML可以重绘页面的一部分

DOM操作——怎样添加、移除、移动、复制、创建和查找节点?

(1)创建新节点

createDocumentFragment()    //创建一个DOM片段

createElement()   //创建一个具体的元素

createTextNode()   //创建一个文本节点

(2)添加、移除、替换、插入

appendChild()

removeChild()

replaceChild()

insertBefore() //在已有的子节点前插入一个新的子节点

(3)查找

getElementsByTagName()    //通过标签名称

getElementsByName()    //通过元素的Name属性的值(IE容错能力较强,会得到一个数组,其中包括id等于name值的)

getElementById()    //通过元素Id,唯一性

.call() 和 .apply() 的区别?

例子中用 add 来替换 sub,add.call(sub,3,1) == add(3,1) ,所以运行结果为:alert(4);

注意:js 中的函数其实是对象,函数名是对 Function 对象的引用。

function add(a,b)

{

    alert(a+b);

}



function sub(a,b)

{

    alert(a-b);

}



add.call(sub,3,1);

Jquery与jQuery UI 有啥区别?

*jQuery是一个js库,主要提供的功能是选择器,属性修改和事件绑定等等。

*jQuery UI则是在jQuery的基础上,利用jQuery的扩展性,设计的插件。

提供了一些常用的界面元素,诸如对话框、拖动行为、改变大小行为等等

jquery 中如何将数组转化为json字符串,然后再转化回来?

jQuery中没有提供这个功能,所以你需要先编写两个jQuery的扩展:

$.fn.stringifyArray = function(array) {

    return JSON.stringify(array)

}



$.fn.parseArray = function(array) {

    return JSON.parse(array)

}



然后调用:

$("").stringifyArray(array)

哪些操作会造成内存泄漏?

内存泄漏指任何对象在您不再拥有或需要它之后仍然存在。

垃圾回收器定期扫描对象,并计算引用了每个对象的其他对象的数量。如果一个对象的引用数量为 0(没有其他对象引用过该对象),或对该对象的惟一引用是循环的,那么该对象的内存即可回收。

setTimeout 的第一个参数使用字符串而非函数的话,会引发内存泄漏。

闭包、控制台日志、循环(在两个对象彼此引用且彼此保留时,就会产生一个循环)

JQuery一个对象可以同时绑定多个事件,这是如何实现的?

  • 多个事件同一个函数:

    $(“div”).on(“click mouseover”, function(){});

  • 多个事件不同函数

$("div").on({

	click: function(){},

	mouseover: function(){}

});

Webpack热更新实现原理?

  1. Webpack编译期,为需要热更新的 entry 注入热更新代码(EventSource通信)

  2. 页面首次打开后,服务端与客户端通过 EventSource 建立通信渠道,把下一次的 hash 返回前端

  3. 客户端获取到hash,这个hash将作为下一次请求服务端 hot-update.js 和 hot-update.json的hash

  4. 修改页面代码后,Webpack 监听到文件修改后,开始编译,编译完成后,发送 build 消息给客户端

  5. 客户端获取到hash,成功后客户端构造hot-update.js script链接,然后插入主文档

  6. hot-update.js 插入成功后,执行hotAPI 的 createRecord 和 reload方法,获取到 Vue 组件的 render方法,重新 render 组件, 继而实现 UI 无刷新更新。

Object.is() 与原来的比较操作符“ ===”、“ ==”的区别?

两等号判等,会在比较时进行类型转换;

三等号判等(判断严格),比较时不进行隐式类型转换,(类型不同则会返回false);

Object.is 在三等号判等的基础上特别处理了 NaN 、-0 和 +0 ,保证 -0 和 +0 不再相同,

但 Object.is(NaN, NaN) 会返回 true.

Object.is 应被认为有其特殊的用途,而不能用它认为它比其它的相等对比更宽松或严格。