属性检测:使用'in'与尝试访问属性

时间:2016-01-05 07:00:55

标签: javascript

不得不提:我知道一点JavaScript,但我不是很深入。

始终将此视为检查对象上属性是否可用的正确方法:

if (window.console) {
  // doSomething
}

昨天我见过使用这种技术的代码:

if ('console' in window) {
  // doSomething
}

这两种技术是否相同?或者它们有区别吗?

4 个答案:

答案 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的另一侧,中的将确保属性作为窗口对象的自身属性存在,而不是从父级继承。