我是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;
},
答案 0 :(得分:7)
让我们分解一下;
Object
;本机 JavaScript对象的参考。Object.prototype
;对所有 Object 。Object.prototype.toString
;所有对象的本地toString
方法。Function.prototype.call
;使用选定的this
因此Object.prototype.toString.call(currentFruit)
正在调用toString
上所有对象的原生currentFruit
。如果currentFruit.toString()
定义或继承了另一个toString
,则可能与currentFruit
不同。
Object.prototype.toString
返回[object X]
形式的 String ,其中X
是this
的类型,所以将[object Date]
与===
进行比较,询问“currentFruit
是日期?”
为什么这项检查比typeof
更有用?因为typeof
通常会返回"object"
,这通常不会有用。
instanceof
怎么样?如果您要检查的内容也会继承您正在测试的内容,那么这将是true
,例如,x instanceof Object
通常是true
,这也不总是有用。
您可以认为类似的另一种方法是测试 Object 的构造函数。 x.constructor === Date
。这有一组不同的问题,例如throw
错误,如果x
未定义或 null ,那么需要更多检查等等但它可以如果您正在使用非本机构造函数,那么toString
只会给[object Object]
。
所有这些都说明了,考虑到你正在使用的环境,你需要考虑这个测试是否真实。目前, Date 没有标准的 JSON 表示。
答案 1 :(得分:2)
Object.prototype.toString
用于获取javascript对象的内部[[Class]]值。在这里,它测试currentFruit
是否是本机Date
对象。
它很容易被currentFruit instanceof Date
取代(尽管存在细微差别)。