不理解的JavaScript
我把我自己有时不注意的小细节标注在这里,表明容易出错和难以找到的误解产生点
1.变量提升
这在我的另一篇文章里也写明了这个特性的可恶之处,最主要的就是变量会提升到作用域顶部,但是变量的赋值却不会随之而而提升,所以容易出现undefind的情况
解决办法也只是尽量在头部声明或者自带一个人肉解释器,ES6出来了,我现在常用 let 来声明
2.饼干盒和饼干
尤其在遍历对象或者操作字符串的时候出现理解错误
var name = 'x' var obj = { name: 'frank' } console.log(obj[name]) // undefind console.log(obj['name']) // 'frank'
name 就像饼干盒, ‘name’就像饼干 。name里装的有可能是饼干有可能是其他东西,但饼干确是固定的。生来是饼干一辈子是饼干。
所以 obj[name] 就像一个叫obj的对象去拿一个叫 name的饼干盒里东西来吃,但是饼干盒有没有东西它不知道,所以会报undefind
而饼干是固定的,拿到饼干就可以吃了。
3.临时工问题
var n = 1 n.xxx = 2 console.log(n.xxx) //undefind
这段代码困扰着我,我不知道为什么会返回一个undefind,直到我了解了复杂对象的定义
var s = 1 为什么可以使用 s.toString() 是这一问题的关键点
按理说s是一个number的数据,不应该存在 . 这种对象才能使用的语法,但是在水面下还存在另一个机制
s.toString()
会把 s 变成 temp = new String(s)从而变成一个对象,在对象里找到toString()方法返回一个值,然后就消除这个temp临时变量
所以在n.xxx时实际上是 temp = new Number(n) 然后找xxx如果没有就创建一个比赋值 2 然后就消除它
那在console.log时xxx就不存在所以还要再找临时工来一下,创建一个对象去找,但是xxx没有赋值所以就返回undefind
我们可以这样理解 把所有 n. 都看成 找一个临时工创建 new 函数()来理解,就不会出现歧义
浙公网安备 33010602011771号