链表 & JS原型链
JS原型链类似于链表,不同的是链表使用next
连接;JS原型链用__proto__
来连接。
原型链举例如下:
[对象] obj -> Object.prototype -> null
[函数] fun -> Function.prototype -> Object.prototype -> null
[数组] arr -> Array.prototype -> Object.prototype -> null
instanceof 的原理,并用代码实现
- instanceof是JS中的一个操作符。
- A instanceof B: A是否是B的原型,或者说B是否在A的原型链上
function instanceof(A, B) {
let p = A;
while(p) {
if(p === B.prototype) {
return true;
}
p = p.__proto__;
}
return false;
}
看看下面代码输出的结果
var foo = {},
F = function(){};
Object.prototype.a = 'a';
Function.prototype.b = 'b';
console.log(foo.a); // 'a'
console.log(foo.b); // undefined
console.log(F.a); // 'a'
console.log(F.b); // 'b'
- 访问foo.a,先从foo对象上找,没找到,沿着原型链找到Object.prototype,发现有属性a,打印出 a
- 访问foo.b,先从foo对象上找,没找到,沿着原型链没有找到b,打印出 undefined
- 访问F.a,先从F上找,没找到,沿着原型链找到Object.prototype,发现有属性a,打印出 a
- 访问F.b,先从F上找,没找到,沿着原型链找到Function.prototype,发现有属性b,打印出 b
使用链表指针获取JSON节点的值
如下,给出一个json数据,并给出查找的路径,获取json节点的值
const json = {
a: {b: {c: 1}},
d: {e: 2}
}
const path = ['a', 'b', 'c']
思路:遍历链表的方式
function getNode() {
let p = json;
path.forEach((key)=> {
p = p[key]
})
return p;
}