不理解的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 函数()来理解,就不会出现歧义

 

 

 

posted on 2019-02-17 16:20  城外三石  阅读(78)  评论(0)    收藏  举报

导航