使用变量“name”不适用于JS对象
Using the variable "name" doesn't work with a JS object
行为可以在这个小片段中看到(将其作为全局脚本执行):
var name = {};
name.FirstName = 'Tom';
alert(name.FirstName);
该警报在Chrome中产生undefined
,但在IE和Firefox中有效。当我这样做时,我也得到了一个奇怪的值
alert(name);
window.name 有一个特殊的用途,应该是一个字符串。Chrome 似乎显式地将其转换为字符串,因此var name = {};
实际上最终会给全局变量name
(即 window.name
) 的值为 "[object Object]"
。因为它是基元,属性(name.FirstName
)不会"粘住"。
若要解决此问题,请不要将name
用作全局变量。
你的name
变量实际上是window.name
的,因为用var
声明的顶级变量附加到全局对象。
HTML5规范要求window.name
是DOMString
。这意味着 window.name
的值只能是字符序列,而不能是对象。
在 Chrome 中,尝试使用 window.name
存储除基元字符串以外的任何内容都会将值强制为基元字符串。例如:
window.name = {};
window.name === "[object Object]"; // true
您可以通过使用不在顶级范围内的name
变量来避免此问题:
(function() {
var name = {};
// this `name` is not `window.name`
// because we're not in the top-level scope
console.log(name);
})();
使用 ES6+,您可以将代码编写为 let name
或 const name
。这不会分配它或尝试覆盖window.name
。更多关于这一点的信息 这里.
let name = {};
name.FirstName = 'Tom';
alert(name.FirstName);
window.name
用于设置窗口的名称,并且由于窗口名称只能是字符串,因此设置为window.name
的任何内容都将转换为字符串。字符串作为基元值,不能具有属性。解决方案是使用不同的变量名称或不同的范围。
或者,如果您先有此代码,则可以根据需要使用window.name
。我根本不推荐这样做,但是,只是作为概念证明:
(function () {
var _name;
window.__defineGetter__('name', function () {
return _name;
});
window.__defineSetter__('name', function (v) {
_name = v;
});
})();
此外,您应该使用 {}
代替 new Object
。除了更简洁之外,它还更高效、更明确。
- html5 drawImage适用于firefox,而不是chrome
- Jquery Ajax POST不工作.适用于GET
- 如何调试遗留的javascript代码(适用于IE,但在Google Chrome中不正常)
- .load()适用于window,而不是ID
- 使用Jquery更改css样式适用于id's、 不在课堂上
- 提交按钮不会;不适用于Chrome或Firefox,但适用于Internet Explorer
- 为什么 javascript 中的“btoa”编码适用于 20 位字符串而不是 20 位整数
- Javascript String to Date适用于Chrome,而不是FF或Safari
- Onchange,向上,向下箭头键适用于FF和Chrome,但在IE中不起作用
- .load() 适用于 IE 和 dreamweaver 预览版,但不能使用 opera 和 chrome
- 找不到适用于 Highcharts 的 JSON 数组语法
- 为什么在jQuery中使用focusout适用于Firefox,而使用addEventListener则不适用;t
- jQuery选择菜单验证器适用于FF和Chrome,但不适用IE
- 单选按钮'onclick'适用于Chrome和Firefox,但不适用IE
- JQuery ScrollTop适用于chrome,但不适用firefox
- window.opener.location.href适用于IE,但不适用Chrome或Safari
- Frame Busting buster不完全适用于IE
- Jquery touch punch适用于Chrome和Firefox,但不适用IE
- 背景更改仅适用于chrome+$.预加载不适用;不起作用
- JavaScript window.location.replace适用于Firefox,但不适用IE或Chrome