Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/453.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/21.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_Angularjs - Fatal编程技术网

Javascript 传递字符串比传递对象隔离范围快多少?

Javascript 传递字符串比传递对象隔离范围快多少?,javascript,angularjs,Javascript,Angularjs,更快/更高性能的方法是,通过隔离作用域传入对象,或者通过指令传入id并检索控制器中的资源,而不是将整个内容放在作用域中 即两者之间的差异 <my-directive resource="resource"></my-directive> 然后直接从作用域中使用对象 或 ctrl有点像这样(假设存在通过另一个fn获取资源的方法): 还是没有区别?您应该能够轻松地比较两者的性能 常识是,传递一个资源ID的副本,然后使用该ID获取资源应该会慢一点-如果没有别的,它有这两条指令

更快/更高性能的方法是,通过隔离作用域传入对象,或者通过指令传入id并检索控制器中的资源,而不是将整个内容放在作用域中

即两者之间的差异

<my-directive resource="resource"></my-directive>
然后直接从作用域中使用对象

ctrl有点像这样(假设存在通过另一个fn获取资源的方法):


还是没有区别?

您应该能够轻松地比较两者的性能

常识是,传递一个资源ID的副本,然后使用该ID获取资源应该会慢一点-如果没有别的,它有这两条指令,一个基本对象和一个函数,而不仅仅是传递对象引用


传递字符串比传递对象隔离范围快多少


如果代码是好的,它永远不会更快。这是一个通过引用传递与通过值传递的问题(在这种情况下,再加上做得更多),通过引用传递总是更快。

正如Shomz提到的,通过对象引用应该更快。它涉及到处理单个值(如中的引用,表示对象所在的位置),其中传递ID需要每次实际访问ID,然后使用该值查找对象

by id方法的另一个问题是,您现在依赖于您的服务来查找对象。您还依赖于在服务中存储id->Object状态,这通常是应该避免的。不过,这与你的问题无关

回到问题上来:

下面是一个JSFIDLE,它测试并计时两种场景(您需要打开控制台才能查看计时):

该测试呈现1500个项目,并具有可用于切换项目绑定方式的按钮。它立即启动计时器,并在10$digest循环后结束

我简化了by id端,这样它就不用使用服务来查找对象,而只需从存储在其
$parent
上的数组中获取对象(这不安全,不应该在生产代码中执行-假设
$parent
是个坏主意。)这种方法实际上应该比服务函数更快,因为它避免了额外的函数调用,而只是跳过对象,并在索引id处获取数组的项

即使如此,通过引用传递的速度也更快。对我来说,在这个特殊的测试中,它往往快10%左右


最重要的是,通过引用传递的代码非常干净!我认为这应该是这个特殊情况下更重要的考虑因素。

我不确定我是否遵循常识。每个$digest循环,passby引用都会将对象引用与旧对象引用进行比较。pass-by资源id(带有
{{resource.id}}
)将实际尝试进入资源,获取id属性,并每$digest循环将其与缓存的/以前的值进行比较。所以它实际上可能是向后的。@DRobinson,它可能是相反的,是的,这取决于消化循环的优化程度。但是通过引用传递某个对象总是比通过值传递要快,因为在值传递中,会创建一个新对象。更不用说对象查找功能了,它必须比与内部对象交互的速度慢。哎呀,我反向阅读了你的答案。我以为你是说通过推荐会比通过id慢。是的,我是想说通过推荐更快,所以我想我最终同意了你。。。哎呀,很抱歉搞混了。@DRobinson Hehe,没问题!:)如果你有,比如说,4000个对象,通过引用传递是否会创建一个在大型对象上速度较慢的手表?两者都会创建一个手表。By reference不会监视对象上的每个属性。它只监视引用。您可以尝试将JS中的对象比较想象为(这是一种简化)基本上比较内存地址。因此,它会进行类似于
{}==={}
(返回
false
,因为这两个对象不同/保存在不同的内存地址中)的比较。但是如果需要测试,这里是:。在此版本中,每个对象都有53个属性。参考版本的速度更快,与以前相同。它不会单独监视每一处房产。在该示例中,您可以打开控制台并自己查看它。1500个对象,每个对象有53个属性,运行10个摘要。参考速度还是快了一点。此外,差异仍然很小,因此代码清晰度(更简单的解决方案)更好。
    scope: {
        resource: '=' 
    }
<my-directive resource-id="{{resource.id}}"></my-directive>
{scope: resourceId: '@'}
let resource = ResourceStorage.get($scope.resourceId);