1

我是 javascript 的新手。在下面的模板和 JS 函数中,我试图显示 person1 名称和 person2 名称并显示它们是否相等。

<!DOCTYPE html>
<html>
<head>
<script>
function Person(name, age, job){
    this.name = name;
    this.age = age;
    this.job = job;
    this.sayName = function(){
        alert("in function" + this.name);
    };
}
var person1 = new Person("Nicholas", 29, "Software Engineer");
var person2 = new Person("Greg", 27, "Doctor");
alert(person1.sayName());
alert(person2.sayName());
alert(person1.sayName() == person2.sayName() );
</script>
</head>
<body>
<div>

</div>
</body>
</html> 

但我一一收到这些警报。

in functionNicholas

undefined

in functionGreg

undefined

in functionNicholas

in functionGreg

true

请帮助我控制流程。如果这个问题太愚蠢和基本,请原谅我。谢谢

我不知道为什么我会收到两次未定义的警报。

4

6 回答 6

4

它发出警报undefined是因为alert它不返回任何东西,或者更确切地说是您的函数,即person1.sayName()不返回任何东西,它只是发出警报。

根据您的命名约定sayName是正确的,因为它通过 alerting、printing、display 或类似方式完成其工作,但不必返回任何内容,它只是不返回任何内容。因此person1.sayName() == person2.sayName()是真的,因为undefined == undefined.

于 2013-09-29T05:57:48.657 回答
2

当你这样做时:

alert(person1.sayName());

会发生以下情况:

  1. 它调用person1.sayName().
  2. 这会调用alert('in function' + this.name);,从而引起in functionNicholas警报。
  3. sayName函数返回。由于没有return somevalue语句,它返回undefined.
  4. 您现在alert使用返回的值进行调用,所以它就像alert(undefined),这​​就是您看到undefined警报的原因。

当你这样做时:

alert(person1.sayName() == person2.sayName());

它调用每个人的sayName方法,提醒他们的名字。他们每个 return undefined,所以你这样做:

alert (undefined == undefined);

由于它们是平等的,这会提醒true.

于 2013-09-29T06:05:54.940 回答
1

你应该使用:

    function Person(name, age, job){
    this.name = name;
    this.age = age;
    this.job = job;
    this.sayName = function(){
        alert("in function" + this.name);
    };
}
var person1 = new Person("Nicholas", 29, "Software Engineer");
var person2 = new Person("Greg", 27, "Doctor");
person1.sayName();
person2.sayName();
于 2013-09-29T06:01:38.237 回答
0

sayName()函数不返回任何值,默认返回值是未定义的,所以你实际上在做的是将一个未定义与另一个未定义进行比较

var x = person1.sayName()

// x is undefined

您可以更改sayName()以在警报后返回当前名称:

this.sayName = function(){
    alert("in function" + this.name);
    return this.name;
};
于 2013-09-29T06:04:31.553 回答
0

每次运行 sayName() 函数时,都会在函数中创建警报,然后返回 undefined。在 JavaScript 中总是返回一些东西,如果没有指定,那么它是未定义的。

您首先为 Nicholas 打印 sayName,它会提醒他的名字,然后返回 undefined。然后您提醒返回的值(未定义)。

对格雷格重复。

最后一行比较两者,首先警告他们的名字,然后比较两个返回的函数(换句话说,未定义 == 未定义,它是 TRUE)。然后会提醒 True。

于 2013-09-29T06:06:13.730 回答
0

其他答案都是正确的。另外,为了比较,在您上次的警报中,我想您想检查这些人的姓名是否相同。

警报(person1.name === person2.name);

为此,您可以name使用上面的“点语法”访问每个对象的属性。(===三等号)运算符是该语言中用于比较的最佳运算符。您应该更喜欢它而不是标准 [unreliable] ==

于 2013-09-29T06:06:50.787 回答