js 面试题 一时失言乱红尘 2021-09-20 13:26 304阅读 0赞 1:toString function A() { this.name = "a"; this.toString = function () { return this.name } } function B() { this.name = "b"; } var b1 = new B(); console.log(b1.toString()); //[object Object] B.prototype = new A(); var b2 = new B(); console.log(b2.toString()); // b 这里非常巧妙的用到了toString() 对与普通的Number,Array,Boolean, 用toString是转化为字符串,但是object.prototype.toString中的toString是 返回当前方法执行执行的主体(方法中的this)所属类的详细信息即"\[object Object\]",其中第一个object代表当前实例是对象数据类型的(这个是固定死的),第二个Object代表的是this所属的类是Object。 看实例化这句: var b1 = new B() 里面存在一个原型链:b1.\_\_proto\_\_ ==B.prototype.\_\_proto\_\_==Objec.prototype 所以最后b1.toString 实际上是 Objec.prototype.toString B.prototype = new A(); var b2 = new B(); console.log(b2.toString()); // b 2:call apply // call和apply(数组) function AA() { this.name = "a"; this.say = function () { console.log("my name is" +" "+ this.name) } } function BB() { this.name = "b"; } var aa = new AA(); var bb = new BB(); aa.say.apply(bb); // my name is bb // bb调用aa的方法 3:定时器 异步事件 // 每隔一秒弹框,五秒结束弹框 var id = setInterval(function () { alert("123") }, 1000) setTimeout(function () { clearInterval(id) }, 5000) 4: 匿名函数,闭包,let解决作用域问题 首先创建一个input:document.createElement 设置自定义属性:setAttribute(类型) setAttribute(值) 将自定义属性创建的元素添加到页面 documrnt.body.appendChild() 难点是点击按钮,弹出数字。由于for循环(同步)和点击事件(异步),js的执行机制是,先执行执行栈里面的同步事件,再执行任务队列的异步代码,这个时候,q已经是,所以永远弹出的是,不可能是每个按钮对应的值。这个时候,用闭包就爽歪歪 使用闭包以后:就可以访问函数内部的变量 也就是点击函数形参,可以是for循环的实参 //使用js代码 ,为页面动态添加5个按钮,button1,button2,button3... // 单击每个按钮,分别弹出1 2 3 4 5 for (var q = 0; q < 5; q++) { var input = document.createElement("input"); input.setAttribute("type", "button"); input.setAttribute("value", "button" + q); (function (n) { input.onclick = function () { alert(n) } })(q) document.body.appendChild(input); } 另外一种简单的方法: 将var 变为let for (let q = 0; q < 5; q++) { var input = document.createElement("input"); input.setAttribute("type", "button"); input.setAttribute("value", "button" + q); input.onclick = function () { alert(q) } document.body.appendChild(input); } let是es6引入的,用他声明的变量代表块级作用域。变量只要在\{\},内部的函数都可以同步访问。你可能会好奇 js机制怎么被一个块级作用域给解决了?其实闭包又何尝不是,在整个函数体内,所以函数都可以同时访问变量,不存在同步异步。这里需要指出: 一个是同步任务和异步任务的优先顺序 一个是同步任务和异步任务的执行时间 5: 数组方法的使用 转为驼峰 // 已经有一个字符串 //foo = "get-element-by-id"; 转化为驼峰表示法 getElementById var foo = "get-element-by-id" var arr = foo.split("-"); console.log(arr); //["get", "element", "by", "id"] // charAt(n) //返回字符串中的第几个字符串,从0开始 for (var i = 1; i < arr.length; i++) { //注意这里的i从1开始,是因为转化为驼峰表达式,第一个单词字母开头小写 // arr[i].charAt(0).toUpperCase() 返回大写字母 E B I // arr[i].slice(1) +(拼接) splice分割,除了第一个字母(大写) lement y, d arr[i] = arr[i].charAt(0).toUpperCase() + arr[i].slice(1); //现在的结果是:字符串数组:["get", "Element", "By", "Id"] } // 想要变为字符串,用join() var arr = arr.join("");//里面什么也不写 get,Element,By,Id.join("") 中间什么也没有,返回我们要的结果 console.log(arr); //getElementById 6: 数组倒排,升序 降序 // 数组倒排 var numberArray = [5, 1, 4, 2, 6, 3]; var arr3 = []; // 将numberArray的长度作为下标放入数组,最大肯定是length-1,但是总的数量不变,所以i要=0 for (var i = numberArray.length - 1; i >= 0; i--) { arr3.push(numberArray[i]); } console.log(arr3); // 数组降序 var number = [5, 1, 4, 2, 6, 3]; for (var m = 0; m < number.length - 1; m++) { for (var n = 0; n < number.length - 1 - m; n++) { if (number[n] > number[n + 1]) { var temp = number[n]; number[n] = number[n + 1]; number[n + 1] = temp; } } } console.log(number);//[1, 2, 3, 4, 5, 6] // 改变if里面的判断条件 ,就是降序 // if(number[n]<number[n+1]) 7:输出日期 //输出今天的日期,以yyy-mm-dd的方式,比如2019年6月28日输出2019-06-28 var d = new Date(); console.log(d); var year = d.getFullYear(); console.log(year) var month = d.getMonth() + 1; //比较特殊 0-11 month = month < 10 ? '0' + month : month; console.log(month); var day = d.getDate(); day = day < 10 ? "0" + day : day; console.log(day); alert(year + '-' + month + '-' + day) 8:数组去重 function f3(arr) { var a3 = [] for (var i = 0; i < arr.length; i++) { if (a3.indexOf(arr[i]) == -1) { //a3的索引没有和arr[i] 一样的,放入a3 a3.push(arr[i]) } } return a3; } var arr = [1, 1, 1, 2, 2, 2, 3] console.log(f3(arr)); 9:闭包 **下面这个** **ul****,如何点击每一列的时候** **alert** **其** **index?****(闭包)** var lis = document.getElementById("test").querySelectorAll('li'); for (var i = 0; i < lis.length; i++) { lis[i].onclick = function (i) { // console.log(i) return function () { console.log(i) } }(i); }
相关 JS面试题 > JS初级开始 > 1.基本数据类型有几种?(高频) String,Boolean,Number,Null,undefiend,Symbol(es6) Symbol: 左手的ㄟ右手/ 2022年09月10日 08:18/ 0 赞/ 156 阅读
相关 js面试题 一、作用域 1、写出console.log结果(作用域) (function(){ var a = b = 2; })() con ╰半橙微兮°/ 2022年05月29日 11:48/ 0 赞/ 176 阅读
相关 js(面试题) shuffle:顾名思义,将数组随机排序,常在开发中用作实现随机功能。 我们来看看一个 shuffle 可以体现出什么代码品味。 错误举例 function 小灰灰/ 2022年05月29日 02:38/ 0 赞/ 164 阅读
相关 js面试题 > 1.JavaScript中如何检测一个变量是一个String类型?请写出函数实现 方法①: function isString(obj){ 深藏阁楼爱情的钟/ 2022年04月02日 04:42/ 0 赞/ 185 阅读
相关 js 面试题 javascript的数据类型 原始类型:null,undefined,number(数字类型),string(字符串类型),boolean(布尔值类型),symbol(e 我会带着你远行/ 2022年03月18日 11:58/ 0 赞/ 214 阅读
相关 JS面试题 1.什么是JavaScript? JavaScript是一种客户端脚本语言,可以插入到HTML页面中,并且是目前较热门的Web开发语言。同时,JavaScript是基于对象 Dear 丶/ 2022年03月08日 10:22/ 0 赞/ 202 阅读
相关 js面试题 JavaScript 的组成 JavaScript 由以下三部分组成: ECMAScript(核心):JavaScript 语言基础 DOM(文档对象模型) 客官°小女子只卖身不卖艺/ 2022年02月22日 19:00/ 0 赞/ 363 阅读
相关 js 面试题 闭包: ![复制代码][copycode.gif] function fun(n,o) { console.log(o) retur 浅浅的花香味﹌/ 2022年02月19日 01:53/ 0 赞/ 203 阅读
相关 js 面试题 1:toString function A() { this.name = "a"; this.toString = 一时失言乱红尘/ 2021年09月20日 13:26/ 0 赞/ 305 阅读
还没有评论,来说两句吧...