在javascript
中的变量在内存中的存储有两种形式,值类型
和引用类型
;
值类型:字符串(string
)、数值(number
)、布尔值(boolean
)、undefined
、null
(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
主要是因为csdn1
与csdn2
是值类型,而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
但csdn1
与csdn2
是值类型,自然不属于String中的方法
csdn1 instanceof String // false
csdn2 instanceof String // false
但是csdn1
,csdn2
却拥有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
值类型(原始资料类型)
可访问引用类型(包装对象)
中的所有方法与属性,但自身却不具备有
这就是为什么csdn1
与csdn2
(值类型)可访问到length
与indexof
,是自身是储存于栈中,所以不具备设置属性与方法的特征;而csdn3
(引用对象)是存储堆指针,可用于添加属性与方法;
在以读模式访问字符串的任何时候,后台会执行的三个步骤:
- 创建一个String类型的实例
- 调用实例上特定的方法
- 消耗实例
可将这三步想象成执行了如下3行ECMAScript的代码:
let s1 = new String("some text");
let s2 = s1.substring(2);
s1 = null;
这种行为可以让原始的值拥有对象的行为;
附加:
.toString()
和 String()
都可以将数据转成字符串,undefined
和null
没有 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
如不确定一个值是否是 null
或 undefined
,可以使用 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