首页 > 解决方案 > hasOwnProperty(propName) 与 hasOwnProperty("propName")

问题描述

我已经完成了Record Collection的挑战,并有一个可行的解决方案。

我们何时以及为什么在for 中添加引号(""'')?你什么时候用or ?propNamehasOwnProperty(propName)hasOwnProperty(propName)hasOwnProperty("propName")

这是我的功能解决方案:

function updateRecords(id, prop, value) {
 if (prop != "tracks" && value != "") {
   collection[id][prop] = value;
 }
else if (prop === "tracks" && collection[id].hasOwnProperty("tracks") === false) {
 collection[id].tracks = [];
 collection[id].tracks.push(value);
}

 else if (prop ==="tracks" && value != ""){
   collection[id].tracks.push(value);
 }
else if (value === "") {
   delete collection[id][prop];
 }
  return collection;
}

但如果hasOwnProperty("tracks")更改为hasOwnProperty(tracks)代码将停止工作。这让我感到困惑,因为我展示的唯一示例hasOwnProperty(propName)没有使用引号,并且如果在propName.

我从中了解到hasOwnProperty()Testing object for Properties

标签: javascript

解决方案


在大多数情况下,您希望使用字符串来检查该属性是否存在于对象上。在不使用引号的情况下,这意味着它必须是一个变量,该变量保存与属性名称相对应的字符串的值 - 它与以与属性相同的方式命名的变量无关。例如,您可能会看到一些类似这样的代码,它们在其中迭代属性并检查属性是否属于对象(示例取自 docs on Object.prototype.hasOwnProperty):

var buz = {
  fog: 'stack'
};

for (var name in buz) {
  if (buz.hasOwnProperty(name)) { // here, name holds the value of the property
    console.log('this is fog (' + 
      name + ') for sure. Value: ' + buz[name]);
  }
  else {
    console.log(name); // toString or something else
  }
}

正如@Gavin 提到的,显示的示例只是试图告诉您可以将属性名称作为字符串传递,而不是propname


推荐阅读