Javascript中的求值策略
介绍
最近看到一个关于JS函数参数传值策略的讨论。很多人会认为JS的Object类型作为函数参数是按引用传递,而基础类型是按值传递,他们也提出了自己的佐证,而且网上搜索很多文章好像也这么说。但是这样的说发是不是正确的呢?让我们来探讨一下JS里面的求值策略。
维基百科搜索Evaluate-Strategy你可以看到求值策略其实是编程语言里面的一个常用术语。求值策略通常指对某种编程语言的表达式进行求值和计算的一个规则集。而函数参数的传值策略是其中一个特殊的例子。
一般业界常见的求值策略有严格和非严格策略。在“严格求值”中,给函数的实参总是在这个函数被调用之前求值,相应的“非严格求值”就是在函数调用时求值所以也叫“惰性求值”。
和大部分语言(C,java,Python,Ruby等)一样JS采用的也是严格求值策略,不同的是在JS里面参数求值顺序从左至右而其他的实现则是从右至左。
注:ES6里面函数增加了默认参数,参数默认值不是传值的,而是每次都重新计算默认值表达式的值也就是说,参数默认值是惰性求值的。
了解JS的函数传参策略对于我们理解JS来说意义重大。
问题
在此之前我们先来看一下问题:
function magic(num, objectA, objectB) {
num = num * 6;