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

use*_*114 1 javascript

我需要在javascript中使用HashMap.我们可以这样做:

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

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

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

谢谢

CMS*_*CMS 9

在您的示例中,检查:

if (map['foo']) {
  //..
}
Run Code Online (Sandbox Code Playgroud)

不仅检查是否属性没有在对象上所定义的,条件表达式if语句将评估为false还如果该属性包含强制转换到一个值false上布尔上下文(又名falsy值),例如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
}
Run Code Online (Sandbox Code Playgroud)

要检查对象上是否存在属性,无论其值是什么undefined - 甚至可以是假的 - ,您可以使用该hasOwnProperty方法,例如:

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

if (map.hasOwnProperty('foo')) {
  // foo exist physically on the object...
}
Run Code Online (Sandbox Code Playgroud)

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

var obj = {
    hasOwnProperty: 'bar'
};
Run Code Online (Sandbox Code Playgroud)

如果执行obj.hasOwnProperty('prop'),它会给你一个TypeError,因为该对象包含一个阴影方法的字符串属性-invoking字符串会导致错误 - .

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

if (Object.prototype.hasOwnProperty.call(obj, 'prop')) {
  //..
}
Run Code Online (Sandbox Code Playgroud)

您也可以使用in运营商:

if ('prop' in obj) {
  //...
}
Run Code Online (Sandbox Code Playgroud)

与第一种方法的不同之处在于in操作员还检查继承的属性,例如:

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

也可以看看:

编辑:

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

在我评论时,有一些关于访问undefined全局属性的问题以及检查属性值属性存在之间的语义差异.

undefined全局属性没有被定义为只读的ECMAScript第三版标准,(现在是writable = false在ES5 :)

在几乎所有实现中,其值都可以被替换.

如果有人做:

window.undefined = 'foo';

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

还有语义差异:通过测试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
Run Code Online (Sandbox Code Playgroud)