遇到这种面试题你真的不怨

181 阅读2分钟

前言

JavaScript作为一门非常强大而又灵活的语言吸引了众多开发者,更有某大佬表示一切能用JavaScript实现的方案,最终都将使用JavaScript ,灵活多变造就了它的多样性,但是也带来了很多让开发者无可奈何,我们为了适应语言其中的怪点我们有时候会在此上面浪费很多时间,本文是本人分享一些非常奇怪的例子,如果面试被问到,那我想说兄弟你真的不怨

image.png

1.顶层变量的属性与全局变量相关

顶层对象在浏览器环境中指的是window对象,(其他环境咋不讨论),《ES6标准入门》作者阮一峰在书中提到 顶层对象的属性与全局变量相关,被认为是JavaScript语言中最大的败笔之一

1.1window初始化的name
console.log(name) // ? 
var name = '黑猫警长' 

可能一部分人认为按照变量提升理解直接秒答输出undefined 不过请大家看看初始化window的值

image.png

嘻嘻不好意思初始化值为空哦,请不要踩坑哦

image.png

1.2 window中的编排与可写性
name = 'dada'
let changValue1 = '黑猫警长一号'
var changValue2 = window
console.log(changValue2.name) // ''

console.log(changValue2) // window

changValue2 = '黑猫警长二号'
console.log(window.changValue1) // undefined
console.log(window) // window
console.log(window.changValue2) // 黑猫警长二号
window = '我想改大哥的值'
window = null

console.log(window) // 大哥不让我改
alert = window.console.log
alert(22) // 黑猫警长求关注 (不是弹出是打印)
window.window==window // true
console.log(window.window.window) // ..... window
  1. 从ES6开始全局变量将逐步与顶层对象属性隔离,使用let声明的全局变量将不再window上挂载
  2. 可以通过变量间接引用且使用window,但是无法通过变量改变window本身,也不可将window销毁
  3. window中存在window属性,为循环引用
  4. window不可改,但内部内置的方法可以改 (不完全对)
1.3 window的另外一个名字self
self.fan = '我是黑猫警长的粉丝'
console.log(fan) //‘我是黑猫警长的粉丝’
console.log(window.fan) //‘我是黑猫警长的粉丝’
console.log(self === window) // true
console.log(window.self) // window
console.log(self)
var self ='adad'
console.log(self)

通过代码可以看出self对象实际就是window对象,其中的要点与windowd大致相同,但是window本身不可写,而self却可写,希望下次遇见留个心眼别又踩坑

image.png

总结:

JavaScript语言的世界虽然非常精彩,但是却也存在着不少的问题,随着ECMA的规范不断更新,我们应该期待语言会随着时间而不断完善,对于这其中的瑕疵,我先列举这些,作为一个web的忠实爱好者,编程不只是一种技术更是一门艺术,我们应该去探索其中的奥妙,(哎呀编不下去了,溜了)

image.png