Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/448.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript &引用;插播;来自空对象似乎不会影响性能_Javascript_Profiling - Fatal编程技术网

Javascript &引用;插播;来自空对象似乎不会影响性能

Javascript &引用;插播;来自空对象似乎不会影响性能,javascript,profiling,Javascript,Profiling,我必须更好地理解为什么应该(或不应该)从对象继承(var o=Object.create(null);)。如果我的答案是正确的,那么性能原因似乎是从null“继承”的主要可行原因 所以,我想检查一下(使用小巧、方便、可爱的分析器,名为): 标题 test('Prototypeless test',function(){ var o1=Object.create(null); o1.foo=“bar”; 对于(i=0;i

我必须更好地理解为什么应该(或不应该)从对象继承(
var o=Object.create(null);
)。如果我的答案是正确的,那么性能原因似乎是从null“继承”的主要可行原因

所以,我想检查一下(使用小巧、方便、可爱的分析器,名为):


标题
test('Prototypeless test',function(){
var o1=Object.create(null);
o1.foo=“bar”;
对于(i=0;i<1000000;++i){
o1.foo;
};
});
test('Prototypeful test',function(){
var o2={};
o2.foo=“巴”;
对于(i=0;i<1000000;++i){
o2.foo;
};
});

当执行时,我得到了相同的(有争议的)结果。这是否意味着从
对象继承时没有性能损失

是的,没有绩效处罚

为什么会有?它没有检查
[[Prototype]]
,因为
foo
o
的自有属性

您希望从
null
继承的原因是构建自己的原型链。它只是让你控制

一般来说,您会希望继承自
Object.prototype
,因为它上面的方法很有用,几乎所有的代码都“假定”所有东西都继承自它

但是,您可以使用特殊的逻辑创建自己的链

var newObject = Object.make(null,{
  toString: function  () { return "foobar"; },
  valueOf: function () { return 42;  }
});
为了一些价值

然后只需创建它的实例

var o = Object.create(newObject);
console.log(o + 3);
console.log("foo" + o);

如果您确实希望对
.valueOf
和其他方法进行细粒度自定义控制,那么出于调试目的(即,不要意外地使用Object.prototype方法而不是您自己的方法),不从
Object.prototype
继承是有意义的


除此之外,我认为它没有真正的使用案例。它可能会稍微快一点,或者占用的内存会稍微少一点。

我重新考虑了自己的代码,并稍微修改了代码,使
foo
字段查找通过“继承”链传播:


标题
var o1=Object.create(null);
o1.foo=“bar”;
var o2=对象。创建(o1);
var计数;
test('Prototypeless test',function(){
而(--计数){
o1.foo;
};
});
test('Prototypeful test',function(){
而(--计数){
o2.foo;
};
});

这样,当访问
o1
属性时,我的结果提高了10%

只是重新考虑了主要代码片段,并在上面列出了我自己的答案。我的逻辑是一致的吗?关键是(偏执地:)“证明了”,拜托?当然了。因为属性查找不是免费的。然而,现代JIT编译器可以将成本降低到接近于零,因此这是一个微观优化。相比之下,没有理由从null“继承”,嗯。一些冗余的语言特性。故事的结尾,我想:)没错,没什么意义,但是你可以想象人们抱怨
Object.prototype
总是在他们的原型链中。
var o = Object.create(newObject);
console.log(o + 3);
console.log("foo" + o);
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>Title</title>

    <script src="JSLitmus.js"></script>
    <script>
    var o1 = Object.create(null);
    o1.foo = "bar";

    var o2 = Object.create(o1);

    var count;

    JSLitmus.test('Prototypeless test', function() {
        while(--count) {
          o1.foo;
        };
    });

    JSLitmus.test('Prototypeful test', function() {
        while(--count) {
          o2.foo;
        };
    });

    </script>

</head>
<body>
</body>
</html>