那我大概说下“!”这约束它的使用方式吧,不可能官方闲的蛋疼专门写这东西,然后特殊说明一下,仅限严格模式环境,不严格模式完全没意义。
附1:首先补充下上面楼层没说到的,对于构造函数中赋值的变量,在声明时是不需要“!”的,也就是说“!”的意义在于“对于非构造初始化变量,标记其在对象有效期内是有值的”。
1、外部系统赋值:
像cocos这个就很常见了:“@property(cc.Node) ndReward: cc.Node = null!”,首先不赋值的话编辑器会警告,所以一般对于对象都是初始化为null,然后在严格模式下这种写法是不安全的,因此需要加个“!”,用来提醒它是一定会在外部赋值的,不会为空,这是它的存在意义之一;
当然也有允许为空的属性,但这不是“!”需要关注的对象;
2、非构造函数赋值:
(1)内置一个初始化函数,由外部来调用(例如UI根节点调用子节点的脚本),本质跟1无区别,只是写法上的不同;
(2)有效的生命周期函数赋值,这种翻开cocos官方的脚本就能见了,其很多内置属性都是在onLoad或onEnable时候才赋值的(实际不一定是这函数哈,只是说到了这个周期时),也就是说处于“活跃”或者说“有效”状态的对象才有值的属性,我们也可以用“!”来标记,当然啦官方源码还是会判断这类对象存不存在的,只是说我们能这么去声明处于活跃周期内的属性加个“!”;
附2:严格模式的意义,更多的是在js这种弱语言环境减少更多的类型错误、空对象错误,虽说写起来是挺复杂挺麻烦的,但有时候你要检验一个稍微复杂点的函数里面代码写的有没有问题时,不妨打开一下,你会发现不一样的东西,所以没有什么东西是没意义的,存在就有它特定的环境去使用。


