知识卡片
包装对象的临时装箱现象
内容
字符串、数字、布尔值本身是原始值,不是对象,却能调用s.toUpperCase()这样的方法,原因是每次访问它们的属性或方法时,引擎会临时用String()/Number()/Boolean()构造函数把原始值包装成一个对象,借这个临时对象完成属性访问,访问结束后这个包装对象随即被丢弃。这解释了一个容易踩坑的现象:给字符串变量新增一个属性(s.len=4)看似成功不报错,但再读这个属性时却是undefined——因为赋值发生在一个用完即弃的临时包装对象上,并未真正保留下来。理解这层”临时装箱”机制,才能明白为什么原始值”表现得像对象”但又不能真正持久化地挂载状态在它上面。
参考来源
《JavaScript权威指南(原书第6版)》第3章《类型、值和变量》