【问题标题】:Object.prototype.toString.call(currentFruit) === "[object Date]"Object.prototype.toString.call(currentFruit) === "[object Date]"
【发布时间】:2025-12-26 21:50:06
【问题描述】:

我是 js 新手.. 我有一个 if 条件,因为我不明白 if 条件 如果条件确实如此,你能告诉我这是怎么回事吗? Object.prototype.toString.call(currentFruit) === "[object Date]" 你能解释一下吗... 在下面提供我的代码

setcurrentFruit: function (fruitName, currentFruit) {
    WorklistStorage.set(fruitName, currentFruit, false);
},
getcurrentFruit: function (fruitName) {
    var currentFruit = unescapeJSON(WorklistStorage.get(fruitName, false));
    if (currentFruit == "undefined" || typeof currentFruit == "undefined" || Object.prototype.toString.call(currentFruit) === "[object Date]") {
        var date = new Date();
        currentFruit = date.toString();
        wholeQueue.setcurrentFruit(fruitName, currentFruit);
        //console.log("poppppp");
    }
    currentFruit = new Date(currentFruit);
    return currentFruit;
},

【问题讨论】:

    标签: javascript jquery html css javascript-events


    【解决方案1】:

    让我们分解一下;

    所以Object.prototype.toString.call(currentFruit) 正在调用currentFruit 上所有对象 的本机toString。如果在currentFruit 上定义或继承了另一个toString,这可能与currentFruit.toString() 不同。

    Object.prototype.toString 返回一个[object X] 形式的String,其中Xthis类型,因此将[object Date] 与@987654345 进行比较@ 正在询问currentFruit 是一个日期吗?”

    为什么做这个检查比typeof 更有用?因为typeof 通常只会返回"object",这通常没有帮助。

    instanceof 呢?如果您要检查的东西也继承自您要测试的东西,那么这将是 true,例如,x instanceof Object 通常是 true,这也并不总是有帮助。

    您可以认为类似的另一种方法是测试 Objectconstructorx.constructor === Date。这有一组不同的问题,例如 throwing 错误,如果 xundefinednull 所以需要更多检查等,但如果您正在使用非本地构造函数,toString 将简单地给出[object Object]


    综上所述,您需要考虑考虑到您所使用的环境,该测试是否会成立。目前没有日期的标准JSON表示。

    【讨论】:

      【解决方案2】:

      Object.prototype.toString 用于获取 javascript 对象的内部 [[Class]] 值。在这里,它测试currentFruit 是否是一个原生的Date 对象。

      它可以很容易地被currentFruit instanceof Date 替换(尽管有细微的差别)。

      【讨论】:

      • 因为 currentFruit 被解析为 JSON 你无法检查 instanceof: *.com/questions/4511705/… 似乎 Date 在 JSON 中不存在 JSON.parse(JSON.stringify(new Date())) instanceof Date===false
      • @HMR:我也曾预料到测试几乎没有意义,但请注意 OP 正在执行 unescapeJSON(可能有一些魔法)而不是 JSON.parse