请检查以下代码
var global_var = 1;
hello = 'hello';
global_novar = 2;
(function () {
global_fromfunc = 3;
}());
var global = Object.getOwnPropertyNames(window);
console.log(global_var in global);
console.log(global_novar in global);
console.log(global_fromfunc in global);
console.log(hello in global);

这里只有最后一个语句在控制台上打印为false。如果我将任何整数值分配给hello,则它将打印为true。任何人都可以解释这种行为
答案 0 :(得分:2)
Object.getOwnPropertyNames
返回一个属性名称数组。 in
运算符正在查询数组的索引,而不是它的string
。请注意,如果我将hello
设为足够大,则会返回false
。
var global_var = 1;
hello = 270000000;
global_novar = 2;
(function () {
global_fromfunc = 3;
}());
var global = Object.getOwnPropertyNames(window);
console.log(global_var in global);
console.log(global_novar in global);
console.log(global_fromfunc in global);
console.log(hello in global);

另请注意,in
与数组包含的内容不同。
答案 1 :(得分:0)
如果指定的属性位于指定的对象中,则JavaScript中的in
运算符返回true。
如果您在数组上使用in
运算符,就像上面所做的那样,数组的索引将作为其属性,因此如果数组,您的语句将返回true包含给定的索引。这解释了为什么当你给它一个整数时,它返回true(只要数组包含那个索引),但是任何字符串都将返回false。
要获得您正在寻找的结果,您可以使用ECMAScript 7中引入的Array.prototype.includes
(适用于支持它的浏览器),或者参考this question了解更多如何检查给定对象包含在数组中。
var global_var = 1;
hello = 'hello';
global_novar = 2;
(function () {
global_fromfunc = 3;
}());
var global = Object.getOwnPropertyNames(window);
console.log(global.includes('global_var'));
console.log(global.includes('hello'));
console.log(global.includes('global_novar'));
console.log(global.includes('global_fromfunc'));