Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么Date返回的是日期而不是对象';什么时候被引用?_Javascript_Date_Object_Types - Fatal编程技术网

Javascript 为什么Date返回的是日期而不是对象';什么时候被引用?

Javascript 为什么Date返回的是日期而不是对象';什么时候被引用?,javascript,date,object,types,Javascript,Date,Object,Types,这不是什么大问题,但它属于wat,所以我非常好奇 如果您在JS中创建一个新日期,然后引用它,那么它将返回看起来像日期值的内容,而不是像其他对象一样返回它的属性描述(即:Date{Date:“some Date”})。它看起来像是一个值,而不是一个对象,但它确实是一个对象。Chrome的inspector还帮助指出了文本颜色的变化,以及它周围缺少”,因为它不是字符串 即: let date=新日期() 让人={ 名字:“迈克” } console.log(person)/{name:“mike”

这不是什么大问题,但它属于wat,所以我非常好奇

如果您在JS中创建一个新日期,然后引用它,那么它将返回看起来像日期值的内容,而不是像其他对象一样返回它的属性描述(即:
Date{Date:“some Date”}
)。它看起来像是一个值,而不是一个对象,但它确实是一个对象。Chrome的inspector还帮助指出了文本颜色的变化,以及它周围缺少
,因为它不是字符串

即:

let date=新日期()
让人={
名字:“迈克”
}

console.log(person)/{name:“mike”}或:person{name:“mike”}看起来,数据的dafault表示形式并没有打印您想要的内容,有一个默认表示方法与您想要的不匹配,如果您需要日期的替代表示形式,您可以编写类似于本例的代码

然后你做一些变通

function formatDate(date) {
                  //Checking if test attribute exist, in case it does
                  //I print it
   return date + (typeof date.test === 'undefined')?'':date.test;
}
date = new Date();
date.test = 'testing'
console.log(formatDate(date));

详细阐述一下Satpal的评论:

JavaScript有一个带有一些特定规则的
类型强制
系统。你可以读到他们

其中一个规则是对象通过其
valueOf
方法强制数字(如果存在)。如果将对象强制为字符串,则调用其
toString
方法;如果存在,则调用其
valueOf
方法,并将结果从数字强制为字符串。如果这两种方法都不存在,则对象强制为一个字符串
“[object object]”

Console.log和字符串插值需要字符串,因此日期对象被强制为字符串。注意
date.\uuuu proto\uuuu.toString
方法

现在说到构造函数:JavaScript中的所有内容都是对象,包括函数。因此构造函数的
Date()
函数和它通过
new Date()
返回的对象都是对象。此外,
\uuuuuuu proto\uuuu.constructor
属性实际上是指构造函数,它的
prototype
属性被用作给定对象的
\uuuuuuu


为了进一步澄清问题,您应该阅读JavaScript的函数继承,如前所述。

ToString()方法在字符串插值中用作默认方法。这里发生了类似的事情吗?是的,谢谢,这有助于证实我对字符串插值的想法,但为什么对象的引用不像在其他对象上那样显示?这取决于控制台的实现(对于控制台,规范无法控制)。在FF上,您将看到日期为2018的可扩展树。。。。您的
test
属性也将在那里。在StackSnippet的控制台上,他们调用
JSON.stringify
(如果不是元素的话)来记录(Chrome)控制台显示日期对象的方式与它们在程序中的行为无关。一切都很好,就像你说的,它是一个物体,它有属性。未能在控制台上显示属性是控制台的问题,而不是日期对象的问题。(也就是说,您可能不应该向日期对象添加自定义属性)@MichaelTreat,但它仍然依赖于控制台实现。。。Ok Chrome不是唯一一个为日期对象调用类似toString()的浏览器,但这仍然只是他们的调用。例如,我们可以对元素说同样的话。在Chrome中,它们的外层TML被打印出来,而它们是对象。这只是开发工具开发人员所做的一个选择问题。不想格式化日期。只是想知道为什么当你引用对象时,它返回的是日期,而不是像其他对象那样返回整个对象的描述。这是因为它带有默认表示形式,日期总是令人头痛,格式化程序是标准的,除非你决定将日期封装在对象中作为一个atribute,这被称为polimorfism。
function formatDate(date) {
                  //Checking if test attribute exist, in case it does
                  //I print it
   return date + (typeof date.test === 'undefined')?'':date.test;
}
date = new Date();
date.test = 'testing'
console.log(formatDate(date));