在技术研讨中,偶然发现一个非常有意思的变量——window.name,这是一个window默认自带的属性,类型为“string”,不可改变其类型,也就是说,如果对其赋值,值必须为string类型,否则会自动调用值的toString方法,将值转换为string类型。
// 输出true,表明为window的自身属性
console.log(window.hasOwnProperty('name'))
// 输出为string
typeof window.name
// 更改其类型为number
window.name = 100
// 依旧输出为string
typeof window.name
从上面可以看出,实际应用中,如果在window的上下文下,声明了全局变量name,并将其指向其他类型,如Element,那一定会出现很多诸如“undefined”、“Uncaught TypeError:is not a function”的错误,如下:
// 即使是这样,也覆盖不了window.name的默认类型
var name = document.body;
// 添加DOM内容
// 浏览器提示VM1446:1 Uncaught TypeError: name.appendChild is not a function
name.appendChild(document.createTextNode('Hello,World!'))
// 输出string
console.log(typeof(name))
结论
千万不要在上下文为window的环境中声明全局变量name