4. new 关键字做了什么?
function Person(){ this.name = '朱小明'; this.fn = function(){ console.log('名字是:' + this.name) } } let person1 = new Person();
- 创建一个空的对象
- 链接到原型
- 绑定this指向,执行构造函数
- 确保返回的是对象
- 代码来解释一下:
let obj = new Object(); obj.__proto__= Person.prototype; // 设置原型链 let result = Person.call(obj); // 让Person的this指向obj,并执行Person函数体 // 判断Person的返回值类型: // 如果是值类型,返回obj。如果是引用类型,就返回这个引用类型的对象 if (typeof(result) == "object"){ person1 = result; } else{ person1 = obj;; }
默认情况下函数返回值为 undefined,即没有显示定义返回值的话
构造函数例外,new 构造函数在没有 return 的情况下默认返回新创建的对象
5. 原生JS如何实现事件委托?
事件委托就是利用事件冒泡,只指定一个事件处理程序,就可以管理某一类型的所有事件
举个栗子:
有三个同事预计会在周一收到快递。为签收快递,
有两种办法:一是三个人在公司门口等快递;二是委托给前台MM代为签收。
前台MM收到快递后,她会判断收件人是谁,然后按照收件人的要求签收,
甚至代为付款。这种方案还有一个优势,那就是即使公司里来了新员工(不管多少),前台MM也会在收到寄给新员工的快递后核实并代为签收。
具体实现:
<!DOCTYPE html> <html> <head> <title>事件委托</title> </head> <body> <ul id="ul"> <li>0</li> <li>1</li> <li>2</li> <li>3</li> <li>4</li> <li>5</li> </ul> <button id="btn">点我添加一个li</button> </body> <script> // 事件委托具体实现 let ul = document.getElementById("ul"); ul.onclick = function (event) { event = event || window.event; let target = event.target; // 获取目标元素 if (target.nodeName == 'LI') { alert(target.innerHTML); } } // 为按钮绑定点击事件 let btn = document.getElementById('btn'); btn.onclick = function () { let li = document.createElement('li'); // 新增li的内容为ul当前子元素的个数 li.textContent = ul.children.length; ul.appendChild(li); } </script> </html>
6. 手写一个冒泡排序
- 两个for循环就搞定了
- 相邻两个比较大小,如果后者比前者小,就交换两者位置,以此类推
let array = [5, 4, 3, 2, 1]; let temp = 0; for (var i = 0; i <array.length; i++){ for (var j = 0; j <array.length - i; j++){ if (array[j] > array[j + 1]){ temp = array[j + 1]; array[j + 1] = array[j]; array[j] = temp; } }
8. 如何一行代码实现数组去重?
[...new Set([1,2,3,1,'a',1,'a'])]
9. null与undefined有什么区别?
null 是一个表示"无"的对象,转为数值时为 0,布尔值为 false
undefined 是一个表示"无"的原始值,转为数值时为 NaN
当声明的变量还未被初始化时,变量的默认值为 undefined
null 用来表示尚未存在的对象,undefined 表示"缺少值",就是此处应该有一个值,但是还没有定义