当前位置: 首页 > 面试题库 >

重载JavaScript中的算术运算符?

万知
2023-03-14
问题内容

给定以下JavaScript“类”定义,这是我想到此问题的最佳方式:

var Quota = function(hours, minutes, seconds){
    if (arguments.length === 3) {
        this.hours = hours;
        this.minutes = minutes;
        this.seconds = seconds;

        this.totalMilliseconds = Math.floor((hours * 3600000)) + Math.floor((minutes * 60000)) + Math.floor((seconds * 1000));
    }
    else if (arguments.length === 1) {
        this.totalMilliseconds = hours;

        this.hours = Math.floor(this.totalMilliseconds / 3600000);
        this.minutes = Math.floor((this.totalMilliseconds % 3600000) / 60000);
        this.seconds = Math.floor(((this.totalMilliseconds % 3600000) % 60000) / 1000);
    }

    this.padL = function(val){
        return (val.toString().length === 1) ? "0" + val : val;
    };

    this.toString = function(){
        return this.padL(this.hours) + ":" + this.padL(this.minutes) + ":" + this.padL(this.seconds);
    };

    this.valueOf = function(){
        return this.totalMilliseconds;
    };
};

以及以下测试设置代码:

var q1 = new Quota(23, 58, 50);
var q2 = new Quota(0, 1, 0);
var q3 = new Quota(0, 0, 10);

console.log("Quota 01 is " + q1.toString());    // Prints "Quota 01 is 23:58:50"
console.log("Quota 02 is " + q2.toString());    // Prints "Quota 02 is 00:01:00"
console.log("Quota 03 is " + q3.toString());    // Prints "Quota 03 is 00:00:10"

有什么方法可以使用加法运算符隐式创建q4Quota对象,如下所示…

var q4 = q1 + q2 + q3;
console.log("Quota 04 is " + q4.toString());    // Prints "Quota 04 is 86400000"

而不是求助于…

var q4 = new Quota(q1 + q2 + q3);
console.log("Quota 04 is " + q4.toString());    // Prints "Quota 04 is 24:00:00"

如果不是,那么在此领域中关于通过算术运算符使自定义数字JavaScript对象可组合的最佳实践建议是什么?


问题答案:

据我所知,JavaScript(至少现在已经存在)不支持运算符重载。

我能建议的最好的方法是使用一个类方法从其他几个对象中创建新的配额对象。这是我的意思的简单示例:

// define an example "class"
var NumClass = function(value){
    this.value = value;
}
NumClass.prototype.toInteger = function(){
    return this.value;
}

// Add a static method that creates a new object from several others
NumClass.createFromObjects = function(){
    var newValue = 0;
    for (var i=0; i<arguments.length; i++){
        newValue += arguments[i].toInteger();
    }
    return new this(newValue)
}

并像这样使用它:

var n1 = new NumClass(1);
var n2 = new NumClass(2);
var n3 = new NumClass(3);

var combined = NumClass.createFromObjects(n1, n2, n3);


 类似资料:
  • 问题内容: 我已经使用JavaScript了几天,现在我想为定义的对象重载运算符。 在Google搜索了一段时间后,您似乎无法正式执行此操作,但是仍有一些人声称采取了一些漫长的方法来执行此操作。 基本上,我制作了Vector2类,并希望能够执行以下操作: 相反,我必须这样做: 我可以采用什么方法在Vector2类中重载运算符?因为这看起来很丑陋。 问题答案: 如您所见,JavaScript不支持运

  • 运算符是处理数据的基本方法,用来从现有的值得到新的值。JavaScript 提供了多种运算符,覆盖了所有主要的运算。 概述 JavaScript 共提供10个算术运算符,用来完成基本的算术运算。 加法运算符:x + y 减法运算符: x - y 乘法运算符: x * y 除法运算符:x / y 指数运算符:x ** y 余数运算符:x % y 自增运算符:++x 或者 x++ 自减运算符:--x

  • 问题内容: 是否可以在Python中重载运算符?如果是这样,可以定义新的运算符,例如和吗? 问题答案: 正如其他答案所提到的,您确实可以重载运算符(通过在正在编写的类中定义特殊方法,即名称以两个下划线开头和结尾的方法)。所有的细节都在这里。 要完成对您问题的回答:您不能定义新的运算符;但是它不是一个新的运算符,它是一个现有的运算符,并且通过在类中定义method来使其过载。 作为历史记录,这在C

  • 问题内容: 请告诉我Java是否可以重载运算符?如果可以在Java中的任何地方使用它,请告诉我。 问题答案: 不,Java不支持用户定义的运算符重载。Java唯一接近“自定义”运算符重载的方面是对字符串+的处理,这将导致常量的编译时串联或使用StringBuilder / StringBuffer的执行时串联。但是,您无法定义自己的操作符,它们的操作方式相同。 对于确实支持运算符重载的类Java(

  • 问题内容: 我似乎找不到在JavaScript中重载[]运算符的方法。外面有人知道吗? 我在想… 还是我没有看正确的东西。 问题答案: 您可以使用ES6代理(在所有现代浏览器中都可用)进行此操作

  • Rust可以让我们对某些运算符进行重载,这其中大部分的重载都是对std::ops下的trait进行重载而实现的。 重载加法 我们现在来实现一个只支持加法的阉割版复数: use std::ops::Add; #[derive(Debug)] struct Complex { a: f64, b: f64, } impl Add for Complex { type Outpu