var name 在 Javascript 中产生奇怪的结果

IT技术 javascript variables
2021-01-21 16:03:08

假设我们有这个代码段:

var name = ["Apples","Oranges","Strawberries"];
console.log(name.length);

这段代码产生了这个奇怪的结果 27 !! 问题似乎是使用变量名称作为“名称”,这似乎是一个保留关键字。

但是谁能解释为什么会出现这种奇怪的行为?

5个回答

它指的是window.name,这是窗口的名称。

您可以使用窗口的名称来定位超链接,但它通常没有用。

更多信息window.namehttps : //developer.mozilla.org/en-US/docs/Web/API/Window.name

只是在 chrome 中测试:你不能停止var namebe window.name,它是一个字符串。无论您将值设置为什么,它都会被转换为字符串,以便它是一个有效的窗口名称。所以,name.length是字符串中的字符数。最好避免变量或对它们非常小心!

正如我从其他一些评论中看到的那样,如果您不熟悉这是一个奇怪的概念。关注的是window.name指的是什么window.name 窗口的名称。它的任何用途都是命名窗口。

捍卫 Chrome 的行为是合乎逻辑的:

如果这var document = 'foo'做了它看起来会做的事情,你就会window.document用一个字符串覆盖- 文档对象。那问题就大了。namewindowjust like的属性,document并且具有不应(并且不能在 Chrome 中)被替换的用途。

@ShadowFax Chrome 的行为是更好的行为!覆盖窗口的名称与覆盖文档本身具有可比性(但不是灾难性的)。
2021-03-17 16:03:08
@Luaan 是的,我试图以一种每个人都能理解的方式来解释,呵呵。如果你不习惯它,它有点抽象。
2021-03-20 16:03:08
@m59:真正的问题是全局变量是窗口对象的“字段”。即使它没有被转换为字符串,它仍然是错误的 - 窗口的名称将被数组覆盖!
2021-03-27 16:03:08
我相信任何全局变量都可以作为 引用window.variable_name,所以在这种情况下,我猜它是预定义的。
2021-04-03 16:03:08
@yitwail 这不是问题...name很特别 - 由于它的用途,它必须是一个字符串。
2021-04-09 16:03:08

在全局范围内,当您这样做时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() ;

上面的代码给出了一个语法错误,应该是console而不是consol
2021-03-17 16:03:08

正如其他人指出的那样,当您使用name在全局范围内命名的变量时,它被视为window.name.

从谷歌浏览器下的实验中,window.name将值作为字符串获取,如下所示:"Apples,Oranges,Strawberries",这种行为是因为谷歌浏览器强制window.name为字符串。这解释了为什么name.length将报告27为给定字符串的长度。

这种现象是不存在于IE,歌剧或Firefox它assing的阵列["Apples","Oranges","Strawberries"],并报告3`name.length预期,所以我想这是谷歌浏览器的怪癖。

@dystroy 我确实将其称为怪癖而不是错误,因为我认为这是有道理的。尽管我已经在 Firefox、IE 和 Opera 上进行了测试,但他们并没有这样做。他们分配阵列和报告3name.length预期。
2021-03-16 16:03:08
@dystroy 是的,但只有当您真正理解全局变量根本不是变量时才显得合乎逻辑,而是将它们分配给window对象中的“字段” 这是(浏览器)JavaScript 中的一个重要的可读性问题,如果浏览器产生警告(“您正在声明一个隐藏现有字段的变量window”或类似内容),那就太好了如果要更改window.name,只需分配给window.name. var name做同样非常混乱。
2021-03-17 16:03:08
对我来说,Chrome 的行为看起来是唯一合乎逻辑的行为。
2021-04-03 16:03:08