__proto__ = Person.prototype; 执行到第6步时,由于在实例 obj 上面找不到 getName()这个方法,所以它就会自动去通过自身的 __proto__ 继续向上查找,结果找到了...怎么样,是不是有一种环环相扣的感觉?他们形成一个链了,没错,这就是原型链。 我们得出如下结论: 在访问一个对象(假设这个对象叫obj)的属性/方法时,若在当前的对象上面找不到,则会尝试通过obj....__proto__去寻找,而 obj....__proto__,指向 null,于是返回 undefined了。 是不是自然而然就理解了。我又给你画了个图(请对照着上面?...正则 / 框架 / 算法等 重温系列(16篇全)5. Webpack4 入门(上)|| Webpack4 入门(下)6.
其实,函数的prototype指向了一个对象,这个对象就是正在调用该构造函数而创建的实例的原型,也就是这个例子中的person1的原型。 proto 那什么是原型呢?...当读取实例的属性时,如果找不到,就会查找对象的原型中的属性,如果还查不到就去原型的原型继续查找,一直找到最顶层为止 举个例子: function Person() { } Person.prototype.name...; console.log(person.name) // ZS 在这个例子中,我们给实例对象 person 添加了 name 属性,当我们打印 person.name 的时候,结果自然为 LS。...但是当我们删除了 person 的 name 属性时,读取 person.name,从 person 对象中找不到 name 属性就会从 person 的原型也就是 person.proto ,也就是...null,我们可以打印看一下 console.log(Object.prototype.__proto__ === null) // true null表示"没有对象",即此处不应该有值。
__proto__== Object.prototype 即 p.b 打印结果为b,p没有b属性,会一直通过__proto__向上查找,最后当查找到 Object.prototype 时找到,最后打印出...b, 向上查找过程中,得到的是 Object.prototype,而不是 Function.prototype,找不到a属性, 所以结果为 undefined,这就是原型链,通过__proto__向上进行查找...,最终到null结束 console.log(p....__proto__); //null console.log(Object.prototype....__proto__); //NULL console.log(Function.prototype.
之后执行obj1.a,a是右obj1调用的,所以this指向obj,打印出2;执行 obj1.foo.call(obj2, 3) 时,会将foo的this指向obj2,后面就和上面一样了,所以会打印出3...然后执行console.log(x.x), 也就是console.log(window.x),而window对象中没有x属性,所以会输出undefined。...当指向y.x时,会给全局变量中的x赋值为6,所以会打印出6。...做完这道题目,我们就需要格外注意,每个定时器的时间,并不是所有定时器的时间都为0哦。...第一种是函数调用模式,当一个函数不是一个对象的属性时,直接作为函数来调用时,this 指向全局对象。第二种是方法调用模式,如果一个函数作为一个对象的方法来调用时,this 指向这个对象。
//alert(document.getElementById('notExistElement')); --->显示为null,找不到此对象 //undefined类型...任何数值除以0都会导致错误而终止程序执行。一般使用isNaN()来判断是否为NaN类型. [] == false; // true [] == !...var e = Number(undefined); console.log(a,b,c,d,e); // 1 1 NaN 0 NaN // Number()可以把任意值转换成数值,如果要转换的字符串中有一个不是数值的字符...// 如果第一个字符不是数字或者符号就返回NaN 2.3 字符串特别说明 **1.... 如何打印一下字符串: var s = '我很喜欢 \"雷锋 \'的精神\' \"'; console.log(s); 字符串长度 length属性用来获取字符串的长度 var
html 结构 console.log(wrapper.html()); }); }); 可以看到 mount 和 shallowMount 的区别就是 mount 会打印出完整的 html...结构,而 shallowMount 将子组件以标签的形式打印。...(wrapper.find('h2')); }); }); 得到的结论是 找不到元素的时候,find 会返回 null 不会报错,case 通过,get 会报错,case 失败。...当组件不存在时,findComponent 不会报错。...(wrapper.getComponent({ name: 'foo' })); }); }); 得到的结论是 找不到组件的时候,findComponent 会返回 null 不会报错,case
parentNode.lastChild 返回最后一个子节点,找不到则返回null。同样,也是包含所有的节点。...parentNode.firstElementChild 返回第一个子元素节点,找不到则返回null。IE9以上才支持。...parentNode.lastElementChild 返回最后一个子元素节点,找不到则返回null。IE9以上才支持。...node.nextElementsiSbling 返回当前元素下一个兄弟元素节点,找不到则返回null。...node.previousElementsiSbling 返回当前元素上一个兄弟元素节点,找不到则返回null。
> 【注意】在PHP中使用变量和常量的区别在于变量在需要在前面加$,常量不需要 字符串连接要用“.”操作符而不是“+”操作符 JS:var str = '外婆的' + '彭湖湾'; PHP:在PHP中连接字符串时候...JS中存在变量声明提升,var声明的变量会被提升至代码顶部执行(在下方声明后不报未定义的错了) 2.JS中虽然存在变量声明提升,但赋值操作却不能被提升(输出undefined而不是鸡年大吉) 根据上述两点的结论...('number的类型是',typeof number); console.log('str的类型是',typeof str); console.log('null_value的类型是'...输出为1而不是2,这说明,在运行函数fuc时候,仅仅是把my_value的值拷贝给一个新创建的局部变量value而已,然后对这个新变量进行操作,而不是针对原来定义的value变量 对于引用类型也只有值传递...可能有人会想:怎么调用函数时对象的名称被修改了?!!不是说好了JS是值传递吗? 对!JS是值传递,但在这里,传递的参数并不是对象,而是对象的地址(或引用)!!
其实,函数的 prototype 属性指向了一个对象,这个对象正是调用该构造函数而创建的实例的原型,也就是这个例子中的 person1 和 person2 的原型。 那什么是原型呢?...、实例原型、和实例之间的关系,接下来我们讲讲实例和原型的关系: 实例与原型 当读取实例的属性时,如果找不到,就会查找与对象关联的原型中的属性,如果还查不到,就去找原型的原型,一直找到最顶层为止。...name 属性,当我们打印 person.name 的时候,结果自然为 Daisy。...但是当我们删除了 person 的 name 属性时,读取 person.name,从 person 对象中找不到 name 属性就会从 person 的原型也就是 person....null,我们可以打印: console.log(Object.prototype.__proto__ === null) // true 然而 null 究竟代表了什么呢?
原型链是一个比较抽象的概念,每当被问起这个问题时,总会回答得不是那么准确,好像懂,但自己好像又不太懂,真是尴尬了 正文开始......当我们访问一个对象时,首先会在自身属性上找,当自身属性找不到时,会到对象的隐式链上去找,如果隐式链上还没有,那么会到构造函数的原型上找,当原型上没有时,会到原型的隐式__proto__上去找,当这个属性还找不到时...__proto__.name = '8888' console.log(person.say()); 从结果上来看,会是依次从1,2,3,4依次查找下去,直到最后找不到name为止,最后就打印undefined...__proto__ === null); // true console.log(person.__proto__....应该会掌握八九不离十 另外还有一篇github上关于伢羽老师的原型链[1]的文章可以一同参考 总结 理解原型链,每一个函数都有一个原型prototype,每一个对象都有自己的隐式__proto__,当我们访问对象属性时,
App版本: v10.3.0 二、步骤 分析一下 1、数据的结尾是"==",说明是Base64编码,那么我们可以尝试去Hook Base64相关函数,然后打印堆栈。...; } 跑一下,这次用的是Attach模式,有可能会提示包名找不到,我试了下使用App的中文名,居然可以Attach上,很神奇。...再来一次 这下扩大点范围,搜索 where [findex.png] 结果不是很多 200来项,细细看来, 这个大兄弟最为可疑。 1、类名AddressSelectView,看上去像是给地址页赋值。...DesCbcCrypto.decrypt(optString, generateKey, (byte[]) null) : DesCommonUtils.decryptThreeDESECB(optString...通常App经过好几轮的版本迭代,加解密算法说不定也升级了好几轮,所以不要钻牛角尖,你第一眼看到的算法也许是老算法,不要气馁,还可以继续寻觅。
('target: ', target) console.log('source', source) 既然存在多个源对象合并,那么问题来了,如果多个源对象具有相同的属性时,会怎样呢?...如果找不到,则会报错。 const age = 21; const person = { age, // 当属性名和变量名一样时,可以简写。会自动去找同名变量。...如果找不到,则会报错 // age: age }; console.log(person); // {age: 21} 方法算是特殊的属性,也能简写。...property '_' of 'null' as it is null....(salary); // 112 部分解构 部分解构:如果一个解构表达式多个赋值,开始的赋值成功,而中间的赋值出错的话,解构赋值开始的部分还是能完成,只是中间报错的部分以及后面的部分不能完成。
这道题要求从左到右顺序打印,完全遵循广度优先遍历,我们可以在二叉树递归时,先不要急着读取值,而是按照左、中、右,遇到左右子树节点,就推入栈的末尾,利用 while 语句不断循环,直到栈空为止。...利用展开时追加到栈尾,并不断循环处理栈元素的方式非常优雅,而且符合栈的特性。 当然如果题目要求倒序打印,你就可以以 右、中、左 的顺序进行处理。 接下来看看深度优先遍历,典型题目是二叉树的深度。...而求左右子树深度可以复用 deep 函数形成递归,我们只需要考虑边界情况,即访问节点不存在时,返回深度 0 即可,因此代码如下: function deep(node: TreeNode) { if...右侧的光束可以认为是分层照射的,那么当我们用广度优先算法遍历时,对于每一层,都找到最后一个节点打印,并且按顺序打印就是最终答案。...有一道二叉树的题目,是根据树的深度,按照广度优先遍历打印成二维数组,记录树的深度其实也有巧妙办法,即在栈尾追加元素时,增加一个深度 key,那么访问时自然就可以读到深度值。
其实是,函数在自己的作用域内找到就不会再再继续找,类似原型链一样,在构造函数里面找到某个属性就不会去原型找,找不到才去,再找不到就再往上。函数也是,沿着作用域链查找。...(f) } g()//打印整个函数 f()//报错 复制代码 4.2 eg2 function f(){ return function f1(){ console.log(1)...5.1新生代 新生代用Scavenge算法进行垃圾回收,利用复制的方式实现内存回收的算法。 他的过程是: 将新生代的总空间一分为二,只使用其中一个,另一个处于闲置,等待垃圾回收时使用。...(s) } } var b = a()//我们可以打个断点,在谷歌浏览器看他的调用栈,发现闭包里面没有r了 复制代码 对于最后一个例子,r、s并不是像一些人认为的那样,有闭包了,r、s都会留下,其实是...而真正的局部变量是r ,保存在栈,当b执行完毕后出栈并且被垃圾回收。而a的ctx被闭包引用,如果有任何一个闭包存活,他对应的ctx都将存活,变量也不会被销毁。 ? 我们也听说一句话,尽量避免全局变量。
[ ]这样的, 虽然也是对象, 但我们还是叫它数组吧 弱类型的JS 在了解JS弱类型之前,我们需要了解一点—— JS里值才有类型,变量没有 我们经常会谈到JS的类型,其实是针对变量的值的,而不是变量。...'); } // 打印: null被检测出来啦 当时打脸场景如下: 其实我是不服气的,因为觉得这段代码有点丑陋,于是又想了一种: 3....根本找不到方法! var b = null; console.log(b.toString()) // 报错!根本找不到方法!...NaN不是number,也就是number之外的类型, 例如字符串,布尔值等等 2. NaN属于number类型,只不过是一种非常特殊的number的值, 为NaN NaN属于第2种而不是第1种!!...你把大量的工作花费在了写+号上和写单引号上 (虽然以我歪曲的审美觉得这段代码看起来挺“漂亮”的) 而当你使用模板字符串时就不用换行了: var str = ` <head
其实是,函数在自己的作用域内找到就不会再再继续找,类似原型链一样,在构造函数里面找到某个属性就不会去原型找,找不到才去,再找不到就再往上。函数也是,沿着作用域链查找。...(f) } g()//打印整个函数 f()//报错 4.2 eg2 function f(){ return function f1(){ console.log(1) }...5.1新生代 新生代用Scavenge算法进行垃圾回收,利用复制的方式实现内存回收的算法。 他的过程是: 将新生代的总空间一分为二,只使用其中一个,另一个处于闲置,等待垃圾回收时使用。...(s, q) } } //我们可以打个断点,在谷歌浏览器看他的调用栈,发现闭包closure里面没有r了 var b = a() b() 对于最后一个例子,r、s并不是像一些人认为的那样,有闭包了,...而真正的局部变量是r ,保存在栈,当b执行完毕后出栈并且被垃圾回收。而a的ctx被闭包引用,如果有任何一个闭包存活,他对应的ctx都将存活,变量也不会被销毁。 我们也听说一句话,尽量避免全局变量。
前端算法入门一:刷算法题常用的JS基础扫盲[1] 前端算法入门二:时间空间复杂度\&8大数据结构的JS实现[2] 前端算法入门三:5大排序算法\&2大搜索\&4大算法思想[3] 前端面试算法高频100题...() 在数组中寻找该值,找到则返回true,找不到则返回false。...["20", index: 0, input: "2018年结束了,2019年开始了"] 复制代码 注意事项:如果match方法没有找到匹配,将返回null。...当我们需要判定数组中的元素是否满足某些条件时,可以使用every / some。这两个的区别是,every会去判断判断数组中的每一项,而 some则是当某一项满足条件时返回。...该数组的成员都是该对象自身的(而不是继承的)所有属性名,且只返回可枚举的属性。
当我们展开 __proto__ 时就会发现,我们的 say 方法在其中,那这其实是因为我们在类中添加的方法,会被添加到这个类的原型对象上 当我们在调用 say 方法时,在自身上并没有找到这个方法,就会在自身的...,来看一下 console.log(Student) 打印出来就是一个类 而在这个类上会有一个方法 prototype ,我们来打印一下看看它是什么 console.log(Student.prototype...) 我们会发现在它的上面也有一个 say 方法,同时是不是觉得这个又点眼熟呢 我们在控制台打印一下实例对象的隐式原型 console.log(student....原型 原型又分为显式原型和隐式原型 __proto__ 隐式原型 在对象上有一个属性叫做 __proto__,这个属性是对象所特有的,也叫做隐式原型,当我们尝试在一个对象上查找属性或者方法时,如果说找不到这个属性或者方法...,这就是原型链 那这是什么意思呢,在我们前面在讲查找原则的时候,其实也有提到,当一个要查找对象上的属性或者方法时,如果在自身上没有找到,就会在隐式原型对象下查找,直到找到,或者到达尽头 null 在这个查找的过程形成的一条由
没什么问题,很完美,接下来我们来打印一下实例化出来的对象 student console.log(student) 我们看一下控制台输出 ?...Student 来创建的,那么我们打印一下这个类,来看一下 console.log(Student) 打印出来就是一个类 ?...我们会发现在它的上面也有一个 say 方法,同时是不是觉得这个又点眼熟呢 我们在控制台打印一下实例对象的隐式原型 console.log(student.__proto__) ?...原型 原型又分为显式原型和隐式原型 __proto__ 隐式原型 在对象上有一个属性叫做 __proto__,这个属性是对象所特有的,也叫做隐式原型,当我们尝试在一个对象上查找属性或者方法时,如果说找不到这个属性或者方法...原型链 原型链其实也很简单:对象 => 对象的原型 => 原型的原型 => 原型的原型的原型 => null,这就是原型链 那这是什么意思呢,在我们前面在讲查找原则的时候,其实也有提到,当一个要查找对象上的属性或者方法时