1
wyongjian 2020-11-23 17:16:29 +08:00
后者的 undefined 只是说明没有返回值吧
|
2
wymanAtV2 OP @wyongjian 嗯嗯,这个您启发了我,不过我还是不太能理解两者在使用的表现上的不同,例如有一个函数需要一个参数,我传递参数的时候 func(a,),此时我传入一个未定义的变量 variable,肯定是会报错的;但是我传入一个对象的属性,他是会默认传入一个 undefined 的;
|
3
xiongotom 2020-11-23 17:25:09 +08:00
undefined 不就是未声明嘛,符合定义啊。可能你的疑惑时为啥直接访问会报错,直接使用变量的时候是不会在 window 上自动创建一个变量的;但比如 a = 10 这样子,是会在 window 上自动创建一个变量,原因是有个 LHS 和 RHS 的区别,简单理解就是在赋值操作符的左边就会自动创建,右边则不会。
|
4
wymanAtV2 OP @xiongotom 嗯嗯,首先感谢您的解惑,您的解释我是理解的;我疑惑的点在于后者,为什么直接访问一个对象里的属性就不会有报错?
|
5
zzzzzzggggggg 2020-11-23 17:33:04 +08:00
undefined 会在以下几种情况返回:
1. 没有返回语句的函数运行结束,就会返回 undefined 2. 访问数组中不存在的下标和对象不存在的属性 3. void 运算符会返回 undefined 其他的情况按照你理解的返回即可 |
6
wymanAtV2 OP @zzzzzzggggggg 🙏原来点在于 undefined,十分感谢
|
7
marcong95 2020-11-23 17:38:35 +08:00
@wymanAtV2 #4 因为 window.a 这种用法既可以作为 LHS 又可以作为 RHS ?或者说 window 本身就是一个已经定义的变量,window.a 只是对已定义的变量指向的对象的一个属性 a 进行操作,而这种操作并不是对未定义变量的操作,所以不会产生错误?
|
8
xiongotom 2020-11-23 17:56:35 +08:00
@marcong95 是的。js 中的定义就是这样,如果方法或者语句中操作的变量没有赋值,就会返回 undefined ;直接使用变量会报错是因为 js 引擎一直找到 window 都找不到这个变量。而用 window.a 的话,就是前面那一条规则,js 变量上的属性本就无需特地的去声明一下。
|
9
yzqtdu 2020-11-23 18:10:54 +08:00
还有一点很多人没提到的是,JS 里的对象十分灵活,可以动态添加、删除属性,因此设计的时候允许访问未定义属性可以避免一些不必要的麻烦,例如根据条件添加某个属性,如果条件不成立未绑定则后面的访问报错,成立则顺利运行,这样所有对该属性的访问都要加上是否存在的判断,if (prop in obj && typeof obj[prop] == "function") obj[prop]()
|
10
wymanAtV2 OP 感谢各位的指点🙏~~
|