Js中new String()/String()存储的堆与栈的深刻见解

javascript中的变量在内存中的存储有两种形式,值类型引用类型;

值类型:字符串(string)、数值(number)、布尔值(boolean)、undefinednull

(ECMAScript 2016新增了一种基本数据类型:symbol )
主要特征有如下:

  • .占用空间固定,保存在栈中
  • 保存与复制的是值本身
  • 使用typeof检测数据的类型

引用类型:对象(Object)、数组(Array)、函数(Function

  • 占用空间不固定,保存在堆中
  • 保存与复制的是指向对象的一个指针
  • instanceof检测数据类型
  • new()方法构造出的对象是引用型

探究String()和new String()的差异

定义一个字符串的三种方法;

var csdn1 = 'csdn';
var csdn2 = String('csdn');
var csdn3 = new String('csdn');

而判断三个变量数值与类型是否相等,这里使用到===全等

console.log(csdn1 === csdn2); //true
console.log(csdn1 === csdn3); //false
console.log(csdn2 === csdn3); //false

主要是因为csdn1csdn2是值类型,而csdn3是引用类型

console.log(typeof csdn1); // string
console.log(typeof csdn2); // string
console.log(typeof csdn3); //object

基本类型的值可以调用对应的length方法,却不能自己定义;

console.log(csdn1.length); // 4
csdn1.say = 'hello';
console.log(csdn1.say); // undefined
 
console.log(csdn3.lengh); // 4
csdn3.say = 'hello';
console.log(csdn3.say); // hello

因为这里的csdn1是值类型(原始资料类型) , 而csdn3是引用类型(包装对象),通过new String()创建出来的string的实例对象,所以具有

csdn3 instanceof String // true

csdn1csdn2是值类型,自然不属于String中的方法

csdn1 instanceof String // false
csdn2 instanceof String // false

但是csdn1csdn2却拥有String中的属性与方法

console.log(csdn1.indexOf === String.prototype.indexOf); // true
console.log(csdn2.indexOf === String.prototype.indexOf); // true
console.log(csdn3.indexOf === String.prototype.indexOf); // true

值类型(原始资料类型)可访问引用类型(包装对象)中的所有方法与属性,但自身却不具备有
这就是为什么csdn1csdn2(值类型)可访问到lengthindexof,是自身是储存于栈中,所以不具备设置属性与方法的特征;而csdn3(引用对象)是存储堆指针,可用于添加属性与方法;

在以读模式访问字符串的任何时候,后台会执行的三个步骤:

  1. 创建一个String类型的实例
  2. 调用实例上特定的方法
  3. 消耗实例

可将这三步想象成执行了如下3行ECMAScript的代码:

let s1 = new String("some text");
let s2 = s1.substring(2);
s1 = null;

这种行为可以让原始的值拥有对象的行为;

附加:

.toString()String() 都可以将数据转成字符串,undefinednull没有 toString() 方法,必须使用String() 方法返回这两个 值的字面量文本。

toString() 可以接收一个底数参数,即以 什么底数来输出数值的字符串表示。默认情况下是十进制。而通过传入参 数,可以得到数值的二进制、八进制、十六进制,或者其他任何 有效基数的字符串表示,比如:

let num = 10; console.log(num.toString()); // 10
console.log(num.toString(2));   // 1010
console.log(num.toString(8));   // 12
console.log(num.toString(10));  // 10
console.log(num.toString(16));  // a

如不确定一个值是否是 nullundefined ,可以使用 String() 转型函数,它始终会返回表示相应类型值的字符串;

let value1 = 10;
let value2 = true;
let value3 = null;
let value4; 
 
console.log(String(value1));  // 10
console.log(String(value2));  // true
console.log(String(value3));  // null
console.log(String(value4));  // undefined
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值