作为标题。 有人可以告诉我为什么吗? 非常感谢你!
<script type="text/javascript">
var status=[1,2,3];
console.log(typeof(status));
console.log(status); // the result is "1,2,3"
var normal_array=[1,2,3];
console.log(typeof(normal_array));
console.log(normal_array); // the result is "(3) [1,2,3]"
</script>
答案 0 :(得分:2)
在浏览器底部的状态栏中设置文本,或返回先前设置的文本。
此属性在Firefox和某些其他浏览器的默认配置中不起作用:设置window.status对状态栏中显示的文本无效。要允许脚本更改状态栏文本,用户必须在about:config屏幕中将dom.disable_window_status_change首选项设置为false。
它不能是字符串以外的任何东西,因此在使用时
const
它立即转换为字符串。
请注意,顶层的let
和const status = [1,2,3];
console.log(typeof status);
不会分配给全局对象:
status
另一种选择是将您的(() => {
var status = [1,2,3];
console.log(typeof status);
})();
放入IIFE:
{{1}}
答案 1 :(得分:1)
这是因为全局变量status
在阴影Window.status
中。无论何时设置,它的值都将由HTML5 specification转换为字符串(因此会看到'1,2,3'
因为调用了Array#toString
):
出于历史原因,
status
对象上的Window
属性必须在获取时返回设置为它的最后一个字符串,并且在设置时必须自行设置达到新的价值。创建Window
对象时,必须将属性设置为空字符串。它什么也没做。
要使用var
消除全局阴影,请使用ES2015中引入的块范围变体:
const status = [1, 2, 3]; //or
let status = [1, 2, 3];
答案 2 :(得分:0)
全局作用域包含许多变量,例如status
,它们可能会引起类似的麻烦,因为其中一些被锁定为某种类型,而另一些则无法更改。为避免此问题,您可以在函数内部编写代码以获得干净的作用域。用var
关键字声明的变量是函数范围的,因此函数可以完成工作。
当变量的作用域是函数而不是全局名称空间时,它将不会覆盖具有相同名称的全局变量。这意味着您仍然可以根据需要通过window.status
访问全局域。
示例(在本示例后继续阅读以寻求更好的方式):
//define your function with your code inside
function myCode(){
var status=[1,2,3];
console.log(status);
}
myCode(); //call your function
您可以使用IIFE(立即调用函数表达式)来声明函数,然后立即运行它而不必将其绑定到全局名称,这在这种情况下非常有用。
(function(){
var status=[1,2,3];
console.log(status);
})();
相同,只是立即调用该函数。这是可取的,因为这里的目的是避免全局名称冲突。