javascript - 使用像 java Map 这样的 javascript 对象?

标签 javascript

我需要一些 javascript 中的 HashMap。我们可以这样做吗:

var map = {};
map['foo'] = true;
map['zoo'] = true;
...

if (map['foo']) {
    // yes, foo exists.
}
else {
    // no, foo does not exist.
}

如果属性不存在,我们如何正确地检查属性是否存在而不插入它?例如,如果我没有明确添加它,我不希望在上述检查后 map.foo 存在,

谢谢

最佳答案

在您的示例中,检查:

if (map['foo']) {
  //..
}

不仅检查属性是否未在对象上定义,if 语句的条件表达式也会评估为 false 如果属性持有强制转换的值在 bool 上下文(也称为假值)上为 false,例如 0NaN、空字符串、null , undefined 当然还有 false, 例如:

var map = {
  'foo': 0 // or any other falsy value
}; 

if (map['foo']) {
  // foo is truthy...
} else {
  // foo is falsy or not defined
}

要检查一个对象是否存在一个属性,不管它的值是什么——可以是falsy,甚至是undefined——,你可以使用hasOwnProperty方法,例如:

var map = {};
map['foo'] = 0;

if (map.hasOwnProperty('foo')) {
  // foo exist physically on the object...
}

此方法的唯一问题是,如果有人将名为 hasOwnProperty 的属性添加到一个对象,它将不起作用,例如:

var obj = {
    hasOwnProperty: 'bar'
};

如果你执行 obj.hasOwnProperty('prop'),它会给你一个 TypeError,因为对象包含一个字符串属性,它隐藏了方法 - 调用字符串会导致错误-。

解决方法是直接从 Object.prototype 对象调用 hasOwnProperty 方法,例如:

if (Object.prototype.hasOwnProperty.call(obj, 'prop')) {
  //..
}

您还可以使用 in operator :

if ('prop' in obj) {
  //...
}

与第一种方法的区别是 in 运算符还检查继承的属性,例如:

var obj = {};
obj.hasOwnProperty('toString'); // false
'toString' in obj; // true, inherited from Object.prototype.toString

另见:

编辑:

扩展我对@slebetman 评论的回应,关于检查if (map.foo !== undefined)

正如我评论的那样,对于访问 undefined 全局属性以及检查 属性值语义差异 存在一些顾虑. 属性(property)存在

undefined 全局属性未定义为只读 ECMAScript 第三版标准,(现在在 ES5 上为 writable = false :)

在几乎所有的实现中,它的值都可以被替换。

如果有人做:

window.undefined = 'foo';

// It will break your code:
var obj = {};
if (obj.foo !== undefined) {
  alert("This shouldn't ever happen!");
}

还有语义上的差异:通过测试 map.foo !== undefined 我们在技术上不仅仅是检查对象上是否存在属性,属性可以存在,将 undefined 保持为值,例如:

var map = {
  'foo': undefined
};

map.hasOwnProperty('foo'); // true, because the property exists although
                           //       it holds the undefined value
map.foo !== undefined;     // false

关于javascript - 使用像 java Map 这样的 javascript 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3664705/

相关文章:

javascript - 用 enzyme 测试 React Component className

javascript - 在网站上查找动画代码

javascript - chrome.storage.local ["mykey"] 未定义

javascript - 可以将 CSS 背景图像列为 HTML 图像标记的脚本?

javascript - 按下按钮即可更改图像

javascript - 使用ajax检查网站的响应时间

javascript - 方法链接会在堆栈中创建中间变量吗?

javascript - 执行前检查宽度

javascript - 仅使用 JavaScript 将数据保存到本地文件

javascript - 层叠两个 HTML 组件