使用“var”而不是“let”使用Object.assign()时获取未定义

时间:2018-01-18 07:39:57

标签: javascript

var name = {
  nameValue: 'John'
};
console.log(name.nameValue);  // undefined
var surname = {
  surnameValue: 'Doe'
};
Object.assign(name, surname);
console.log(name.surnameValue); // undefined

我在使用var时得到了不确定但是一切都很好用let和 我在jsbin.com上运行此代码

4 个答案:

答案 0 :(得分:5)

全局范围(在本例中为window)已具有属性name。您需要通过使用函数包装代码来创建新范围。或者使用块范围变量声明let

console.log(typeof name); // string

var name = {
  nameValue: 'John'
};
console.log(name.nameValue); // undefined
var surname = {
  surnameValue: 'Doe'
};
Object.assign(name, surname);
console.log(name.surnameValue); // undefined

function run() {
  var name = {
    nameValue: 'John'
  };
  console.log(name.nameValue); // John
  var surname = {
    surnameValue: 'Doe'
  };
  Object.assign(name, surname);
  console.log(name.surnameValue); // Doe
}

run();

答案 1 :(得分:0)

因为' name'在窗口中存在,您可以使用其他变量名称

var name0 = {
  nameValue: 'John'
};
console.log(name0.nameValue);

答案 2 :(得分:0)

(Window.)name是全局window对象的特定值,可用于(但非常罕见),用于设置表单和超链接目标。

name属性不是只读属性,但仅限于基本类型string。因此,您分配给window.name的任何值都将变为字符串。

这就是使用undefined时获得name.nameValue的原因。 name不是对象。

var name = { hello: "world!" };
console.log(name + ' - ' + name.hello); // "[object Object] - undefined"
var name = "Hello World!"
console.log(name); // "Hello World!";

答案 3 :(得分:-1)

您正在name对象的全局范围内设置变量window。在window对象中设置name的值时,其get方法将调用toString方法。

here

中所述
var name = {first:"Vignesh"};
console.log(name); //(1)
console.log(name.first); //(2)

(1)会将值[object Object]作为字符串而不是{first: "Vignesh"}

(2)描述了您正在访问字符串的未分配属性。即,[object Object].first变为undefined

您必须在if...else blockfunction block之类的其他范围内声明名称对象,以实现您的需求。