不得不提:我知道一点JavaScript,但我不是很深入。
始终将此视为检查对象上属性是否可用的正确方法:
if (window.console) {
// doSomething
}
昨天我见过使用这种技术的代码:
if ('console' in window) {
// doSomething
}
这两种技术是否相同?或者它们有区别吗?
答案 0 :(得分:4)
不。他们有区别。
首先检查if
的值是否为Truthy,window.console
中是否存在console
属性的第二个检查。
我们假设您创建了一个这样的变量。
window
现在,window.myName = "";
将无法满足条件,因为JavaScript中的空字符串是Falsy。
if (window.MyName)
但是console.log(Boolean(window.myName)); // false
会满足条件,因为if ("myName" in window)
是myName
对象的属性。
window
注意: console.log(Boolean("myName" in window)); // true
运算符将返回in
,即使正在测试的属性位于原型层次结构中的某个位置。例如,
true
它返回console.log("toString" in {}); // true
,因为对象true
继承了方法{}
。
如果你想确保该对象本身存在该属性,那么你应该使用Object.prototype.hasOwnProperty
,就像这样
toString
答案 1 :(得分:4)
没有。他们有区别。
使用in
运算符时,检查是否在给定对象中指定了属性,而不是它的值。例如:
var obj = { foo: undefined }
obj.foo !== undefined; // false
'foo' in obj; // true
希望它有助于
答案 2 :(得分:1)
在你的情况下,它是等同的。当您在运算符中使用时,它会在对象中看到该属性存在。当你使用 if(window.console)时,它看起来window.console是一个真值。
答案 3 :(得分:1)
当您说window.console
时,它会检查console
对象中的属性window
。我不认为天气console
属性是窗口对象的属性,或者它是继承自父母。
在console in window
的另一侧,中的将确保属性作为窗口对象的自身属性存在,而不是从父级继承。