JavaScript全局对象字符串Vs int

时间:2017-03-08 00:27:16

标签: javascript

请检查以下代码



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。任何人都可以解释这种行为

2 个答案:

答案 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'));