Javascript - 生成没有运算符重载的表达式

时间:2017-07-11 07:48:54

标签: javascript three.js

我在js项目中使用了three.js,我正在尝试计算一个向量是否仍然在这样的区域

var THRESHOLD = 10;
if(!is_in_rect(camera.position - forward * THRESHOLD)))
   // do something

其中camera.position和foward是THREE.Vector3个对象。

上述方法的问题虽然非常易读,但由于js不支持运算符重载,因此无法正常工作。我必须写一些类似

的内容
if(!in_rect(camera.position.clone().add(forward.clone().multiplyScalar(THRESHOLD)))

对我来说看起来有点难看。

在我失踪的js中是否有其他惯用的方法?

2 个答案:

答案 0 :(得分:1)

从您关联的页面:

  

.addScaledVector(v,s)

     

将v和s的倍数添加到此向量

所以更好一点:

camera.position.clone().addScaledVector(forward,THRESHOLD)

此外,没有真正的理由克隆前进,因为这不会改变。

如果我正在关注@ T.J。是的,如果idomatic表示使用+-,如果我们严格遵守JS,那么你想要更通用的东西,而不是我的回答是否定的。您可以构建自己的框架以使事物变得像个通用的一样:

var add = function(x,y):
    try {
         var sum = x + y;
         if ( s != undefined ) { return sum; }
         #otherwise
         sum = x.clone().add(y);
    } catch {
        #Otherwise threw something
        sum = x.add(y) #maybe another exception? nest try/catch.
    }
}

但是这需要做很多工作,因为你需要输入很多检查,因为JS可以肆无忌惮地添加东西。只是试图返回x+y通常是不确定的。在我的例子中,在简单添加之前测试添加函数可能会更好。

通过这种方式,您可以创建自己喜欢的idiom,如果您认为值得,可以将add用于所有内容(而不是我的示例中的+)。在编码时可能会增长它。

答案 1 :(得分:1)

  

在我失踪的js中是否有其他惯用的方法?

不是,不是;你基本上必须自己写一个表达式解析器,或者使用已经写过的解析器。

关于这一点的几点说明:

  1. 使用ES2015 +的template literals and tagged template functions这样做可能会更容易一些,因为它会为你做一些解析。例如,您可以给自己标记功能,让您写:

    if(!is_in_rect(threval`${camera.position} - ${forward} * ${THRESHOLD}`)))
    

    threval会在该模板中收到一组原始字符串,然后是camera.positionforwardTHRESHOLD的值。因此,您可以使用该信息来构建序列。但这不是一件轻而易举的事。

  2. 您可以自己编写一个Babel插件,让您的表达式成为一流的作品,然后进行转换。这样做的好处是Babel提供了强大的解析基础架构和工具支持。