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); / ...
随机推荐
- [LC] 121. Best Time to Buy and Sell Stock
Say you have an array for which the ith element is the price of a given stock on day i. If you were ...
- as和强制类型转换的区别
之前一直以为as就是强制类型转换,只是as是AS3中新的语法,之前用在有继承关系的对象之间的转换也无甚区别,但是今天却让我领悟到了它俩之间的区别. 原起:今天要给ColorPicker控件动态赋值,它 ...
- centos jdk
yum list java* yum install xxx -y java -version /* 可省略 */ vi /etc/profile export JAVA_HOME=/usr/lib/ ...
- centos xshell wireshark
centos安装wireshark yum install wireshark yum install wireshark-gnome 本地windows安装Xming Xming X Server ...
- C++ List的用法
Lists将元素按顺序储存在链表中. 与 向量(vectors)相比, 它允许快速的插入和删除,但是随机访问却比较慢. assign() 给list赋值 back() 返回最后一个元素 begin() ...
- 林轩田机器学习基石课程学习笔记5 — Training versus Testing
上节课,我们主要介绍了机器学习的可行性.首先,由NFL定理可知,机器学习貌似是不可行的.但是,随后引入了统计学知识,如果样本数据足够大,且hypothesis个数有限,那么机器学习一般就是可行的.本节 ...
- cs231n spring 2017 lecture9 CNN Architectures
参考<deeplearning.ai 卷积神经网络 Week 2 听课笔记>. 1. AlexNet(Krizhevsky et al. 2012),8层网络. 学会计算每一层的输出的sh ...
- deepin 更改默认网卡名称为eth和wlan
deepin 更改默认的网卡名称为eth和无线网卡名wlan vim /etc/default/grub 在 GRUB_CMDLINE_LINUX_DEFAULT="sqlash quiet ...
- Linux下重要文件
1:/etc/sysconfig/network-scripts/ifcfg-ens130 2: /etc/resolv.conf DNS配置文件 3:/etc/hosts 4:/etc/sy ...
- node 环境下简单web服务器搭建代码
零.前置 已经安装 node 环境. 一.代码片段 var http = require('http'); var path = require('path'); var fs = require(' ...