Javascript中String()和new String()的区别——JS的包装对象
最近在看Symbol不能使用new操作符,然后类比到Number,String,Boolean,因为它们同属于基本类型,但是有有所差异:Number,String,Boolean是可以使用new操作符进行实例的输出的。出个题:
var abc = 'abc',
str1 = String(abc),
str2 = new String(abc);
//判断下面输出
str1 === abc //true
str2 === abc //false
这里其实考察的是值类型和引用类型,String()返回的是字符串,即基本类型,而new String()返回的是一个对象,str2是引用存储,值存储 !== 引用存储的。
再来个题目:
var Fun1=function(){
return String('miya');
};
var fun1 = String('miya')
fun1 === new Fun1() //false
fun1 === Fun1() //true
其实下面fun1 === Fun1() 这个肯定是true了,因为返回都是基本类型string,但是new出来的对象就不一样了,它返回的是引用类型了。
存取字符串,数字或者布尔值的属性时创建的临时对象称作包装对象。
var str = "miya",num = 1,boo = true;
var Str = new String(str);
var Num = new Number(num);
var Boo = new Boolean(boo);
console.log(str == Str); //true
console.log(num == Num); //true
console.log(Boo == boo); //true
当使用全等时候str !== Str的,因为前者原始值,后者引用引用类型。使用==时候为true,是因为:Javascript会在必要时候将包装对象转化为原始值。
Javascript中三种基本包装类型:Boolean,Number,String。
当调用str.substring(0) //"miya",实际上JS内部隐式的帮我们创建了一个包装对象,调用substring方法时候实际过程是:
var a1 = new String("miya");
var a2 = a1.substring(0);
a1 = null;
console.log(a2); //miya
这个是在基本类型string调用属性时候浏览器隐式创建的包装对象。隐式创建的对象,在使用完毕后会被销毁掉。
隐式包装对象和自己显示创建的包装对象差别点在于:
对象的生存周期,你用new操作符创建的引用类型的实例,一直保存在内存中除非手动销毁,而浏览器隐式创建的包装对象只存在于你操作string,boolean,number原始值属性时候,用完即销毁,这样我们就不能手动为基本类型添加属性和方法了。
【完】
书卷多情似故人,晨昏忧乐每相亲。
Javascript中String()和new String()的区别——JS的包装对象的更多相关文章
- JavaScript中object和Object有什么区别
JavaScript中object和Object有什么区别,为什么用typeof检测对象,返回object,而用instanceof 必须要接Object呢 ————————————————————— ...
- JavaScript中const、var和let区别浅析
在JavaScript中有三种声明变量的方式:var.let.const.下文给大家介绍js中三种定义变量的方式const, var, let的区别. 1.const定义的变量不可以修改,而且必须初始 ...
- JavaScript中值类型和引用类型的区别
JavaScript的数据类型分为两类:原始类型和对象类型.其中,原始类型包括:数字.字符串和布尔值.此外,JavaScript中还有两个特殊的原始值:null和undefined,它们既不是数字也不 ...
- JavaScript中=、==、===以及!=、!==的区别与联系
JavaScript中=.==.===以及!=.!==的区别与联系 在JavaScript中,“=”代表赋值操作:“==”先转换类型再比较,“===”先判断类型,如果不是同一类型直接为false. ...
- 关于javascript中apply()和call()方法的区别
如果没接触过动态语言,以编译型语言的思维方式去理解javaScript将会有种神奇而怪异的感觉,因为意识上往往不可能的事偏偏就发生了,甚至觉得不可理喻.如果在学JavaScript这自由而变幻无穷的语 ...
- javascript 中 offsetWidth,clientWidth;offsetHeight,clientHeight的区别
javascript 中 offsetWidth 是对象的可见宽度,包滚动条等边线,会随窗口的显示大小改变 clientWidth.offsetWidth.clientHeight区别IE6.0.FF ...
- 在 JavaScript 中 prototype 和 __proto__ 有什么区别
本文主要讲三个 问题 prototype 和 proto function 和 object new 到底发生了什么 prototype 和 proto 首先我们说下在 JS 中,常常让我们感到困惑的 ...
- javascript中的undefined与null的区别
一.相似性 在JavaScript中,将一个变量赋值为undefined或null,老实说,几乎没区别. var a = undefined; var a = null; 上面代码中,a变量分别被赋值 ...
- javascript中常见undefined与defined的区别
在JavaScript中相信“undefined”与“defined”对大家来说都肯定不陌生,但是又不是很清楚它们的区别,先看两个demo我们再说, 例1. console.log(parms); / ...
随机推荐
- @Transactional回滚问题(try catch、嵌套)
Spring 事务注解 @Transactional 本来可以保证原子性,如果事务内有报错的话,整个事务可以保证回滚,但是加上try catch或者事务嵌套,可能会导致事务回滚失败.测试一波. 准备 ...
- dhcp server
centos yum install dhcp -y cat /etc/dhcp/dhcpd.conf default-lease-time 7200; max-lease-time 14400; s ...
- springboot学习笔记:11.springboot+shiro+mysql+mybatis(通用mapper)+freemarker+ztree+layui实现通用的java后台管理系统(权限管理+用户管理+菜单管理)
一.前言 经过前10篇文章,我们已经可以快速搭建一个springboot的web项目: 今天,我们在上一节基础上继续集成shiro框架,实现一个可以通用的后台管理系统:包括用户管理,角色管理,菜单管理 ...
- leetcode第38题:报数
这是一道简单题,但是我做了很久,主要难度在读题和理解题上. 思路:给定一个数字,返回这个数字报数数列.我们可以通过从1开始,不断扩展到n的数列.数列的值为前一个数列的count+num,所以我们不断叠 ...
- [LC] 79. Word Search
Given a 2D board and a word, find if the word exists in the grid. The word can be constructed from l ...
- Rancher的部署安装(编排选用K8S)
为什么要使用Rancher Rancher是一个开源的企业级容器管理平台.通过Rancher,企业再也不必自己使用一系列的开源软件去从头搭建容器服务平台.Rancher提供了在生产环境中使用的管理Do ...
- Redis 事物、悲观、乐观锁 (详细)
1,概论 事物这东西相信大家都不陌生吧,在学习Spring,Mybatis等框架中, 只要是涉及到数据存储和修改的,都会有事物的存在, 废话就不多说了下面我们来简单的介绍下Redis事物以及锁. 2, ...
- [LC] 490. The Maze
There is a ball in a maze with empty spaces and walls. The ball can go through empty spaces by rolli ...
- 云服务器之——Linux下配置JDK环境
在Linux下jdk的安装已经操作了很多次,每次发现自己还是会忘记之前的操作,所以今天就简单的来做个记录. 第一步:下载jdk安装包 登录oracle官网:https://www.oracle.com ...
- python-pymysql学习
python 操作mysql:有两种方式python-mysqldb(python3.0之后不能安装)和pymysql,下面是pymysql的学习. 参照表: python代码实现的mysql查询功能 ...