ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

JavaScript原始包装类型

2021-12-20 21:31:07  阅读:177  来源: 互联网

标签:console log 包装 JavaScript 原始 类型 let String


之前就一直在疑惑,为什么在JavaScript中Number、String和Boolean类型明明是原始值,但是它们居然可以调用方法,比如s.splice()、substring等等,直到前一段时间阅读了《JavaScript高级程序设计》第四章的包装类型才恍然大悟。
参考资料

《JavaScript高级程序设计》第四版

包装类型

我们看如下代码

let s = "123";
let s1 = s.substring(0,2);
console.log(s1);// 12

结果为12是不言而喻的,但是在JavaScript中String是一个原始值,,那么对于变量s为什么会有方法呢?这是因为后台为我们创建了一个包装类型,且只在只读的情况下才会创建。可以把调用方法那一步看做一下三步:

let s = "123";
// 这三行
let ts = new String("123");
let s1 = ts.substring(0,2);
ts = null;
//
console.log(s1);

从上述代码,我们不难看出,当调用完方法(或者属性)之后,那么此时这个实例就会被销毁。这也是与普通实例的区别,普通的实例会在离开作用域时才会被销毁。对于Boolean 和 Number类型也是如此。

在离开调用方法那一行也就意味着,实例被销毁,也就是无法添加属性了。

let s  = '123';
s.color = "red";
console.log(s.color);

也许你会认为它的结果是red,但事实是undefined,这个有两行使用的包装类型:s.color = "red";

s.color,所以在给s添加属性完成后,那么那个包装类就已经被销毁了,在所以在输出的是undefined

还有一点需要注意的是,Object 构造函数作为一个工厂方法,能够根据传入值的类型返回相应原始值包装类型的实例。

let t = new Object("123");
console.log(typeof t);// object
console.log(t instanceof String);// true
let y = t;
t[0] = '2';// 无法改变
console.log(t,y);

因为String类型的无法通过小标的方式改变值,而且若每次赋值都是在内存中重新分配了空间,所以不用担心拷贝的问题。

小心Boolean类型包装类在逻辑运算结果

废话不多说,直接上代码

let f1 = false;
if(f1){
    console.log("我会输出吗?");
}
let f2 = new Boolean(false);
if(f2){
    console.log("我会输出吗?");
}
console.log(f1 && true);
console.log(f2 && true);

大家可以是试着看看结果是啥。第一个log没有输出,第二个log有输出,第三个log输出true,第四个log输出false。这是因为在逻辑运算中,所有的对象都会转换为true。

标签:console,log,包装,JavaScript,原始,类型,let,String
来源: https://blog.csdn.net/fujiaxu666/article/details/122026135

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有