JavaScript高阶——ES6学习笔记
3.原始值和引用值
在ES6里,数据分为两大类:原始值和引用值。
定义
原始值:单一的数据。有Undefined、Null、Boolean、Number、String和Symbol
、bigint(大整数,新增的)这六类。(类似基本数据类型)
保存原始值的变量是按值访问,操作存储在变量内存中的实际值。
引用值:表示有多个值(原始值或其他引用值)构成的对象。(类似引用数据类型)
ES不允许直接访问对象的内存空间。
实际操作对象时,访问的是保存对象的内存地址,即该对象的引用。
动态属性
原始值是不可改变的。(声明后即为确立)
引用值(对象)可以随时添加、修改和删除其属性和方法。
let person = new Object();
person.name = "John";
person.showMe = function () {
console.log("Hi, I'm " + this.name);
};//输出为Hi,I'm John
原始值不能有属性。
let one = "Tom";
one.age = 20;
console.log(one, one.age);
//输出为 'Tom' undefined
//创建了一个新的对象 new string(age)用完就消失了。
值传递
赋值,即将值复制给变量的过程。
原始值与引用值传递的区别:本质上没有区别,都是将一个变量中保存的信息复制给另一个变量。
let a = 100;
let b = a;
b++;
console.log(a, b);
//输出为100 101
//值不互相影响
原始值的传递是引用 , 引用值的传递是复制。
let obj1 = { value: 100 };
let obj2 = obj1;
obj2.value = 200;
console.log(obj1.value, obj2.value);
//输出为 200 200
//因为obj1和obj2共用value,当改变了obj2的value时,obj1的value也相应修改。
他们两个的区别在于,对原始值的引用不论在操作前还是操作后,他的值都不变。但是引用值是引用的一个内存上的地址,地址是不会变的,变的是地址里面的东西。
确定类型
- typeof操作符
typeof可以拿来检测类型是原始值还是引用值。几乎引用的值 typeof都是object。
let s = "Nick";
let b = true;
let i = 22;
let u;
let n = null;
let obj = new Object();
let a = [1, 2, 3];
let fn = function(){};
console.log(typeof s);//'string'
console.log(typeof b);//'boolean'
console.log(typeof i);//'number'
console.log(typeof u);//'undefined'
console.log(typeof n);//'object'
console.log(typeof obj);//'object'
console.log(typeof a);//'object'
console.log(typeof(fn));//'function'
- instanceof操作符
用于判断引用值是否为某个构造函数的实例。
let obj = new Object();
let a = [1, 2, 3];
console.log(obj instanceof Object);//true
console.log(a instanceof Array);//true
instanceof 在原型链的高级运用:
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/instanceof
基本包装类型
原始值包装类型
为了方便操作原始值,ES提供了3种特殊的引用类型:Boolean、Number和String。
每当用到某个原始值的方法或属性时,后台会创建一个相应的原始值包装类型的对象,从而暴露出操作原始值的各种方法。
例:
let s1 = "hello world";
let s2 = s1.substr(0, 5);
console.log(s1,s2);
//输出为"hello world" "hello"
后台执行步骤:
(1)创建一个包含了原始值的String(let s1 = new Srtring(hello world);)类型的实例;(自动装箱)
(2)调用实例上的特定方法( s1.substr(0, 5));(自动拆箱,变成String基本数据类型)
(3)销毁该实例;
分析
/* 转型函数 */
let value = "200";
let number = Number(value);
console.log(typeof number);//'number'
/* 构造函数 */
let obj = new Number(value);
console.log(typeof obj);//'object