给原始数据类型加属性和方法为什么不会报错?包装类——阿里面试题

简介: 给原始数据类型加属性和方法为什么不会报错?包装类——阿里面试题

前言

我们知道在JS有两大数据类型,一种是原始数据类型,一种是引用数据类型。引用数据类型比如对象,它是自带方法的,我们也可以给它加入属性和方法。但是原始数据类型没有属性和方法,那我们给原始数据类型加入属性和方法时,为什么不会报错呢?

我们先看一个例子:

var obj = {}
obj.a = 123
console.log(obj.a);
console.log(obj.b);

我们可以通过对象.属性 = 某某值的方法来创建一个键值对,那么当我们访问一个对象中没有的属性时,又会输出什么呢?

image.png

当我们访问对象中不存在的属性,并不会报错,而是输出undefined。

这个问题我们先留在这,我相信再我们讲完之后你自己就能解决了。

注:接下来会用到构造函数,不太了解的小伙伴们可以看看我的上篇文章:构造函数

包装类

原始值是不能拥有属性和方法的,属性和方法是对象才独有的

原始数据类型可以通过包装对象来拓展功能

var num = 123
num.abc = 'hello'
console.log(num.abc);

当小伙伴们看到这道题时,一定会很懵吧。什么?还能给原始数据类型加上属性?那么输出一定会报错吧!我们来看看输出结果

image.png

输出为undefined,而不是报错。这是为什么呢?

其实,当我们给原始数据类型添加属性时,引擎就会进行以下的操作。当我们var num = 123时,其实就相当于var num = new Number(123),上篇文章中我们讲到,使用了new返回的一定是一个对象,所以num短暂的成为了一个对象,所以可以暂时给num加上属性和方法,所以num.abc = 'hello',但是之后引擎反应过来了,原始数据类型是不能添加属性和方法的,所以又会detele num.abc.那小伙伴们,那为什么最后还会输出undefined,被删掉了不应该是报错吗?确实是删掉了,但当执行到console.log(num.abc)时,引擎又会执行一个操作,那就是new Number(123).abc,而这就叫做隐式包装类,但是并没有赋值,所以我们最后输出为undefined

我们用代码来解释一下:

var num = 123
// var num = new Number(123)
num.abc = 'hello'
// num.abc = 'hello'
// delete num.abc
// new Number(123).abc
console.log(num.abc);   // 输出undefined

我们再来看一道题:

var num = 4
num.len = 3
console.log(num.len);

这里也是输出为undefined,小伙伴们可以思考一下

var num = 4
num.len = 3
// var num = new Number(4)
// num.len = 3
// delete num.len
// new Number(4).len   //隐式包装类
 console.log(num.len);  // 输出undefined

接下来我们来讲一道考点:

var arr = [1, 2, 3, 4, 5]
arr.length = 2
console.log(arr);
var str = 'abcd'
console.log(str.length);

我们先来看看输出结果:

image.png

数组我相信小伙伴们已经很熟悉了,数组是引用数据类型,是具有属性和方法的,所以可以用arr.length修改数组的长度。如果做过字符串有关题目的小伙伴们,一定会知道字符串是有str.length这个属性的,接下来我们拿代码分析一下:

var arr = [1, 2, 3, 4, 5]
arr.length = 2
console.log(arr);
var str = 'abcd'
//new String('abcd').length
console.log(str.length);

当执行到console.log(str.length)时,引擎还是会生成一个new String('abcd').length,但这里为什么会输出一个值呢,因为字符串.length这个方法本身就存在,它是在字符串创造时就已经打造出来的,所以这里会输出字符串的长度。

阿里面试题

var str = 'abc'
str += 1    //字符串加任何东西都是字符串
var test = typeof (str) //'string'
if (test.length == 6) {
    test.sign = 'typeof的返回结果可能为String'
}
console.log(test.sign);

问:这里会输出什么?

var str = 'abc'
str += 1    //字符串加任何东西都是字符串
var test = typeof (str) //'string'
if (test.length == 6) {  // new String(test).length
    test.sign = 'typeof的返回结果可能为String'
    //new String(test).sign = 'typeof的返回结果可能为String'
    //delete
}
// new String(test).sign
console.log(test.sign);

你看,你又拿下了一道阿里面试题,是不是也没那么难呢?

总结

原始值是不能拥有属性和方法的,属性和方法是对象才独有的

原始数据类型可以通过包装对象来拓展功能

今天的内容就到这啦,如果你觉得小编写的还不错的话,或者对你有所启发,请给小编一个辛苦的赞吧

相关文章
|
27天前
|
存储 算法 架构师
阿里面试:PS+PO、CMS、G1、ZGC区别在哪?什么是卡表、记忆集、联合表?问懵了,尼恩来一个 图解+秒懂+史上最全的答案
阿里面试:PS+PO、CMS、G1、ZGC区别在哪?什么是卡表、记忆集、联合表?问懵了,尼恩来一个 图解+秒懂+史上最全的答案
|
1月前
|
存储 NoSQL Redis
阿里面试:Redis 为啥那么快?怎么实现的100W并发?说出了6大架构,面试官跪地: 纯内存 + 尖端结构 + 无锁架构 + EDA架构 + 异步日志 + 集群架构
阿里面试:Redis 为啥那么快?怎么实现的100W并发?说出了6大架构,面试官跪地: 纯内存 + 尖端结构 + 无锁架构 + EDA架构 + 异步日志 + 集群架构
阿里面试:Redis 为啥那么快?怎么实现的100W并发?说出了6大架构,面试官跪地: 纯内存 + 尖端结构 +  无锁架构 +  EDA架构  + 异步日志 + 集群架构
|
22天前
|
人工智能 算法 数据库
美团面试:LLM大模型存在哪些问题?RAG 优化有哪些方法?_
美团面试:LLM大模型存在哪些问题?RAG 优化有哪些方法?_
|
4月前
|
监控 Kubernetes Java
阿里面试:5000qps访问一个500ms的接口,如何设计线程池的核心线程数、最大线程数? 需要多少台机器?
本文由40岁老架构师尼恩撰写,针对一线互联网企业的高频面试题“如何确定系统的最佳线程数”进行系统化梳理。文章详细介绍了线程池设计的三个核心步骤:理论预估、压测验证和监控调整,并结合实际案例(5000qps、500ms响应时间、4核8G机器)给出具体参数设置建议。此外,还提供了《尼恩Java面试宝典PDF》等资源,帮助读者提升技术能力,顺利通过大厂面试。关注【技术自由圈】公众号,回复“领电子书”获取更多学习资料。
|
3月前
|
存储 SQL 算法
阿里面试:每天新增100w订单,如何的分库分表?这份答案让我当场拿了offer
例如,在一个有 10 个节点的系统中,增加一个新节点,只会影响到该新节点在哈希环上相邻的部分数据,其他大部分数据仍然可以保持在原节点,大大减少了数据迁移的工作量和对系统的影响。狠狠卷,实现 “offer自由” 很容易的, 前段时间一个武汉的跟着尼恩卷了2年的小伙伴, 在极度严寒/痛苦被裁的环境下, offer拿到手软, 实现真正的 “offer自由”。在 3 - 5 年的中期阶段,随着业务的稳定发展和市场份额的进一步扩大,订单数据的增长速度可能会有所放缓,但仍然会保持在每年 20% - 30% 的水平。
阿里面试:每天新增100w订单,如何的分库分表?这份答案让我当场拿了offer
|
7月前
|
存储 关系型数据库 MySQL
阿里面试:为什么要索引?什么是MySQL索引?底层结构是什么?
尼恩是一位资深架构师,他在自己的读者交流群中分享了关于MySQL索引的重要知识点。索引是帮助MySQL高效获取数据的数据结构,主要作用包括显著提升查询速度、降低磁盘I/O次数、优化排序与分组操作以及提升复杂查询的性能。MySQL支持多种索引类型,如主键索引、唯一索引、普通索引、全文索引和空间数据索引。索引的底层数据结构主要是B+树,它能够有效支持范围查询和顺序遍历,同时保持高效的插入、删除和查找性能。尼恩还强调了索引的优缺点,并提供了多个面试题及其解答,帮助读者在面试中脱颖而出。相关资料可在公众号【技术自由圈】获取。
|
3月前
|
缓存 NoSQL Java
阿里面试:DDD 落地,遇到哪些 “拦路虎”?如何破局?
为每个子领域定义限界上下文(bounded context),限界上下文是一个清晰定义了领域模型的边界的范围。在限界上下文内,领域模型的概念是一致的,但不同限界上下文之间可以有不同的模型和语言。界限上下文,基本可以对应到 落地层面的 微服务。这就是 DDD 建模和 微服务架构, 能够成为孪生兄弟、 天然统一的原因。具体的方法论和落地实操,请参考 《第34章视频 DDD学习圣经》DDD 战略设计的第一步就是统一语言,也叫通用语言(UBIQUITOUS LANGUAGE),用于定义上下文。
阿里面试:DDD 落地,遇到哪些 “拦路虎”?如何破局?
|
3月前
|
算法 NoSQL 应用服务中间件
阿里面试:10WQPS高并发,怎么限流?这份答案让我当场拿了offer
在 Nacos 的配置管理界面或通过 Nacos 的 API,创建一个名为(与配置文件中 dataId 一致)的配置项,用于存储 Sentinel 的流量控制规则。上述规则表示对名为的资源进行流量控制,QPS 阈值为 10。resource:要保护的资源名称。limitApp:来源应用,default表示所有应用。grade:限流阈值类型,1 表示 QPS 限流,0 表示线程数限流。count:限流阈值。strategy:流控模式,0 为直接模式,1 为关联模式,2 为链路模式。
阿里面试:10WQPS高并发,怎么限流?这份答案让我当场拿了offer
|
4月前
|
Java 程序员 调度
Java 高级面试技巧:yield() 与 sleep() 方法的使用场景和区别
本文详细解析了 Java 中 `Thread` 类的 `yield()` 和 `sleep()` 方法,解释了它们的作用、区别及为什么是静态方法。`yield()` 让当前线程释放 CPU 时间片,给其他同等优先级线程运行机会,但不保证暂停;`sleep()` 则让线程进入休眠状态,指定时间后继续执行。两者都是静态方法,因为它们影响线程调度机制而非单一线程行为。这些知识点在面试中常被提及,掌握它们有助于更好地应对多线程编程问题。
180 9
|
4月前
|
人工智能 缓存 Ubuntu
AI+树莓派=阿里P8技术专家。模拟面试、学技术真的太香了 | 手把手教学
本课程由阿里P8技术专家分享,介绍如何使用树莓派和阿里云服务构建AI面试助手。通过模拟面试场景,讲解了Java中`==`与`equals`的区别,并演示了从硬件搭建、语音识别、AI Agent配置到代码实现的完整流程。项目利用树莓派作为核心,结合阿里云的实时语音识别、AI Agent和文字转语音服务,实现了一个能够回答面试问题的智能玩偶。课程展示了AI应用的简易构建过程,适合初学者学习和实践。
167 22

热门文章

最新文章