js 数组移除_2020前端面试--常见的js面试题
(答案持續(xù)更新...)
1.簡(jiǎn)述同步和異步的區(qū)別
js是一門單線程語(yǔ)言,所謂"單線程",就是指一次只能完成一件任務(wù)。如果有多個(gè)任務(wù),就必須排隊(duì),前面一個(gè)任務(wù)完成,再執(zhí)行后面一個(gè)任務(wù),以此類推。如果一個(gè)任務(wù)耗時(shí)過長(zhǎng),那么后面的任務(wù)就必須一直等待下去,會(huì)拖延整個(gè)程序,常見瀏覽器無(wú)反應(yīng),可能就是一段代碼死循環(huán),造成程序卡住在這個(gè)位置,無(wú)法繼續(xù)
為了解決這個(gè)問題,js的執(zhí)行模式分為兩種:同步和異步。
"同步模式"就是上一段的模式,后一個(gè)任務(wù)等待前一個(gè)任務(wù)結(jié)束,然后再執(zhí)行,程序的執(zhí)行順序與任務(wù)的排列順序是一致的、同步的;
"異步模式"則完全不同,每一個(gè)任務(wù)有一個(gè)或多個(gè)回調(diào)函數(shù)(callback),前一個(gè)任務(wù)結(jié)束后,不是執(zhí)行后一個(gè)任務(wù),而是執(zhí)行回調(diào)函數(shù),后一個(gè)任務(wù)則是不等前一個(gè)任務(wù)結(jié)束就執(zhí)行,所以程序的執(zhí)行順序與任務(wù)的排列順序是不一致的、異步的。
具體來(lái)說,異步運(yùn)行機(jī)制如下: (1)所有同步任務(wù)都在主線程上執(zhí)行,形成一個(gè)執(zhí)行棧(execution context stack)。 (2)主線程之外,還存在一個(gè)"任務(wù)隊(duì)列"(task queue)。只要異步任務(wù)有了運(yùn)行結(jié)果,就在"任務(wù)隊(duì)列"之中放置一個(gè)事件。 (3)一旦"執(zhí)行棧"中的所有同步任務(wù)執(zhí)行完畢,系統(tǒng)就會(huì)讀取"任務(wù)隊(duì)列",看看里面有哪些事件。那些對(duì)應(yīng)的異步任務(wù),于是結(jié)束等待狀態(tài),進(jìn)入執(zhí)行棧,開始執(zhí)行。 (4)主線程不斷重復(fù)上面的第三步2.怎么添加、移除、復(fù)制、創(chuàng)建、和查找節(jié)點(diǎn)
(1)創(chuàng)建新節(jié)點(diǎn)
createDocumentFragment() //創(chuàng)建一個(gè)DOM片段
createElement() //創(chuàng)建一個(gè)具體的元素
createTextNode() //創(chuàng)建一個(gè)文本節(jié)點(diǎn)
var para=document.createElement("p"); //創(chuàng)建新的 <p> 元素 var node=document.createTextNode("這是新段落。"); //創(chuàng)建了一個(gè)文本節(jié)點(diǎn) para.appendChild(node); //向 <p> 元素追加這個(gè)文本節(jié)點(diǎn) var element=document.getElementById("div1");//向一個(gè)已有的元素追加這個(gè)新元素 element.appendChild(para); //向這個(gè)已有的元素追加新元素(2)添加、移除、替換、之前插入、之后插入、復(fù)制
appendChild()、removeChild()、replaceChild()、insertBefore()、insertAfter()、cloneNode()
(3)查找
document.getElementsByTagName("") //通過標(biāo)簽名稱
document.getElementsByName("") //通過元素的Name屬性的值
document.getElementById("") //通過元素Id,唯一性
document.getElementsByClassName(""); //通過類查找
document.querySelector("")
3.實(shí)現(xiàn)一個(gè)函數(shù)clone 可以對(duì)Javascript中的五種主要數(shù)據(jù)類型(Number、string、Object、Array、Boolean)進(jìn)行復(fù)制
function clone(obj) {var o;switch (typeof obj) {case 'undefined':break;case 'string':o = obj + '';break;case 'number':o = obj - 0;break;case 'boolean':o = obj;break;case 'object': //object分為兩種,一種為Object,一種為Arrayif (obj === null) {o = null} else {if (Object.prototype.toString.call(obj).slice(8, -1) === 'Array') {o = [];for (var i = 0; i < obj.length; i++) {o.push(clone(obj[i]))}} else {o = {};for (var k in obj) {o[k] = clone(obj[k])}}}break;default:o = obj;break;}return o;}4.如何消除一個(gè)數(shù)組里面重復(fù)的元素
// 方法一:Array.prototype.clearRepeat = function () {var arr = []; //定義一個(gè)臨時(shí)數(shù)組for (var i = 0; i < this.length; i++) {//通過遍歷判斷當(dāng)前數(shù)組下標(biāo)為i的元素是否保存到臨時(shí)數(shù)組中//如果保存,則跳過,否則保存到臨時(shí)數(shù)組if (arr.indexOf(this[i]) == -1) {arr.push(this[i]);}}return arr;};var test = [1, 6, 8, 8, 9, 9, 9, "a", "a"];test.clearRepeat(); //結(jié)果為[1, 6, 8, 9, "a"]// 方法二:Array.prototype.clearRepeat = function () {var arr = [this[0]]; //直接定義結(jié)果數(shù)組for (var i = 1; i < this.length; i++) { //從第二項(xiàng)開始遍歷當(dāng)前數(shù)組//對(duì)元素進(jìn)行判斷://如果當(dāng)前數(shù)組元素在此數(shù)組中第一次出現(xiàn)的位置不是i//則第i項(xiàng)是重復(fù)的,否則直接存入結(jié)果數(shù)組if (this.indexOf(this[i]) == i) {arr.push(this[i]);}}return arr;};var test = [1, 6, 8, 8, 9, 9, 9, "a", "a"];test.clearRepeat(); //結(jié)果為[1, 6, 8, 9, "a"] // 上面兩種方法不推薦使用,因?yàn)閕ndexOf()這個(gè)函數(shù)在執(zhí)行的時(shí)候每次都會(huì)遍歷一次數(shù)組, //對(duì)性能影響比較大。比較適合小數(shù)據(jù)量的數(shù)組。//第三種使用的是hash表,把已經(jīng)出現(xiàn)過的元素通過下標(biāo)形式寫入一個(gè)Object中, //下標(biāo)的引用要比數(shù)組的indexOf()方法搜索節(jié)省時(shí)間Array.prototype.clearRepeat = function() {var h = {}; //定義一個(gè)hash表var arr = []; //定義一個(gè)臨時(shí)數(shù)組for (var i = 0; i < this.length; i++) {if (!h[this[i]]) {h[this[i]] = true;arr.push(this[i]);}}return arr;};var test = [1, 6, 8, 8, 9, 9, 9, "1", "a"];console.log(test.clearRepeat()) //結(jié)果為[1, 6, 8, 9, "a"] //此方法有缺陷,作為下標(biāo)在轉(zhuǎn)換后會(huì)變成字符串, //那么對(duì)于1和“1”這樣不同類型的值會(huì)對(duì)應(yīng)到同一個(gè)下標(biāo)而被去重。例如obj[1]和obj['1'],是相同的Array.prototype.clearRepeat = function() {var h = {}; //定義一個(gè)hash表var arr = []; //定義一個(gè)臨時(shí)數(shù)組for (var i = 0; i < this.length; i++) {var type = typeof this[i];if (!h[this[i] + type]) {h[this[i] + type] = true;arr.push(this[i]);}}return arr;};//不用hash表的解決辦法嗎,使用原始sort()排序后相鄰兩個(gè)數(shù)值進(jìn)行比較Array.prototype.clearRepeat = function() {this.sort(); //數(shù)組排序var arr = [this[0]]; //定義結(jié)果數(shù)組for (var i = 1; i < this.length; i++) { //從第二項(xiàng)開始遍歷當(dāng)前數(shù)組//判斷兩個(gè)相鄰元素是否相等,如果相等說明數(shù)據(jù)重復(fù),否則將元素寫入結(jié)果數(shù)組if (this[i] !== arr[arr.length - 1]) {arr.push(this[i])}}return arr}var test = [1, 6, 8, 8, 9, 9, 9, "1", "a"];5.寫一個(gè)返回閉包的函數(shù)
1.閉包函數(shù)是指有權(quán)訪問另一個(gè)函數(shù)作用域中的變量的函數(shù) 2.創(chuàng)建閉包函數(shù)最常見的方式是在一個(gè)函數(shù)內(nèi)創(chuàng)建另一個(gè)函數(shù),通過另一個(gè)函數(shù)訪問這個(gè)函數(shù)的局部變量 3.閉包的特點(diǎn):1函數(shù)嵌套函數(shù),2 函數(shù)內(nèi)部可以引用外部的參數(shù)和變量 3 參數(shù)和變量不會(huì)被垃圾回收機(jī)制回收4.閉包的優(yōu)點(diǎn):1 希望一個(gè)變量長(zhǎng)期駐扎在內(nèi)存中 * 2 避免全局變量的污染 * 3 私有變量存在5.閉包的實(shí)現(xiàn) 1:函數(shù)嵌套函數(shù) * 2 外層函數(shù)返回內(nèi)層函數(shù) * 3 外面有一全局變量接受外層函數(shù)6.缺點(diǎn): 閉包使用不當(dāng),會(huì)造成內(nèi)存污染,正常無(wú)法被垃圾回收機(jī)制清掉,IE低版本會(huì)造成內(nèi)存泄漏function fun1() {var num = 1;return function () {num++;return num;}}var s = fun1()// console.log(s());// // 自執(zhí)行函數(shù) 的閉包var fun3 = function () {var num = 1;return {b: 6,sum: function () {return num + this.b}}}();// console.log(fun3.sum());/** 把函數(shù)名當(dāng)參數(shù)調(diào)用* 回調(diào)函數(shù)** */function a() {console.log('a');}function b() {console.log('b');}function c(fun) {fun()}// c(a), c(b)// 循環(huán)var num = 0;function a(fun) {console.log(123);fun(fun)}function a2(fun) {num++;console.log(num);if (num > 10) return;fun(a2)}a(a2)6.使用遞歸完成1到100的累加
function add(num) {if (num == 1) {return num;} else {return num + add(num - 1)}}console.log(add(100));7.Javascript有哪幾種數(shù)據(jù)類型
1,基本類型:字符串類型(string),數(shù)字類型(number),布爾類型(boolean)
2,復(fù)雜類型:數(shù)組類型(array),對(duì)象類型(object),函數(shù)類型(function),正則類型(regexp)
3,空類型:undefine 和 null
8.如何判斷數(shù)據(jù)類型
1、typeof
typeof 123, //"number"typeof 'dsfsf', //"string"typeof false, //"boolean"typeof [1,2,3], //"object"typeof {a:1,b:2,c:3}, //"object"typeof function(){console.log('aaa');}, //"function"typeof undefined, //"undefined"typeof null, //"object"typeof new Date(), //"object"typeof /^[a-zA-Z]{5,20}$/, //"object"typeof new Error() //"object"Array,Object,null,Date,RegExp,Error這幾個(gè)類型都被typeof判斷為object,所以如果想要判斷這幾種類型,就不能使用typeof了。
Number,String,Boolean,Function,undefined,如果想判斷這幾種類型,那就可以使用typeof。
2、instanceof
123 instanceof Number, //false'dsfsf' instanceof String, //falsefalse instanceof Boolean, //false[1,2,3] instanceof Array, //true{a:1,b:2,c:3} instanceof Object, //truefunction(){console.log('aaa');} instanceof Function, //trueundefined instanceof Object, //falsenull instanceof Object, //falsenew Date() instanceof Date, //true/^[a-zA-Z]{5,20}$/ instanceof RegExp, //truenew Error() instanceof Error //trueinstanceof運(yùn)算符需要指定一個(gè)構(gòu)造函數(shù),或者說指定一個(gè)特定的類型,它用來(lái)判斷這個(gè)構(gòu)造函數(shù)的原型是否在給定對(duì)象的原型鏈上
Number,String,Boolean沒有檢測(cè)出他們的類型,但是如果使用下面的寫法則可以檢測(cè)出來(lái)
var num = new Number(123); var str = new String('dsfsf'); var boolean = new Boolean(false);還需要注意null和undefined都返回了false,這是因?yàn)樗鼈兊念愋途褪亲约罕旧?#xff0c;并不是Object創(chuàng)建出來(lái)它們,所以返回了false。
3、constructor
constructor是prototype對(duì)象上的屬性,指向構(gòu)造函數(shù)。根據(jù)實(shí)例對(duì)象尋找屬性的順序,若實(shí)例對(duì)象上沒有實(shí)例屬性或方法時(shí),就去原型鏈上尋找,因此,實(shí)例對(duì)象也是能使用constructor屬性的。
var num = 123; var str = 'abcdef'; var bool = true; var arr = [1, 2, 3, 4]; var json = {name:'wenzi', age:25}; var func = function(){ console.log('this is function'); } var und = undefined; var nul = null; var date = new Date(); var reg = /^[a-zA-Z]{5,20}$/; var error= new Error();function Person(){} var tom = new Person();// undefined和null沒有constructor屬性 console.log(tom.constructor==Person,num.constructor==Number,str.constructor==String,bool.constructor==Boolean,arr.constructor==Array,json.constructor==Object,func.constructor==Function,date.constructor==Date,reg.constructor==RegExp,error.constructor==Error ); //所有結(jié)果均為true除了undefined和null之外,其他類型都可以通過constructor屬性來(lái)判斷類型。
4、toString()
可以通過toString() 來(lái)獲取每個(gè)對(duì)象的類型。為了每個(gè)對(duì)象都能通過 Object.prototype.toString() 來(lái)檢測(cè),需要以 Function.prototype.call() 或者 Function.prototype.apply() 的形式來(lái)調(diào)用,傳遞要檢查的對(duì)象作為第一個(gè)參數(shù),稱為thisArg。
var toString = Object.prototype.toString;toString.call(123); //"[object Number]" toString.call('abcdef'); //"[object String]" toString.call(true); //"[object Boolean]" toString.call([1, 2, 3, 4]); //"[object Array]" toString.call({name:'wenzi', age:25}); //"[object Object]" toString.call(function(){ console.log('this is function'); }); //"[object Function]" toString.call(undefined); //"[object Undefined]" toString.call(null); //"[object Null]" toString.call(new Date()); //"[object Date]" toString.call(/^[a-zA-Z]{5,20}$/); //"[object RegExp]" toString.call(new Error()); //"[object Error]"總結(jié)以上的案例封裝個(gè)方法
function gettype(obj) {var type = typeof obj;if (type !== 'object') {return type;}//如果不是object類型的數(shù)據(jù),直接用typeof就能判斷出來(lái)//如果是object類型數(shù)據(jù),準(zhǔn)確判斷類型必須使用Object.prototype.toString.call(obj)的方式才能判斷return Object.prototype.toString.call(obj).replace(/^[object (S+)]$/, '$1'); }5、jQuery中判斷的方法
jQuery.isArray(object) jQuery.isFunction(value) jQuery.isNumeric(value) jQuery.isEmptyObject(obj) jQuery.isPlainObject(value)9.console.log(1+'2')和console.log(1-'2')的打印結(jié)果
‘12’和-1,第一個(gè)是因?yàn)槭亲址唇?#xff0c;第二種減法運(yùn)算將2強(qiáng)制轉(zhuǎn)化為數(shù)值類型進(jìn)行的運(yùn)算
10.Js的事件委托是什么,原理是什么
事件委托,通俗來(lái)說就是將元素的事件委托給它的父級(jí)或者更外級(jí)元素處理。
事件流包括三個(gè)階段:
- 事件捕獲:和冒泡類似,只不過事件的順序相反。即是從上級(jí)節(jié)點(diǎn)傳遞到下級(jí)節(jié)點(diǎn)
- 目標(biāo)階段
- 事件冒泡:當(dāng)下級(jí)節(jié)點(diǎn)觸發(fā)某個(gè)事件的時(shí)候,該事件會(huì)逐級(jí)向上觸發(fā)上級(jí)節(jié)點(diǎn)的同類事件
事件委托就是利用事件冒泡機(jī)制實(shí)現(xiàn)的
事件委托的優(yōu)點(diǎn):
- 只需要將同類元素的事件委托給父級(jí)或者更外級(jí)的元素,不需要給所有元素都綁定事件,減少內(nèi)存空間占用,提升性能
- 使用事件委托可以自動(dòng)綁定動(dòng)態(tài)添加的元素,即新增的節(jié)點(diǎn)不需要主動(dòng)添加也可以一樣具有和其他元素一樣的事件
11.如何改變函數(shù)內(nèi)部的this指針的指向
常用變量取代: var _this = this
call()的用法
var obj = {text: '我的兩個(gè)愛好:' }function getHobby(a, b) {console.log(this.text + a + '和' + b) }getHobby.call(obj, '足球', '羽毛球') // 我的兩個(gè)愛好:足球和羽毛球apply()的用法
var obj = {text: '我的兩個(gè)愛好:' }function getHobby(a, b) {console.log(this.text + a + '和' + b) }getHobby.apply(obj, ['足球', '羽毛球']) // 我的兩個(gè)愛好:足球和羽毛球bind()的用法
var obj = {text: '我的兩個(gè)愛好:' }function getHobby(a, b) {console.log(this.text + a + '和' + b) }getHobby.bind(obj, '足球', '羽毛球')() // 我的兩個(gè)愛好:足球和羽毛球對(duì)比
12.列舉幾種解決跨域問題的方式,且說明原理
1.什么是同源策略及其限制內(nèi)容?
同源策略是一種約定,它是瀏覽器最核心也最基本的安全功能,如果缺少了同源策略,瀏覽器很容易受到XSS、CSRF等攻擊。所謂同源是指"協(xié)議+域名+端口"三者相同,即便兩個(gè)不同的域名指向同一個(gè)ip地址,也非同源。
當(dāng)協(xié)議、子域名、主域名、端口號(hào)中任意一個(gè)不相同時(shí),都算作不同域。不同域之間相互請(qǐng)求資源,就算作“跨域”。常見跨域場(chǎng)景如下圖所示:
特別說明兩點(diǎn):
第一:如果是協(xié)議和端口造成的跨域問題“前臺(tái)”是無(wú)能為力的。
第二:在跨域問題上,僅僅是通過“URL的首部”來(lái)識(shí)別而不會(huì)根據(jù)域名對(duì)應(yīng)的IP地址是否相同來(lái)判斷。“URL的首部”可以理解為“協(xié)議, 域名和端口必須匹配”。
這里你或許有個(gè)疑問:請(qǐng)求跨域了,那么請(qǐng)求到底發(fā)出去沒有?
跨域并不是請(qǐng)求發(fā)不出去,請(qǐng)求能發(fā)出去,服務(wù)端能收到請(qǐng)求并正常返回結(jié)果,只是結(jié)果被瀏覽器攔截了。你可能會(huì)疑問明明通過表單的方式可以發(fā)起跨域請(qǐng)求,為什么 Ajax 就不會(huì)?因?yàn)闅w根結(jié)底,跨域是為了阻止用戶讀取到另一個(gè)域名下的內(nèi)容,Ajax 可以獲取響應(yīng),瀏覽器認(rèn)為這不安全,所以攔截了響應(yīng)。但是表單并不會(huì)獲取新的內(nèi)容,所以可以發(fā)起跨域請(qǐng)求。同時(shí)也說明了跨域并不能完全阻止 CSRF,因?yàn)檎?qǐng)求畢竟是發(fā)出去了。
2、跨域解決方案
1.jsonp
2.cors
3.postMessage
4.websocket
5. Node中間件代理(兩次跨域)
6.nginx反向代理
7.window.name + iframe
8.location.hash + iframe
9.document.domain + iframe
webpack解決跨域
// 后端沒設(shè)置跨域時(shí),可使用webpack進(jìn)行配置// devServer: {// // 代理// proxy: {// // 只要請(qǐng)求地址有'api'都會(huì)匹配上// "/api": {// target: "http://132.232.94.151:3005",// ws: true,// // 允許跨域// changeOrigin: true,// pathRewrite: {// "^/api": "" //通過pathRewrite重寫地址,將前綴/api轉(zhuǎn)為/// }// }// }// }13.談?wù)劺厥諜C(jī)制的方式及內(nèi)存管理
14.寫一個(gè)function ,清除字符串前后的空格
function trim(str) {if (str && typeof str === "string") {return str.replace(/(^s*)|(s*)$/g,""); //去除前后空白符} }15.js實(shí)現(xiàn)繼承的方法有哪些
16.判斷一個(gè)變量是否是數(shù)組,有哪些辦法
17.let ,const ,var 有什么區(qū)別
一)var聲明變量存在變量提升,let和const不存在變量提升
console.log(a); // undefined ===> a已聲明還沒賦值,默認(rèn)得到undefined值 var a = 100; console.log(b); // 報(bào)錯(cuò):b is not defined ===> 找不到b這個(gè)變量 let b = 10; console.log(c); // 報(bào)錯(cuò):c is not defined ===> 找不到c這個(gè)變量 const c = 10;二)let、const都是塊級(jí)局部變量
{let a = 1 } console.log(a) // undefinedconst 的特性和 let 完全一樣,不同的只是
1)聲明時(shí)候必須賦值
const a 控制臺(tái)報(bào)錯(cuò)2)只能進(jìn)行一次賦值,即聲明后不能再修改
const a=1 a=2 控制臺(tái)報(bào)錯(cuò)3)如果聲明的是復(fù)合類型數(shù)據(jù),可以修改其屬性
18.箭頭函數(shù)與普通函數(shù)有什么區(qū)別
那么箭頭函數(shù)有哪些特點(diǎn)?
- 更簡(jiǎn)潔的語(yǔ)法
- 沒有this
- 不能使用new 構(gòu)造函數(shù)
- 不綁定arguments,用rest參數(shù)...解決
- 使用call()和apply()調(diào)用
- 捕獲其所在上下文的 this 值,作為自己的 this 值
- 箭頭函數(shù)沒有原型屬性
- 不能簡(jiǎn)單返回對(duì)象字面量
- 箭頭函數(shù)不能當(dāng)做Generator函數(shù),不能使用yield關(guān)鍵字
- 箭頭函數(shù)不能換行
19.隨機(jī)取1-10之間的整數(shù)
<script> document.write(parseInt(10*Math.random())); //輸出0~10之間的隨機(jī)整數(shù) document.write(Math.floor(Math.random()*10+1)); //輸出1~10之間的隨機(jī)整數(shù) function RndNum(n){ var rnd=""; for(var i=0;i<n;i++) rnd+=Math.floor(Math.random()*10); return rnd; } document.write(RndNum(4)); //輸出指定位數(shù)的隨機(jī)數(shù)的隨機(jī)整數(shù)引用部分: 1. 從1開始 至 任意值parseInt(Math.random()*上限+1); 2. 從任意值開始 至 任意值parseInt(Math.random()*(上限-下限+1)+下限); function fRandomBy(under, over){ switch(arguments.length){ case 1: return parseInt(Math.random()*under+1); case 2: return parseInt(Math.random()*(over-under+1) + under); default: return 0; } } document.write(fRandomBy(1,100)); //輸出指定范圍內(nèi)的隨機(jī)數(shù)的隨機(jī)整數(shù)20.new操作符具體干了什么
21.Ajax原理
22.模塊化開發(fā)怎么做
23.異步加載Js的方式有哪些
24.xml和 json的區(qū)別
25.webpack如何實(shí)現(xiàn)打包的
26.常見web安全及防護(hù)原理
27.用過哪些設(shè)計(jì)模式
28.為什么要同源限制
29.offsetWidth/offsetHeight,clientWidth/clientHeight與scrollWidth/scrollHeight的區(qū)別
30.javascript有哪些方法定義對(duì)象
31.說說你對(duì)promise的了解
32.談?wù)勀銓?duì)AMD、CMD的理解
33.web開發(fā)中會(huì)話跟蹤的方法有哪些
34.介紹js有哪些內(nèi)置對(duì)象?
35.說幾條寫JavaScript的基本規(guī)范?
36.javascript創(chuàng)建對(duì)象的幾種方式?
37.eval是做什么的?
38.null,undefined 的區(qū)別?
39.[“1”, “2”, “3”].map(parseInt) 答案是多少?
40.javascript 代碼中的”use strict”;是什么意思 ? 使用它區(qū)別是什么?
41.js延遲加載的方式有哪些?
42.defer和async
43.說說嚴(yán)格模式的限制
44.attribute和property的區(qū)別是什么?
45.ECMAScript6 怎么寫class么,為什么會(huì)出現(xiàn)class這種東西?
46.常見兼容性問題
47.函數(shù)防抖節(jié)流的原理
48.原始類型有哪幾種?null是對(duì)象嗎?
49.為什么console.log(0.2+0.1==0.3) //false
50.說一下JS中類型轉(zhuǎn)換的規(guī)則?
51.深拷貝和淺拷貝的區(qū)別?如何實(shí)現(xiàn)
52.如何判斷this?箭頭函數(shù)的this是什么
53.== 和 ===的區(qū)別
54.什么是閉包
55.JavaScript原型,原型鏈 ? 有什么特點(diǎn)?
56.typeof()和instanceof()的用法區(qū)別
57.什么是變量提升
58.all、apply以及bind函數(shù)內(nèi)部實(shí)現(xiàn)是怎么樣的
59.為什么會(huì)出現(xiàn)setTimeout倒計(jì)時(shí)誤差?如何減少
60.談?wù)勀銓?duì)JS執(zhí)行上下文棧和作用域鏈的理解
61.new的原理是什么?通過new的方式創(chuàng)建對(duì)象和通過字面量創(chuàng)建有什么區(qū)別?
62.prototype 和 proto 區(qū)別是什么?
63.使用ES5實(shí)現(xiàn)一個(gè)繼承?
64.取數(shù)組的最大值(ES5、ES6)
65.ES6新的特性有哪些?
66.promise 有幾種狀態(tài), Promise 有什么優(yōu)缺點(diǎn) ?
67.Promise構(gòu)造函數(shù)是同步還是異步執(zhí)行,then呢 ?promise如何實(shí)現(xiàn)then處理 ?
68.Promise和setTimeout的區(qū)別 ?
69.如何實(shí)現(xiàn) Promise.all ?
70.如何實(shí)現(xiàn) Promise.finally ?
71.如何判斷img加載完成
72.如何阻止冒泡?
73.如何阻止默認(rèn)事件?
74.ajax請(qǐng)求時(shí),如何解釋json數(shù)據(jù)
75.json和jsonp的區(qū)別?
76.如何用原生js給一個(gè)按鈕綁定兩個(gè)onclick事件?
77.拖拽會(huì)用到哪些事件
78.document.write和innerHTML的區(qū)別
79.jQuery的事件委托方法bind 、live、delegate、on之間有什么區(qū)別?
80.瀏覽器是如何渲染頁(yè)面的?
81.$(document).ready()方法和window.onload有什么區(qū)別?
82.jquery中.get()提交和post()提交有區(qū)別嗎?
83.對(duì)前端路由的理解?前后端路由的區(qū)別?
84.手寫一個(gè)類的繼承
85.XMLHttpRequest:XMLHttpRequest.readyState;狀態(tài)碼的意思
總結(jié)
以上是生活随笔為你收集整理的js 数组移除_2020前端面试--常见的js面试题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: GMSSL学习总结
- 下一篇: 温习了一下java线程状态方面的知识总结