假设我们有这个代码段:
var name = ["Apples","Oranges","Strawberries"];
console.log(name.length);
这段代码产生了这个奇怪的结果 27 !! 问题似乎是使用变量名称作为“名称”,这似乎是一个保留关键字。
但是谁能解释为什么会出现这种奇怪的行为?
假设我们有这个代码段:
var name = ["Apples","Oranges","Strawberries"];
console.log(name.length);
这段代码产生了这个奇怪的结果 27 !! 问题似乎是使用变量名称作为“名称”,这似乎是一个保留关键字。
但是谁能解释为什么会出现这种奇怪的行为?
它指的是window.name
,这是窗口的名称。
您可以使用窗口的名称来定位超链接,但它通常没有用。
更多信息window.name
:https : //developer.mozilla.org/en-US/docs/Web/API/Window.name
只是在 chrome 中测试:你不能停止var name
be window.name
,它是一个字符串。无论您将值设置为什么,它都会被转换为字符串,以便它是一个有效的窗口名称。所以,name.length
是字符串中的字符数。最好避免变量或对它们非常小心!
正如我从其他一些评论中看到的那样,如果您不熟悉这是一个奇怪的概念。关注的是window.name
指的是什么。window.name
是窗口的名称。它的任何用途都是命名窗口。
捍卫 Chrome 的行为是合乎逻辑的:
如果这var document = 'foo'
做了它看起来会做的事情,你就会window.document
用一个字符串覆盖- 文档对象。那问题就大了。name
是window
just like的属性,document
并且具有不应(并且不能在 Chrome 中)被替换的用途。
在全局范围内,当您这样做时var name = ["Apples","Oranges","Strawberries"];
,它与window.name = ["Apples","Oranges","Strawberries"];
.
window.name
必须是一个字符串,所以它分配["Apples","Oranges","Strawberries"].toString()
给它的是"Apples,Oranges,Strawberries"
.
JavaScript 中变量的作用域是什么?是一个好的开始。基本上,当你在name
函数之外声明时,你实际上是在隐藏window.name
值,这是一个非常非常糟糕的主意(要非常小心你声明的任何全局变量——它们实际上是window
对象的值——包括隐藏现有的值。
正如其他人所说,谷歌浏览器强制类型为字符串的事实可能是 Chrome 的一个怪癖(虽然有点可以理解),但根本原因是你只是在做一些你没有意识到自己在做的“危险”的事情:)
窗口对象有一个属性“名称”;
如果您在闭包函数中定义“名称”,您可能会得到 3
您在全局对象中定义了 var name,因此您刚刚初始化了一个字符串 obj;
(function(){
var name = ["Apples","Oranges","Strawberries"];
consol.log(name.length);
})()
var name = ["Apples","Oranges","Strawberries"];
全局 window.name 是一个内置的字符串对象(保留),所以当你执行上面的行时调用 name.toString() ;
正如其他人指出的那样,当您使用name
在全局范围内命名的变量时,它被视为window.name
.
从谷歌浏览器下的实验中,window.name
将值作为字符串获取,如下所示:"Apples,Oranges,Strawberries"
,这种行为是因为谷歌浏览器强制window.name
为字符串。这解释了为什么name.length
将报告27
为给定字符串的长度。
这种现象是不存在于IE,歌剧或Firefox它assing的阵列["Apples","Oranges","Strawberries"]
,并报告3
上`name.length
预期,所以我想这是谷歌浏览器的怪癖。