像me.name='forceddd'这样的赋值语句在JavaScript中无处不在。但是我们真的了解这段代码的作用吗?是否创建了新属性?您是否修改了原始属性的值?操作成功还是失败?这只是一个简单的赋值语句,但是我们仔细想想就会发现,这种细节其实并没有那么简单。一切都可以归类和讨论。首先分为两种:对象me有name属性和没有name属性。当然,我们都知道JavaScript中有原型链机制,所以当对象me中不存在name属性时,也可以分为两种情况:me的原型链上存在name属性和没有名称属性。也就是可以分三类来讨论。name属性已经存在于meconstme={name:'me',};me.name='forceddd';控制台日志(我的名字);//forceddd在这种情况下显然我们的目的是重置name属性的值,结果似乎也很明显,me.name被更改为'forceddd'。但是不要忘了,对象的属性也有它自己的属性,包括是否只读(可写),(通常用来描述对象某个属性的各种特性的对象称为属性描述符或描述对象的属性),那么当name属性可写为false时会发生什么?不仅如此,当name属性定义了getter或setter函数并成为访问描述符时会发生什么?当name属性的writable为falseconstme={name:'me',};Object.defineProperty(me,'name',{writable:false,value:me.name,});me.name='forceddd';//name的属性值还是'me'console.log(me.name);//me因为name属性是只读的,所以赋值操作me.name='forceddd'失败了,这个恒河狸。但需要注意的是,这种操作失败是无声的,如果我们在操作后不验证name值,是很难发现的。使用严格模式可以将这种静默失败转变为显式类型错误。'usestrict';//使用严格模式constme={name:'me',};Object.defineProperty(me,'name',{writable:false,value:me.name,});me.name='forceddd';//TypeError:当名称属性是访问描述符(定义了getter或setter)时,无法分配给对象'#