我已经在谷歌上搜索了很长一段时间,例如“typeof”和“performance”,但我无法找到以下问题的令人满意的答案。
我正在尝试使用本地运算符重载为Transcrypt Python to JavaScript 编译器实现复数。由于我们处理的是动态类型语言,因此无法预测变量中的数据类型。
如果我翻译x + y
成 JavaScript,打开运算符重载,它将翻译为例如__add__ (x, y)
为了做正确的事情,该__add__
函数必须检查两者x
以及y
它们是否是“普通”JavaScript 数字,或者它们中的一个或两个属于“复杂”类型,因为这需要特殊操作。
最明显的方法是测试typeof x == 'number'
. 但是,来自 C/C++ 背景,使用具有六个字符的字符串测试相等性似乎非常低效,首先必须从内存中检索,只能添加两个整数,对于许多处理器来说,一次解析,将只有一条指令。
最让我惊讶的是,像这样的检查在互联网上随处可见,这是正常的做法。有谁知道是否x == 'number'
或可能x === 'number'
以某种方式巧妙地优化以防止完整的字符串比较。
为了进一步澄清问题,这是我当前的__add__
操作员代码,使用字符串比较。
def __add__ (self, other):
if __typeof__ (other) == 'number': # Translates to: if (typeof other == 'number') {
return complex (self.real + other, self.imag)
else: # Other is complex
return complex (self.real + other.real, self.imag + other.imag)
如果没有,任何人都可以提示我更快地区分数字和任意非数字对象。
感谢您的提示。现在的来源是:
def __sub__ (self, other):
if __typeof__ (other, 'number'):
return complex (self.real - other, self.imag)
else:
return complex (self.real - other.real, self.imag - other.imag)
被某某人翻译:
elif node.func.id == '__typeof__':
self.emit ('typeof ')
self.visit (node.args [0])
self.emit (' === ') # Give JavaScript string interning a chance to avoid char by char comparison
self.visit (node.args [1])
return
到:
get __add__ () {return __get__ (this, function (self, other) {
if (typeof other === 'number') {
return complex (self.real + other, self.imag);
}
else {
return complex (self.real + other.real, self.imag + other.imag);
}
});},