我需要一些 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
,例如 0
、NaN
、空字符串、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/