Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/415.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 为c++;程序员 背景_Javascript_New Operator - Fatal编程技术网

Javascript 为c++;程序员 背景

Javascript 为c++;程序员 背景,javascript,new-operator,Javascript,New Operator,我正在努力创建一个从JSON获取毫秒时间戳的函数,并将其转换为人类可读的格式。我尝试了警报(Date(jsonData.timestamp).toISOString()),结果是“Date(…).toISOString不是函数” 但在我查找的时间格式示例中,很快我注意到要使用的模式是let myDate=new Date(…);警报(myDate.toISOString())。我试过了,但得到了一个无效的日期。因此,出于某种原因,Date()和newdate()对参数的解释不同 我想也许我从JS

我正在努力创建一个从JSON获取毫秒时间戳的函数,并将其转换为人类可读的格式。我尝试了
警报(Date(jsonData.timestamp).toISOString())
,结果是“Date(…).toISOString不是函数”

但在我查找的时间格式示例中,很快我注意到要使用的模式是
let myDate=new Date(…);警报(myDate.toISOString())
。我试过了,但得到了一个无效的日期。因此,出于某种原因,
Date()
newdate()
对参数的解释不同

我想也许我从JSON获得的值(一个字符串)应该作为一个数字传入,当我这样做时,我会得到两个不同的日期:

new Date(1594720804236643));    // result differs from thjsut calling Date, without new
new Date("1594720804236643")); //does not work
我想,surly copy Construction会起作用,结果是:

let myDate=Date(jsonData.timestamp);
let myDateObject=new Date(myDate);
alert(myDateObject.toISOString());
虽然我有一个(可怕、丑陋的)解决方案,但我想了解
new

实际问题
< > >代码> MyCype()/<代码>和<代码>新MyCype()/Cuth>,C++编程背景表明,差异是唯一的,对象是否被分配在堆栈或堆上。在Javascript中,规则显然是不同的。一方面,参数的解释会发生变化,另一方面,结果对象上可用的函数集是不同的。

以下是构造函数的一种常见模式,出于自身的设计原因,无论是否使用
new
调用,构造函数都希望以相同的方式运行:

function NewIsOptional() {
  if (this == null || !(this instanceof NewIsOptional))
    return new NewIsOptional();
  // normal constructor work
}
通过检查
,该技巧可以发挥作用。如果它没有绑定(就像缺少
new
一样),或者它绑定到了错误的类型,那么代码会通过
new
进行递归调用。通过构造函数将看到
这个
正确地绑定到一个新对象,因此它将继续执行它的正常操作

现在,并不是所有的构造函数都这样做。我不确定我是否写过一个,我输入了很多代码。如果未通过
new
调用某些构造函数,则会引发异常。一些,例如符号“constructor”,如果使用
new
调用,则会引发异常。有些构造函数(如Date或Boolean)在未使用
new
调用时会执行完全不同的操作

基本上没有规则。构造函数是一个函数,构造函数中的代码可以做它想做的任何事情。它可以检查参数值并决定不同的行为或决定抛出错误。它可以调用其他函数,如果它是在一个函数中创建的,则可以操纵它的闭包,当然还可以执行初始化对象属性之类的普通操作(这是最常见的操作)


另外,请注意,一个特定的构造函数如何解释其参数,以及它在通过
new
调用或未调用时的行为是完全正交的。这方面也没有规定。构造函数可以自由地解释与
new
完全相同的参数,也可以完全不同地解释它们。所有这些都没有基本的语言规则。

我觉得这是一个好的开始,但我仍然不清楚为什么传入的参数被区别对待。需要ISO8601格式的字符串因为参数不是类型化的,所以可以将任何需要的内容传递给任何函数。它可能不起作用,但这是函数在运行时的问题。日期构造函数自己响应实际参数类型。此外,用于构造日期的数字给出了52504年9月的日期实例。类似地,构造函数函数可以通过显式检查
this
的值来判断是否已使用
new
调用它们。一些构造函数检测到它们没有被
new
调用,并通过自己这样做来响应,而其他构造函数则没有。JavaScript是一个与C++完全不同的语言;最好不要尝试C++推理来进行JavaScript编码。我想这对我很有帮助。如果我正确理解
new X()
将创建一个实例绑定
this
,然后在其上执行函数
X
,而如果我想将Javascript投影到经典的面向对象编程中(我现在理解这是一个坏主意),我可以将普通的
X()
看作是一个静态方法调用.什么时候应该使用新的,什么时候最好省略它,是否有一个一般的经验法则,或者没有常识,需要检查每个想使用的类?这是一个好问题。有些人对此的看法比我认为的要强烈得多。就我个人而言,我喜欢使用
new
,因为我认为它增加了清晰度。很多Java用户不喜欢它,原因我不太明白。而且,与我所熟悉的大多数其他语言相比,JavaScript世界发展得非常快。态度随着语言的变化而变化。