为什么 JavaScript/TypeScript 会将日期对象隐式转换为字符串?
我有一个包含 CSS 选择器的树状结构,我的目标是获取与选择器匹配的输入元素的值,并将它们放入树中。例如,如果有一个 id 为 textbox 的 <input type="text/>,值为 67,我想做到 {selector: "#textbox"} -> {value: 67}。
我已经在所有情况下使这个工作正常,除了当输入类型是日期的时候。在那种情况下,我想将字符串转换为日期对象。我的代码如下
val = sel.val();
let type = sel.attr("type");
if(type == "number")
{
val = Number(val);
}
else
if(type == "date")
{
val = Date(val);
}
//#1
ast["value"] = val;
//#2
delete ast.selector;
在点 #1,当输入类型是日期时,val 是一个 Date 对象。在点 #2,ast["value"]/ast.value 也是一个 Date 对象。然而,打印整个 ast 对象时显示 ast["value"]/ast.value 为一个字符串。这个字符串值在代码的其余部分传播并导致问题。这是来自控制台的一个引用,显示了这一点
Wed Jul 27 2016 10:14:19 GMT-0600 (MDT) eval.js:249 //ast["value"] at point #2
Object {selector: "this", value: "Wed Jul 27 2016 10:14:19 GMT-0600 (MDT)"} eval.js:250 //ast at point #2
如果日期没有被隐式转换,输出将会是
Wed Jul 27 2016 10:14:19 GMT-0600 (MDT) eval.js:249 //ast["value"] at point #2
Object {selector: "this", value: Wed Jul 27 2016 10:14:19 GMT-0600 (MDT)} eval.js:250 //ast at point #2
我已经在 Chrome 和 Firefox 中测试了这段代码,两者都得到了相同的结果。
答案#1
Date() 函数接受一个数字或字符串并生成一个字符串。请阅读文档:
JavaScript 日期对象只能通过将 JavaScript Date 作为构造函数来实例化:将其作为常规函数调用(即不使用 new 运算符)将返回一个字符串而不是 Date 对象;与其他 JavaScript 对象类型不同,JavaScript 日期对象没有字面量语法
你可能想使用 new Date(val) 而不是 Date(val),因为这实际上会生成一个 Date 对象。