likes
comments
collection
share

包装类:把不是对象的处理掉

作者站长头像
站长
· 阅读数 63

在JavaScript眼中,对象似乎被赋予了一种独特的魅力,在创建String时它想的是对象,在创建Number时它想的是对象,在创建Boolean时它想的还是对象,这篇文章要讲的,正是其中一种包装类隐式处理过程。

前言:包装类的概念:

包装类是一种特殊的对象类型,它们用于将原始数据类型(如字符串、数字和布尔值)转换为对象,以便能够访问对象的属性和方法。这些包装类包括 String、Number 和 Boolean。当你尝试在原始数据类型上访问属性或方法时,V8引擎会自动创建相应的包装类实例,用于临时封装原始值。

疑问:对象中返回的undefined

你有没有想过这样一个问题。

当你访问一个从来都没有声明过的属性时

包装类:把不是对象的处理掉 很显然 ReferenceError: a is not defined ,结果是报错。

但是,当你访问一个对象身上不存在的属性时

包装类:把不是对象的处理掉

结果为undefined。为什么?

这是因为在JavaScript中,如果你尝试访问一个对象上不存在的属性,语言规范定义了这种行为会返回undefined,表示该属性并不存在于对象上

数组也能添加属性?

访问对象是这情况,于是你也想试试看数组。

当你访问一个数组类型中不存在的属性时,奇妙的事情发生了,它仍然返回的是undefined

包装类:把不是对象的处理掉

为什么呢?先别急,重点来了,当你在这个数组类型上添加这个属性并访问时

包装类:把不是对象的处理掉

出乎意料,其输出结果也为undefined(并非报错而是未赋值)。

不是对象为什么返回undefined?如果是对象又为什么不能添加属性?这个undefined从何而来?

这似乎形成了一个悖论,但这一切,其实都是V8在捣鬼。

包装类 —— 这个隐式过程:

怎么回事呢,众所周知,原始值类型(number String Boolean undefined null)都不能拥有属性和方法的,属性和方法是对象独有的。

原来,创建这些原始值类型,在V8引擎眼中就相当于创建相应的"对象"。

包装类:把不是对象的处理掉

既然是对象,那又为什么不能添加属性呢?

回答是在一个数组类型上添加属性并访问的行为,在V8引擎中从原则上就是不被允许的:

包装类:把不是对象的处理掉

可以看到,我们确实成功赋予了Xiaoming一个npy的属性,但在V8引擎的执行过程中被正义的处决掉了,因此返回的结果仍为undefined,这正是包装类的隐式处决过程。

转载自:https://juejin.cn/post/7373975016084881460
评论
请登录