JS面试题 左手的ㄟ右手 2022-09-10 08:18 161阅读 0赞 > JS初级开始 > 1.基本数据类型有几种?(高频) String,Boolean,Number,Null,undefiend,Symbol(es6) Symbol:定义对象的唯一标识(可以理解为id) let a = ''; // 字符串String let a = true; // Boolean类型 let a = 1; // 数字Number let a = null; // 空 let a = undefined; let name = Symbol(); console.log(typeof name); // Symbol 基本类型的内存占据空间小,大小固定,他们的值保存在栈空间,按值来访问 [https://developer.mozilla.org/zh-CN/docs/Glossary/Primitive][https_developer.mozilla.org_zh-CN_docs_Glossary_Primitive] > 2.引用数据类型有哪几种?(高频)也叫对象数据类型 Object,Array,function 引用类型占据空间大,大小不固定,栈内存中存放地址指向堆内存中的对象。是按引用访问的 内建对象:[https://www.cnblogs.com/yxbje/p/7395614.html][https_www.cnblogs.com_yxbje_p_7395614.html] > 3.了解过基本数据类型和引用数据类型后,我们了解一下什么叫堆(stack)栈(heap) * 栈(stack):自动分配内存空间,由系统自动释放(也就是定义一个变量,使用完系统自动处理) * 堆(heap):动态分配内存,大小不一定自动释放 如图: ![watermark_type_ZHJvaWRzYW5zZmFsbGJhY2s_shadow_50_text_Q1NETiBAcXFfNDAwNTUyMDA_size_14_color_FFFFFF_t_70_g_se_x_16][] 当我们看到一个变量类型是已知的,就分配在栈里面,比如INT,Double等。其他未知的类型,比如自定义的类型,因为系统不知道需要多大,所以程序自己申请,这样就分配在堆里面。 堆内存和栈内存: 为使程序运行时占的内存小,通长使用垃圾回收机制 当一个方法执行时,每个方法都会建立自己的内存栈,在这个方法内定义的变量将会逐个放入这块栈存里,随着方法的执行结束,这个方法的栈存也将自然销毁了。因此,所有在方法中定义的变量都是放在栈内存中的; 当我们在程序中创建一个对象时,这个对象将被保存到运行时数据区中,以便反复利用(因为对象的创建成本开销较大),这个运行时数据区就是堆内存。堆内存中的对象不会随方法的结束而销毁,即使方法结束后,这个对象还可能被另一个引用变量所引用(方法的参数传递时很常见),则这个对象依然不会被销毁,只有当一个对象没有任何引用变量引用它时,系统的垃圾回收机制才会在核实的时候回收它。 思考: demo1 var a = 1; var b = a; b = 2; // 这时a是? demo1中在变量对象中的数据发生复制行为时,系统会自动为新的变量分配一个新值。var b = a执行之后,b虽然重新赋值为2,但是他们其实已经是相互独立互不影响的值了。 (可以理解为2个变量,a给b赋值之后,与a不相关了,存放的是栈内存中) demo2 var m = { a: 1, b: 2 } var n = m; n.a = 2; // 这时m.a的值呢? demo2中我们通过var n = m执行一次复制引用类型的操作。引用类型的复制同样也会为新的变量自动分配一个新的值保存在变量对象中,但不同的是,这个新的值,仅仅只是引用类型的一个地址指针。当地址指针相同时,尽管他们相互独立,但是在变量对象中访问到的具体对象实际上是同一个。因此当我改变n时,m也发生了变化。这就是引用类型的特性。 (可以理解为在堆内存中开辟出的地址,但是这两个变量是在栈内存中,指针指向的是堆内存的同一个地址) [https://www.cnblogs.com/jing-tian/p/11100105.html][https_www.cnblogs.com_jing-tian_p_11100105.html] [https://www.cnblogs.com/lhh520/p/10176982.html][https_www.cnblogs.com_lhh520_p_10176982.html] [https://blog.csdn.net/weixin\_38383877/article/details/81811621][https_blog.csdn.net_weixin_38383877_article_details_81811621] > 3.typeof返回值类型共有7种。(高频) undefined,string,number,boolean,symbol(ES6),object,function 1.number typeof(10); typeof(NaN); //NaN在JavaScript中代表的是特殊非数字值,它本身是一个数字类型。 typeof(Infinity); 2.boolean typeof(true); typeof(false); 3.string typeof("abc"); 4.undefined typeof(undefined); typeof(a);//不存在的变量 5.object 对象,数组,null返回object typeof(null); typeof(window); 6、function typeof(Array); typeof(Date); 7、symbol typeof Symbol() // ES6提供的新的类型 [https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/typeof][https_developer.mozilla.org_zh-CN_docs_Web_JavaScript_Reference_Operators_typeof] > 4.强制类型转换。(高频) [https://www.jianshu.com/p/d37cdc717f72][https_www.jianshu.com_p_d37cdc717f72] 原始数据类型[(Number,string,boolean,null,undefined)][Number_string_boolean_null_undefined] 转成字符串类型: * toString(); * 字符串拼接 toString() var a=1; console.log(a.toString());//输出结果为黑色的1 拼接字符串 var a=1; var b=a+''; console.log(b);//输出结果为黑色的1 转成数字类型 * Number() * parseInt * parseFloat 使用Number var a="123"; a=Number(a); console.log(typeof a); 结果:number 如果 var a="abc"; a=Number(a); console.log(a); 结果:NaN 如果是纯数字字符串,则直接转为数字;如果字符串中有其他内容,则转换为NaN;如果字符串是一个空串或者全是空格的字符串,则转换为0。 Number(true)="1" Number(Null)=0 Number(undefined)="NaN" parseInt() parseFloat() 专门用来对付字符串 var a = "123px"; a=parseInt(a); console.log(typeof a); 结果:number console.log(a); 结果:123 var b=true; b=parseInt(b); console.log(typeof b); 结果:number console.log(b); 结果:NaN 如果对非string使用parseInt()或parseFloat()它会先将其转换为string,然后再操作。 转成boolean直接就用boolean; 除了0、NaN、空串、null、undefined其余都是true。对象也会转换为true 使用Boolean()函数 var a= 123; a=Boolean(a); console.log(typeof a); 结果:boolean console.log(a); 结果:true > 5.隐式类型转换(高频) js中的数据类型是非常弱的,在使用算数运算符时,运算符两边的数据类型可以是任意的,比如,一个字符串可以和一个数字相加。之所以不同的数据类型之间可以做运算,是因为js引擎在运算之前会悄悄地把他们进行了隐式类型转换。 console.log([] == []) // false console.log([] == ![]) // true console.log([] !== []) // true console.log(NaN != NaN) // true console.log(null == undefined) // true console.log(null === undefined) // false console.log(1 == true) // true console.log(null > 0) // false console.log(true + 1) // 2 console.log(undefined + 1) // NaN console.log({} + 1) // [object Object]1 console.log([] + {}) // [object Object] console.log([2,3] + [1,2]) // 2,31,2 == === 扩展:通过==比较两边的值是否相等的结果? 1==’1’ null==undefined > **6.“=="和“===”区别(高频)** 前者会自动转换类型,在判断是否相等 后者不会自动转换类型,直接去比较 1==”1” null==undefined;//==true > 7.逻辑与或非 * ||:只要其中一个true ,整体都为true * &&:只要其中一个false,整体都为false * !:取反 > 8.null和undefiend是否相等?null和undefiend区别是什么? console.log(null==undefined)//true console.log(null===undefined)//false null: 没有定义的时候是null,报错not found null表示“无”,转成数值时为0 undefined: 只是初始化,创建变量,但是没有赋值 undefined是一个表示"无"的原始值,转为数值时为NaN > 9.JS四种检测 1.typeof:只能检测基本数据类型 typeof 1;//'number' typeof true;//'boolean' typeof '';//'string' typeof undefined;//'undefined' typeof function (){};'function' typeof null // Object 2.instanceOf:检测当前实例是否属于某个类 var arr = []; arr instanceof Array;//true 3.constructor:检测属性是否存在于构造函数的原型上,用\_proto\_在原型上 let arr = []; arr.constructor === Array; true 4.Object.prototype.toString.call(\[\]):最准确的方式,用来检测数据类型 console.log(Object.prototype.toString.call(1);//[object Number] console.log(Object.prototype.toString.call('');// [object String] console.log(Object.prototype.toString.call(true);// [object Boolean) console.log(Object.prototype.toString.call(null);// [object Null] console.log(Object.prototype.toString.call(undefined));//[object Undefined] console.log(Object.prototype.toString.call([]));// [object Array] > 10.看下面代码,说出原因 var a = null; console.log(typeof a); // Object 原理是这样的,不同的对象在底层都表示为二进制,在 JavaScript 中二进制前三位都为 0 的话会被判断为 object 类型, null 的二进制表示是全 0,自然前三位也是 0,所以执行 typeof 时会返回“ object ”。 > **11.看下列代码,输出什么?解释原因。** 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 > 12.判断null,undefiend,空字符串 * if(null == undefined) \{\} // 返回true * if(null == '') // 返回false * if(undefined == '')\{\} // 返回false 控制台 * ''为字符串 * typeof null 为对象 * typeof ''为string > **13.undefiend和null字符在if语句找那个,都会自动变成false =============>让他们变成true,前面要加!(取反)** if(!null) == if(!undefined) == true > **14.Array,Object放在if语句中自动转成true(高频)** > 15.break,continue,return区别 * break立即结束语句,并跳出语句 * continue:停止当前语句,并立即执行 * return:停止函数 // break for(let i = 0; i <= 10; i++){ if(i == 6){ break; } console.log(i); //12345 } // continue for(let i = 0; i <= 10; i++){ if(i == 6){ continue; } console.log(i); // 123456789 } // return for(let i = 0; i <= 10;i++){ if(i == 6){ return; // 结束整个方法 } } > 16.for ... in和for... of的区别 * for ... in用于遍历数组或者对象属性; * for...of用于遍历循环数组 for(变量 in 对象)\{在此执行代码\} var arr = new Array(); arr[0] = 'a'; arr[1] = 'b'; arr[2] = 'c'; for(var i in arr){ console.log(arr[i]); // a,b,c } var mycars = {"1":"Saab", "2":"Volvo", "3":"BMW"}; mycars.color = "white" for (var x in mycars) { console.log(mycars[x]); //Saab Volvo BMW white } for of 遍历循环数组 [https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Statements/for...of][https_developer.mozilla.org_zh-CN_docs_Web_JavaScript_Reference_Statements_for...of] > 17.map,forEach区别 相同点: * 循环遍历数组中每一项 * 每次执行匿名函数都支持3个参数,item(数组中每一项),index(数组中的索引),arr(原数组) * 只能遍历数组 * 匿名函数this都指向window 不同点:map有返回值,不会改变原数组;forEach没有返回值,对原数组数组直接进行更改 var array1 = [1,4,9,16]; const map1 = array1.map(x => x *2); console.log(map1); var arr = [1,2,3] let arr1 = arr.forEach(x => x*2); console.log(arr1); // 2,4,6 map方法返回一个新的数组,数组中的元素为原始数组调用函数处理后的值(map()进行处理之后返回一个新的数组) map方法不会改变原始数组 var arr = [0,2,4,6,8]; var str = arr.map(function(item,index,arr){ console.log(this); // window console.log(item); // 每一项 console.log('原数组arr:',arr); return item/2; }) console.log(str); //[0,1,2,3,4] forEach方法用于调用数组中每个元素,将元素传给回调函数 注意:forEach是不会返回有意义的值的 我们在回调函数中直接修改arr的值。 arr.forEach((value, key) => { return arr[key] = value * value; }); > 18.while,do...while,for in,for of while先判断后执行 let i = 0; while(i < 100){ console.log('i为'+i) } do...while先执行在判断 let x = 3; let i = 1; do{ console.log(i); i++; }while(i < x); * for循环 * for...in ---->用于对象遍 var person = {name: "张”} for(var key in person){ if(person.hasownproperty){ console.log(key); } } > 19.Number方法 Number:将其他数据类型的值强制转换成数字类型 parseInt:解析一个字符串并返回整数。 parseInt("10"); //返回 10 parseInt("19",10); //返回 19 (10+9) ?? parseInt("11",2); //返回 3 (2+1) ?? parseInt("17",8); //返回 15 (8+7)?? parseInt("1f",16); //返回 31 (16+15)?? parseInt("010"); //未定:返回 10 或 8?? isNaN:检测数字是否非法 // console.log(isNaN(123)) // false parseFloat:和parseInt一样,区别是返回一个浮点数。 <script type="text/javascript"> document.write(parseFloat("10")) document.write(parseFloat("10.00")) document.write(parseFloat("10.33")) document.write(parseFloat("34 45 66")) document.write(parseFloat(" 60 ")) document.write(parseFloat("40 years")) document.write(parseFloat("He was 40")) </script> 10 10 10.33 34 60 40 NaN toFixed:保留小数点位数的方法;返回值是一个字符串; > 20.字符串的方法 toUpperCase:小写字母转大写字母 toLowerCase:大写字母转小写字母 charAt:通过索引获取字符 var str = "HELLO WORLD"; var n = str.charAt(2) console.log(n); // L chatCodeAt:通过索引获取对应字符的Unicode编码; var str = "HELLO WORLD"; var n = str.charCodeAt(0); console.log(n) // 72 subStr:截取 substr(m,n) 从索引m开始,截取n个字符; slice(m,n):从索引m开始,截取到索引n,不包含n(支持负数); indedxOf:检索字符在字符串中第一次出现的索引位置 var str="Hello world!" document.write(str.indexOf("Hello") + "<br />") document.write(str.indexOf("World") + "<br />") document.write(str.indexOf("world")) 0 -1 6 lastIndexOf:检测字符在字符串中最后一次出现的索引位置; replace:替换;原有字符串不变,用新字符替换旧字符; concat:拼接 > 21.字符串运算 `- * /`: 会先把字符串转换成数字,然后再进行计算 * 任何数字和NaN计算,都是NaN * 任何数字和undefiend运算,都是NaN > **22.split() join() 的区别(高频)** split():把一个字符串分割成字符串数组,并返回 “hello".split("") // ["h", "e", "l", "l", "o"] join():把数组中的所有元素放入一个字符串。元素是通过指定的分隔符进行分隔的,并返回 在本例中,我们将创建一个数组,然后把它的所有元素放入一个字符串: <script type="text/javascript"> var arr = new Array(3) arr[0] = "George" arr[1] = "John" arr[2] = "Thomas" console.log(arr.join()) </script> 输出: George,John,Thomas > 23.JS精度误差 1.toFixed方法:使用不同函数分别计算(+,-,\*,/) var a = 1; var b = 2.344544; consoel.log((a+b).toFixed(2)) 2.小数点\[(变量 \* 10) / 10\]) 先乘10再除以10 ![watermark_type_ZHJvaWRzYW5zZmFsbGJhY2s_shadow_50_text_Q1NETiBAcXFfNDAwNTUyMDA_size_20_color_FFFFFF_t_70_g_se_x_16][] let percentFloat = arrNew.reduce((total, current) => total + Number.parseFloat(current.percentage), 0); let percent = Number(percentFloat.toFixed(2)); console.log('percent', percent); if (percent != 100) { self.msgError('请新增采购标的类别百分总和为100%'); loading.close(); return false; } > 24.获取元素的方法 document.getElementById:通过id获取元素 document.getElementByTagNam:通过标签名获取元素 <script type="text/javascript"> var str="Hello world!" document.write(str.lastIndexOf("Hello") + "<br />") document.write(str.lastIndexOf("World") + "<br />") document.write(str.lastIndexOf("world")) </script> 0 -1 6 document.getElementByClassName():类数组集合 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>菜鸟教程(runoob.com)</title> <style> .example { border: 1px solid black; margin: 5px; } </style> </head> <body> <div class="example"> 样式 class="example" 的 Div 元素 </div> <div class="example"> 另外一个样式 class="example" 的 Div 元素 </div> <p class="example">样式为 class="example" 的 p 元素。</p> <p>这是一个插入在 p 元素中样式 class="example" 的<span class="example">span</span> 元素 。</p> <p>点击按钮修改所有样式 class="example" 的背景颜色。</p> <button class="example" onclick="myFunction()">点我</button> <p><strong>注意:</strong> Internet Explorer 8 及更早 IE 版本不支持 getElementsByClassName() 方法。</p> <script> function myFunction() { var x = document.getElementsByClassName("example"); var i; for (i = 0; i < x.length; i++) { x[i].style.backgroundColor = "red"; } } </script> </body> </html> `document.getElementsByName`;通过name属性来获取元素; document.documentElement获取当前html body:获取页面body元素 document.querySelector:如果id前加\#,如果class前加. document.querySelectorAll()获取所有相同节点的元素 > 25.DOM操作--添加,删除,插入,复制,查找,创建节点 创建新节点: * createElement():创建一个具体的元素 * createTextNode():创建一个文本节点 [https://www.runoob.com/try/try.php?filename=try\_dom\_createelement][https_www.runoob.com_try_try.php_filename_try_dom_createelement] 添加,插入,替换,移除 * appendChild() * insertBefore():// 在已有的子节点前插入一个新的子节点 * replaceChild() * removeChild() 查找 * getElementsByTagName() // 通过标签名称 * getElementsByName() // 通过元素的Name属性的值(IE容错能力较强,会得到一个数组,其中包括id等于name值的) * getElementById() // 通过元素Id,唯一性 > 26.DOM节点属性 <table style="width:500px;"> <tbody> <tr> <td>Type</td> <td>nodeType</td> <td>nodeName</td> <td>nodeValue</td> </tr> <tr> <td>元素节点</td> <td>1</td> <td>大写的标签名</td> <td>null</td> </tr> <tr> <td>文本节点</td> <td>3</td> <td>text</td> <td>文本内容</td> </tr> <tr> <td>注释节点</td> <td>8</td> <td>comment</td> <td>注释内容</td> </tr> <tr> <td>ocument</td> <td>9</td> <td>document</td> <td>null</td> </tr> </tbody> </table> 空格和换行都是文本节点 > 27.DOM节点属性 * childNodes:获取当前元素所有子节点 * children:获取当前元素的子元素节点 * firstChild:获取第一个子节点 * lastChild:获取最后一个子节点 * previousSibling:获取上一个哥哥的节点 * nextSibling:获取下一个弟弟的节点 * parentNode:获取当前元素的父节点 > 28.已知ID的Input输入框,希望获取这个输入框的值,怎么做?(不使用第三方框架) document.getElementById("ID").value; > 29.怎么检测数组? * isArray * instanceof 注意:typeof检测是自己本数据类型 > 30.改变数组长度的方法有哪些? push,pop,unshift,shift > 31.数组的高频方法 length()获取数组长度 push:尾部添加,返回数组长度(向数组末尾新增一项;可以传多个) var arr = ["Lily","lucy","Tom"]; var count = arr.push("Jack","Sean"); console.log(count); // 5 console.log(arr); // ["Lily", "lucy", "Tom", "Jack", "Sean"] pop():尾部删除,返回被删除的数组(删除数组最后一项,不需要传参数) var item = arr.pop(); console.log(item); // Sean console.log(arr); // ["Lily", "lucy", "Tom", "Jack"] unshift头部添加,返回数组长度 var arr = ["Lily","lucy","Tom"]; var count = arr.unshift("Jack","Sean"); console.log(count); // 5 console.log(arr); //["Jack", "Sean", "Lily", "lucy", "Tom"] shift头部删除,返回被删除的元素 var item = arr.shift(); console.log(item); // Jack console.log(arr); // ["Sean", "Lily", "lucy", "Tom"] reverse():反转数组项的顺序 var arr = [13, 24, 51, 3]; console.log(arr.reverse()); //[3, 51, 24, 13] console.log(arr); //[3, 51, 24, 13](原数组改变) concat():数组的拼接。构建一个新数组,原数组并没有改变 var arr = [1,3,5,7]; var arrCopy = arr.concat(9,[11,12]); console.log(arrCopy) //[1,3,5,6,9,1,,12] console.log(arr); // [1,3,5,7] slice(m,n):数组截取,从数组索引m开始,截取到索引n,但是不包括n\[前包后不包\],原数组不发生改变 slice(m) : 从索引m开始,截取到末尾; slice()方法可以接受一或两个参数 var arr = [1,3,5,7,9,11]; var arrCopy = arr.slice(1); var arrCopy2 = arr.slice(1,4); var arrCopy3 = arr.slice(1,-2); var arrCopy4 = arr.slice(-4,-1); console.log(arr); //[1, 3, 5, 7, 9, 11](原数组没变) console.log(arrCopy); //[3, 5, 7, 9, 11] console.log(arrCopy2); //[3, 5, 7] console.log(arrCopy3); //[3, 5, 7] console.log(arrCopy4); //[5, 7, 9] indexOf()接收两个参数:要查找的项和表示查找起点的位置的索引。其中,从数组的开头开始向后查找 lastIndexOf:接收两个参数。要查找的项和(可选的)表示查找起点位置的索引。其中, 从数组的末尾开始向前查找。 这两个方法返回要查找的项在数组中的位置,或者在没找到的情况下返回-1。在比较第一个参数与数组中的每一项时,会使用全等操作符。 var arr = [1,3,5,7,7,5,3,1]; console.log(arr.indexOf(5)); //2 console.log(arr.lastIndexOf(5)); //5 console.log(arr.indexOf(5,2)); //2 ??? console.log(arr.lastIndexOf(5,4)); //2 ??? console.log(arr.indexOf("5")); //-1 forEach对数组进行循环,对数组中每一项运行给定函数。这个方法没返回值。参数都是function类型,默认有传参,参数分别为:遍历的数组内容,索引值,数组本身 var arr = [1, 2, 3, 4, 5]; arr.forEach(function(x, index, a){ console.log(x + '|' + index + '|' + (a === arr)); }); // 输出为: // 1|0|true // 2|1|true // 3|2|true // 4|3|true // 5|4|true map指映射,对数组中每一项运行给定函数,返回每次函数调用的结果组成的数组。(有返回值) var arr = [1,2,3,4] var arr2 = arr.map(function(item){return item * item}); console.log(arr2); // 1,2,9,16 splice(m,n):删除数组中的某几项,从索引开始,删除n个 splice(m):从索引m开始删除到末尾 splice(0): splice(m,x,n):删除数组中某几项,从索引开始,删除n个。 原数组发生该改变 sort():升序排列数组项--即最小的值在最前面,最大的值在最后面 var arr1 = ["a","d","c","b"] console.log(arr1.sort()); // ["a","b","c","d"] every:判断数组中每一项是否都满足条件,只有所有项都满足条件,才会返回true var arr = [1,2,3,4] var arr2 = arr.every(function(x){ return x < 10; }) console.log(arr2); // true var arr3 = arr.every(function(x){ return x < 3; }) console.log(arr3) // false some()数组中只要有一项满足条件,就返回true var arr = [1,2,3,4] var arr2 = arr.some(function(x){ return x }) console.log(arr2); // true > 32.对象的方法 concat():字符串拼接 slice():对字符串进行分割 split():把字符串分割成数组: var str = 'hello' let arr = str.split(','); console.log(\['h','e','l','l','o'\]) toUpperCase:把字符串转换为大写 toLowerCase:把字符串转换为小写 charAT:返回指定字符的位置 indexOf:检索字符串 replace:替换正则表达式匹配字符串 > 33.数组去重 1.new Set let arr = [1,0,0,2,9,8,3,1]; console.log(...new Set(arr)); // [1,0,2,9,8,3] 2.双for循环 双层循环,外层循环元素,内层循环时比较值,如果值相同,则删掉这个值 var arr = [1,2,3,4,5,6,54,5,67] function unique(arr){ for(let i = 0; i < arr.length;i++){ for(let j = i + 1; j < arr.length;j++){ if(arr[i] === arr[j]){ arr.splice(j,i) // 第一个等同于第二个,splice方法删除第二个 } } } return arr; } > 33闭包 :内部函数调用外部函数 作用:延长它的生命周期 缺点:容易导致内存泄漏 var f = (function fn(){ var name = 1; return function(){ name++; console.log(name); } })(); function init(){ var name = "zhangsan"; // 创建局部变量name和局部函数alertName function alertName(){ // alertName()是函数内部方法,是一个闭包 console.log(name); // 使用了外部函数声明的便莱昂,内部函数可以i访问外部函数 } alertName(); } > 34.js 中this,闭包,作用域 * this:指向调用了上下文 * 作用域:定义一个函数就开辟了一个局部作用域,整个js执行环境有一个全局作用域 * 闭包:内部函数调用外部函数里面的变量 > 35.闭包是什么,有什么特性,对页面有什么影响,为什么要用它? 闭包就是内部函数调用外部函数的变量 缺点: 更多的内存消耗 会造成内存泄漏,因为闭包中引用的函数中定义的变量永远不会被释放; 解决:闭包在不使用的时候,及时释放。将引用外层函数对象的变量赋值为nunll 为什么使用: 局部变量,仅函数内可用不会被污染 function a(){ var n = 0; function add(){ n++; console.log(n); } return add; } var a1 = a(); // 注意,函数名只是一个标识(指向函数的指针),而()才是执行函数 a1(); //1 a1(); // 2 第二次调用n变量还在内存中 > 36.函数function和方法method的区别 [https://www.cnblogs.com/liubingyjui/p/10518397.html][https_www.cnblogs.com_liubingyjui_p_10518397.html] 区别: * 方法在对象里,方法也是函数 * 函数可以随意调用 本质上是一样的,方法是函数的特例,将函数赋值给了对象 函数:可以实现一定功能的一段代码的封装 注意:函数创建后,在内存堆中以一段字符串文本存储,不执行时不会调用,就单单存了一段字符串 function f(){ console.log('我是函数'); } 方法:把函数定义到对象里面就是方法 var obj = { function f(){ console.log("我是方法"); } }; //对象调用方法 (对象调用通过点对象的属性名) obj.f(); > 37.简述集中创建对象的方式 第一种字面量(高频) 语法:关键字 标识符 小括号\{函数体\} function sum1(num1,num2){ return num1+num2; } 第二种表达式(匿名表达式): [https_developer.mozilla.org_zh-CN_docs_Glossary_Primitive]: https://developer.mozilla.org/zh-CN/docs/Glossary/Primitive [https_www.cnblogs.com_yxbje_p_7395614.html]: https://www.cnblogs.com/yxbje/p/7395614.html [watermark_type_ZHJvaWRzYW5zZmFsbGJhY2s_shadow_50_text_Q1NETiBAcXFfNDAwNTUyMDA_size_14_color_FFFFFF_t_70_g_se_x_16]: /images/20220829/f799f267b7114275a898d4d6a418aaad.png [https_www.cnblogs.com_jing-tian_p_11100105.html]: https://www.cnblogs.com/jing-tian/p/11100105.html [https_www.cnblogs.com_lhh520_p_10176982.html]: https://www.cnblogs.com/lhh520/p/10176982.html [https_blog.csdn.net_weixin_38383877_article_details_81811621]: https://blog.csdn.net/weixin_38383877/article/details/81811621 [https_developer.mozilla.org_zh-CN_docs_Web_JavaScript_Reference_Operators_typeof]: https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/typeof [https_www.jianshu.com_p_d37cdc717f72]: https://www.jianshu.com/p/d37cdc717f72 [Number_string_boolean_null_undefined]: https://blog.csdn.net/qq_40471415/article/details/88837412#Numberstringbooleannullundefined_1 [https_developer.mozilla.org_zh-CN_docs_Web_JavaScript_Reference_Statements_for...of]: https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Statements/for...of [watermark_type_ZHJvaWRzYW5zZmFsbGJhY2s_shadow_50_text_Q1NETiBAcXFfNDAwNTUyMDA_size_20_color_FFFFFF_t_70_g_se_x_16]: /images/20220829/ae289ac0bb814961a8e7ada7b8a02d9e.png [https_www.runoob.com_try_try.php_filename_try_dom_createelement]: https://www.runoob.com/try/try.php?filename=try_dom_createelement [https_www.cnblogs.com_liubingyjui_p_10518397.html]: https://www.cnblogs.com/liubingyjui/p/10518397.html
相关 JS面试题 > JS初级开始 > 1.基本数据类型有几种?(高频) String,Boolean,Number,Null,undefiend,Symbol(es6) Symbol: 左手的ㄟ右手/ 2022年09月10日 08:18/ 0 赞/ 162 阅读
相关 js面试题 一、作用域 1、写出console.log结果(作用域) (function(){ var a = b = 2; })() con ╰半橙微兮°/ 2022年05月29日 11:48/ 0 赞/ 182 阅读
相关 js(面试题) shuffle:顾名思义,将数组随机排序,常在开发中用作实现随机功能。 我们来看看一个 shuffle 可以体现出什么代码品味。 错误举例 function 小灰灰/ 2022年05月29日 02:38/ 0 赞/ 169 阅读
相关 js面试题 > 1.JavaScript中如何检测一个变量是一个String类型?请写出函数实现 方法①: function isString(obj){ 深藏阁楼爱情的钟/ 2022年04月02日 04:42/ 0 赞/ 189 阅读
相关 js 面试题 javascript的数据类型 原始类型:null,undefined,number(数字类型),string(字符串类型),boolean(布尔值类型),symbol(e 我会带着你远行/ 2022年03月18日 11:58/ 0 赞/ 219 阅读
相关 JS面试题 1.什么是JavaScript? JavaScript是一种客户端脚本语言,可以插入到HTML页面中,并且是目前较热门的Web开发语言。同时,JavaScript是基于对象 Dear 丶/ 2022年03月08日 10:22/ 0 赞/ 210 阅读
相关 js面试题 JavaScript 的组成 JavaScript 由以下三部分组成: ECMAScript(核心):JavaScript 语言基础 DOM(文档对象模型) 客官°小女子只卖身不卖艺/ 2022年02月22日 19:00/ 0 赞/ 368 阅读
相关 js 面试题 闭包: ![复制代码][copycode.gif] function fun(n,o) { console.log(o) retur 浅浅的花香味﹌/ 2022年02月19日 01:53/ 0 赞/ 208 阅读
相关 js 面试题 1:toString function A() { this.name = "a"; this.toString = 一时失言乱红尘/ 2021年09月20日 13:26/ 0 赞/ 312 阅读
还没有评论,来说两句吧...