我正在阅读关于单态的this article,并且那里有以下代码段:
function ff(b, o) {
if (b) {
return o.x
} else {
return o.x
}
}
ff(true, { x: 1 })
ff(false, { x: 2, y: 0 })
ff(true, { x: 1 })
ff(false, { x: 2, y: 0 })
函数ff中有多少属性访问内联缓存?什么是 说他们在吗? 答案:有2个缓存,两个都是单态的,因为每个缓存只能看到一个形状的对象。
我认为会有一个多态,因为之前的作者显示:
f({ x: 4, y: 1 }) // polymorphic, degree 2
f({ x: 5, z: 1 }) // polymorphic, degree 3
f({ x: 6, a: 1 }) // polymorphic, degree 4
f({ x: 7, b: 1 }) // megamorphic
该函数传递不同结构的对象,并将单态缓存变为多态。为什么与有问题的例子有所不同?
答案 0 :(得分:3)
代码中每个不同的属性引用都存在这些“内联缓存”。因此在函数中:
return
这两个return
语句都有自己的内联缓存。由于在示例中调用函数的方式,第一个ff()
仅发生在第一个形状的对象上,而第二个仅发生在第二个形状的对象上。因此,每个缓存(在对ff(true, { x: 1, z: 10 });
的四次调用之后)只会看到1个形状。
在第五次之后调用此函数:
String type = Files.probeContentType(Paths.get(filepath));
第一个IC会看到两个形状,因此它的IC将是多态的。
答案 1 :(得分:2)
每个属性访问o.x
都有自己的IC,即使多次访问同一对象的相同属性也是如此。
如果您运行node --trace-ic someScript.js
,则可以查看IC所属的行号。