js基础
文章平均质量分 51
谢去非
我挂过的面试,比你面过的公司还要多!
展开
-
高阶函数、闭包
高阶函数和闭包高阶函数定义闭包定义高阶函数定义函数可以作为参数传递 或将函数作为返回值输出function fn(a, b, callback) { console.log(a + b); callback && callback(); } fn(1, 2, function() { console.log('我是最后调用的'); });闭包定义闭包指有权访问另原创 2021-08-04 10:23:27 · 84 阅读 · 0 评论 -
复习: JavaScript常见面试题系列一
复习: JavaScript常见面试题系列一1.js数据类型?String Number Boolean Undefined Null Symbol(ES6)(基本数据类型5种)Object(复杂数据类型1种)2.Symbol的作用?创建:通过symbol()创建参数:用于描述该类型,可省略应用场景:作为对象的属性名使用作用1:把一些不需要对外操作和访问的属性使用Symbol来定义,因为Symbol类型的key是不能通过Object.keys()或者for … in来枚举的原创 2021-08-04 10:22:52 · 82 阅读 · 0 评论 -
V8引擎详解
V8引擎详解转载 2021-03-30 23:28:17 · 139 阅读 · 0 评论 -
彻底搞懂js的this
彻底搞懂js的this转载 2021-03-26 14:16:59 · 93 阅读 · 0 评论 -
别人字节面经的题
别人字节面经的题1.JS怎么定义一个常量对象,内部属性无法修改2.实现一个repeat()方法:1.JS怎么定义一个常量对象,内部属性无法修改let obj = { name: 'xf', age: 22 } // 劫持单个属性使其不能被更改 Object.defineProperty(obj, 'age', { writable: false }) /原创 2021-03-16 23:38:31 · 67 阅读 · 0 评论 -
复习:点击删除当前li
复习:点击删除当前li代码代码<body> <ul> <li id='1'>1</li> <li id='2'>2</li> <li id='3'>3</li> <li id='4'>4</li> <li id='5'>5</li> </ul></原创 2020-12-13 15:32:35 · 223 阅读 · 0 评论 -
再理解函数柯里化
再理解函数柯里化函数柯里化的好相处函数柯里化举例封装一个柯里化函数的方法性能问题函数柯里化的好相处参数复用提前确认,避免每次都重复判断(attachEvent 和 addEventListener)延迟计算、运行便于测试函数柯里化举例当我们要调用一个传入多个参数的函数时,若存在大量参数重复,多次调用就会产生代码的冗余,例如以下案例,我们每次调用只想修改姓名。function say(country, school, name) { console.log(`Cou原创 2020-12-09 22:21:59 · 85 阅读 · 0 评论 -
复习: 手写防抖和节流函数
复习: 手写防抖和节流函数防抖定义手写代码应用节流定义手写代码应用区别防抖定义当持续触发事件,一定事件内没有再触发事件,事件处理函数才会执行一次,如果设定的时间到来之前 ,又一次触发了事件 ,就重新开始延时。通俗曰:多次事件触发的时间间隔未超过规定的时间间隔,就永远不会触发该事件。手写代码<body> <input type="text"></body><script> const debounce = function(fun原创 2020-12-09 14:31:26 · 413 阅读 · 0 评论 -
用JavaScript手写一个深拷贝函数,两种方案
手写一个深拷贝函数方案一(返回拷贝的新对象)方案二(不返回拷贝的新对象)方案一(返回拷贝的新对象)// 定义一个判断数据类型的函数 function checkedType(target) { return Object.prototype.toString.call(target).slice(8, -1); } // 深拷贝函数 function deepClone(target) { l原创 2020-11-13 23:55:29 · 751 阅读 · 0 评论 -
我的深拷贝和浅拷贝
我的深拷贝和浅拷贝浅拷贝深拷贝浅拷贝浅拷贝只复制指向某个对象的指针,而不复制对象本身,新旧对象还是共享同一块内存。var obj = { name: 'xf', age: 20 } var o = {}; for (var k in obj) { o[k] = obj[k]; } o.name = 'ff'; console.log(o原创 2020-11-13 23:29:29 · 73 阅读 · 0 评论 -
字符串方法 startWith() 、endsWith()、 repeat()
我的 startWith 和 endsWithstartWith()endsWith()startWith()表示参数字符串是否在原字符串的头部,返回布尔值。let str = 'hello world'; console.log(str.startsWith('hello'));输出 trueendsWith()let str = 'hello world'; console.log(str.endsWith('world'));输出 true...原创 2020-11-13 16:37:46 · 638 阅读 · 0 评论 -
我的find() 和 findIndex() 方法
我的find(和 findIndex 方法find()findIndex()find()用于找出第一个符合条件的数组成员,如果没有找到返回undefinedvar ary = [{ id: 1, name: '张三' }, { id: 2, name: '李四' }]; //查找数组id为2的对象 let target = ary.find((原创 2020-11-13 16:26:39 · 141 阅读 · 0 评论 -
剑指 Offer 27. 二叉树的镜像 JavaScript实现
剑指 Offer 27. 二叉树的镜像 JavaScript实现问题描述代码问题描述请完成一个函数,输入一个二叉树,该函数输出它的镜像。例如输入:4/ 2 7/ \ / 1 3 6 9镜像输出:4/ 7 2/ \ / 9 6 3 1代码var mirrorTree = function(root) { if(root == null) return root; [root.left, root.right] =原创 2020-11-12 23:25:45 · 112 阅读 · 0 评论 -
严格模式补充
1.通过var声明的变量,其属性描述符的configurable = false,所以不能通过delete对其进行删除。如果使用delete删除,不会报错,但不会生效,这种现象被称为静默失败。注:使用var声明的对象的 configurable = true ,可以使用delete删除但在严格模式下,使用delete删除操作,则会报错。2.非严格模式下,传入相同形参,不会报错,后面的形参会覆盖前面的形参数值。function fn(a, a) { console.log原创 2020-11-12 20:15:41 · 163 阅读 · 0 评论 -
关于闭包的思考题
闭包的思考题1.以下代码的输出结果?是否产生了闭包?2. 以下代码的输出结果?是否产生了闭包?1.以下代码的输出结果?是否产生了闭包?var name = 'The Window'; var object = { name: 'My Object', getNameFunc: function() { return function() { return this.na原创 2020-11-12 13:07:07 · 155 阅读 · 0 评论 -
我的严格模式
我的严格模式变量this指向问题函数变化变量1.变量名必须先声明再使用。2.不能随意删除已声明好的变量。this指向问题3.严格模式下全局作用域中的函数中的this指向是undefined。4.严格模式下,如果构造函数不加new 来调用,会报错。5.定时器的this还是指向window。6.事件、对象里面的this还是指向调用者。函数变化7.函数不能有重名的参数。8.不允许在非函数的代码块内声明函数。"use strict";if (true) { function f() {原创 2020-11-11 22:47:19 · 93 阅读 · 0 评论 -
我的 call() 、bind()、apply() 方法
call() 、bind()、apply() 方法call()方法apply()方法bind() 方法call、apply、bind总结相同点:区别点:主要应用场景call()方法call()可以调用函数和改变函数的this指向。 var o = { name: 'andy' } function fn(a, b) { console.log(this); console.log(a + b)原创 2020-11-11 22:16:10 · 84 阅读 · 0 评论 -
ES6的新增篇一
ES6的新增语法1.剩余参数2.扩展运算符3.转换数组方法Array.from()和Array.of()1.剩余参数1.作用:当形参个数小于实参个数时,…args接收所有多余的参数。function sum (first, …args) {console.log(first);console.log(args);}sum(10, 20, 30);应用例如:const sum = (...args) => { let total = 0;原创 2020-11-11 20:56:11 · 70 阅读 · 0 评论 -
箭头函数this的一道面试题
箭头函数this的一道面试题面试题原因面试题以下代码的执行结果是多少?var age = 100; var obj = { age: 20, say: () => { console.log(this.age); } } obj.say();答案是 : 100原因这个箭头函数定义在了对象里面,而对象是不能产生作用域的,实际上这个箭头函原创 2020-11-11 19:58:45 · 415 阅读 · 0 评论 -
JavaScript函数相关篇二
JavaScript函数相关篇二函数声明与函数表达式区别函数内部arguments.calleethiscallernew.target函数声明与函数表达式区别JS引擎在任代码执行前,会先读取函数声明,并在执行上下文中生成函数定义。而函数表达式必须等到代码执行到它那一行,才会执行上下生成函数定义。函数声明会在任何代码执行前先被读取并添加到执行上下文,这个过程叫作函数声明提升。除了函数什么时候真正有定义这区别之外,这两种语法是等价的。函数内部函数内部存在两个特殊的对象:arguments和th原创 2020-11-10 22:04:23 · 109 阅读 · 0 评论 -
JavaScript函数相关篇一
函数相关函数的定义方式:理解参数1.JS函数不关心传入的参数个数,也不关心参数的数据类型。2.arguments对象可以和命名参数一起使用。3.arguments的值始终会与对应的命名参数同名。4.JS中的所有参数都是按值传递的,如果把对象作为参数传递,那么传递的值就是这个参数的引用。5.当传入的参数带有扩展操作符时,对于arguments对象而言,它并不知道扩展操作符的存在,而是按照调用函数时传入的参数接收每一个值。函数的定义方式:1.函数声明(最后不加分号)2.函数表达式(要加分号)3.箭头函数原创 2020-11-10 20:40:01 · 73 阅读 · 0 评论 -
我的var、let、const区别
我的var、let、const区别varletconstvar1.使用var声明变量时,变量会被自动添加到最接近的上下文。2.如果变量未经声明就被初始化了,那么它就会自动被添加到全局上下文。例如:function add(num1, num2) { var sum = num1 + num2; return sum;}let result = add(10, 20);console.log(sum);//报错:sum在这里不是有效变量function add(num1, num2)原创 2020-11-05 22:32:21 · 245 阅读 · 0 评论 -
详解JavaScript 中 slice()、substr()、subtring()方法
详解JavaScript 中 slice、substr、subtring方法slice()方法substr()方法subtring()方法substring()最独特的地方slice()方法slice()方法参数是负数时,会将该负数与字符串长度相加作为最终参数。(不论是第一个还是第二个)var string = 'hello world'; console.log(string.slice(-1)); //d字符串长度为11,11-1=10,string.slice(10)为d原创 2020-09-29 22:32:32 · 846 阅读 · 0 评论 -
constructor为什么要修正?
constructor为什么要修正?function Man() { } function Woman() { } Woman.prototype = new Man(); Woman.prototype.constructor = Woman; var woman = new Woman();及时的对constructor的指向进行修正,便于在不知道woman实例的构造函数谁的情况下,对woman实原创 2020-09-25 20:28:57 · 135 阅读 · 0 评论 -
js中构造函数有没有__proto__属性?
js中构造函数有没有__proto__属性?验证:function SuperType() { this.property = true; } console.log(SuperType.__proto__);输出ƒ () { [native code] },说明构造函数有__proto__属性。console.log(SuperType.__proto__ == Function.prototype);输出true,说明SuperTyp原创 2020-09-25 10:55:45 · 1639 阅读 · 0 评论 -
hasOwnProperty()到底在哪?
hasOwnProperty()到底在哪?提问一:那hasOwnProperty()是否在对象实例中呢?提问二:那hasOwnProperty()是在实例所指的原型对象中吗?提问三:那hasOwnProperty()是在实例所指的原型对象的原型对象中吗?提问三:那实例所指的原型对象的原型对象是谁?扩展提问:那Object对象的原型是谁?hasOwnProperty是检测一个属性是否是存在于实例当中的一个方法。属性在对象实例中就返回truefunction Person() {} Per原创 2020-09-24 20:33:01 · 182 阅读 · 0 评论 -
js对象实例屏蔽原型属性的问题
js对象实例屏蔽原型属性的问题当为对象实例添加一个属性时,这个属性就会屏蔽原型对象中保存的同名属性;即就是,添加这个属性会阻止我们访问原型中的那个属性,但不会修改。function Person() {} Person.prototype.name = "xf"; var person = new Person(); person.name = "xx"; console.log(person.name);//xx执行流程:当读取原创 2020-09-24 19:47:54 · 350 阅读 · 0 评论 -
JavaScript 工厂模式
JavaScript 工厂模式形如:function createPerson(name , age ,gender){ //创建一个新的对象 var obj = new Object(); //向对象中添加属性 obj.name = name; obj.age = age; obj.gender = gender; obj.sayName = function(){ alert(this.name); }; //将新的原创 2020-09-22 22:17:17 · 98 阅读 · 0 评论 -
JavaScript构造函数
JavaScript构造函数构造函数构造函数this的情况:1.当以函数的形式调用时,this是window2.当以方法的形式调用时,谁调用方法this就是谁3.当以构造函数的形式调用时,this就是新创建的那个对象原创 2020-09-22 21:48:00 · 64 阅读 · 0 评论