JavaScript高阶——ES6学习笔记

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也相应修改。

他们两个的区别在于,对原始值的引用不论在操作前还是操作后,他的值都不变。但是引用值是引用的一个内存上的地址,地址是不会变的,变的是地址里面的东西。

确定类型

  1. 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'
  1. 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
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值