我需要在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,
谢谢
在您的示例中,检查:
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)
| 归档时间: |
|
| 查看次数: |
6012 次 |
| 最近记录: |