我正在尝试使用动态名称访问对象的属性.这可能吗?
const something = { bar: "Foobar!" };
const foo = 'bar';
something.foo; // The idea is to access something.bar, getting "Foobar!"
Run Code Online (Sandbox Code Playgroud) 如果我有一个如下所示的javascript对象
var columns = {
left: true,
center : false,
right : false
}
Run Code Online (Sandbox Code Playgroud)
我有一个传递对象的函数,以及一个像这样的属性名称
//should return false
var side = read_prop(columns, 'right');
Run Code Online (Sandbox Code Playgroud)
身体read_prop(object, property)会是什么样的?
我遇到过这段代码
function printStackTrace(options) {
options = options || {guess: true};
var ex = options.e || null, guess = !!options.guess;
var p = new printStackTrace.implementation(), result = p.run(ex);
return (guess) ? p.guessAnonymousFunctions(result) : result;
}
Run Code Online (Sandbox Code Playgroud)
并不禁想知道为什么双重否定?是否有另一种方法可以达到同样的效果?
(代码来自https://github.com/eriwen/javascript-stacktrace/blob/master/stacktrace.js)
我已经看到了两种检测UA是否实现特定JS属性的方法:if(object.property)和if('property' in object).
我想听听哪些更好,更重要的是为什么的意见.一个明显优于另一个吗?是否有不仅仅是这两种方法来进行对象属性检测?请涵盖浏览器支持,陷阱,执行速度等,而不是美学.
编辑: 鼓励读者在jsperf.com/object-detection上运行测试
这看起来很奇怪.
这是我在IE8控制台中的实验:
typeof obj1 // "object"
obj1.hasOwnProperty // {...}
typeof obj2 // "object"
obj2.hasOwnProperty // undefined
Run Code Online (Sandbox Code Playgroud)
关于什么可能导致这个问题的任何想法?
javascript internet-explorer-8 ie-developer-tools hasownproperty
所以在SO上有一些问题可以解答如何检查对象上的属性是否存在.示例答案是使用Object.prototype.hasOwnProperty().
但是,如何检查可能未定义的对象的属性?
如果要尝试直接检查未定义对象上是否存在属性,那么它将是一个引用错误.
在语义上,直接检查代码似乎更好if (obj.prop) //dosomething- 它显示更清晰的意图.有没有办法实现这个目标?优选地,是否有内置的Javascript方法来执行此类操作或按照惯例?
Motive:一个包添加了属性user.session.email - 但我正在检查是否存在电子邮件,而不是会话,尽管会话可能不存在.
更新:许多答案都说使用&&运算符进行短路.我知道这是一个可能的解决方案,但它并不完全是所期望的,因为我们似乎正在使用JS对象语法 - 也就是说,虽然你想真正检查一个对象的属性,你被迫检查对象是否存在以便这样做.
注意标记为已关闭为什么标记为已关闭?假设这是重复的链接可能不会产生相同的答案.我们正在寻找一种更好的,更具语义性的解决方案,并且标记这种封闭使得"嵌套"==="可能未定义"的假设.
这个问题是有争议的: 因为我现在无法回答我自己的问题.截至最近,这里提出了一项提案,可以解决这个问题.同样,问题需要一个更具语义性的解决方案,如提案中所示.
根据这个答案,我知道我可以使用in运算符检查属性是否存在.所以我在很多代码中看到它常用,例如:
if ("gapi" in window) {
gapi.login(...);
}
Run Code Online (Sandbox Code Playgroud)
但这样做会不会更好?
if (window.gapi) {
gapi.login(...);
}
Run Code Online (Sandbox Code Playgroud)
我所知道的唯一的区别是,如果变量存在,但它的价值是第二个将返回false undefined,false,0,null计算结果为假或其他价值; 并且第一个将返回true,对吗?
那么,还有其他区别吗?我应该使用哪一个?