Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Web前端学习 第3章 JavaScript基础教程19 原始类型

Web前端学习 第3章 JavaScript基础教程19 原始类型

原创
作者头像
学习猿地
修改于 2020-06-17 09:39:53
修改于 2020-06-17 09:39:53
36700
代码可运行
举报
文章被收录于专栏:学习猿地学习猿地
运行总次数:0
代码可运行

一、原始类型与引用类型的基本概念

在JavaScript基础课程中我们学习了JavaScript有六种数据类型:

  • 数值型
  • 字符串型
  • 布尔型
  • Null
  • Undefined
  • 对象

我们可以把这六种数据类型按存储方式分为两类

  • 原始类型(或叫值类型):数值、字符串、布尔、Null、Undefined
  • 引用类型:对象

原始类型赋值给变量,遍历存储的是这个值本身,而你用类型赋值给变量,变量存储的是一个引用,这个引用会指向内存中的这个对象。

二、原始类型与引用类型的差异

接下来,我们在实际案例中展示一下原始类型与引用类型的区别:

原始类型与引用类型赋值的区别

实例代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1 var str1 = "hello world";
2 var str2 = str1;
3 str1 = "hello javascript";
4 
5 console.log(str1);   //hello javascript
6 console.log(str2);   //hello world

字符串是原始类型,str1和str2两个变量存储的都是字符串类型的数据,所以对其中一个变量赋值不会影响第二个变量。

下面我们将程序中的字符串换成对象,再来看看这个例子。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1 var obj1 = {name:'xiaoming'};
2 var obj2 = obj1; 
3 obj1.name = 'xiaohong';
4 
5 console.log(obj1.name);    //xiaohong
6 console.log(obj2.name);    //xiaohong

程序最后输出的两个值是相同的,但是我们只是将obj1的name属性赋值为xiaohong,并没有将obj2的name属性赋值为xiaohong,为什么他们都变成了同一个值?这就是原始类型与引用类型的区别:变量存储的原始类型,仅仅是存储它的值,所以我们将存储原始类型的变量重新赋值,不会影响其他变量,但是变量存储引用类型的时候,情况有所改变,变量并不是存储这个对象本身,而是存储这个对象的引用,而这个引用可以指向这个变量本身,所以当我们将obj1赋值给obj2的时候,其实是让这两个变量的引用同时指向一个对象,这样当我们改变这个对象的时候,两个变量都会有变化。

原始类型与引用类型比较的区别

接下来我们来看一下原始类型与引用类型比较的时候有什么来区别。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1 var str1 = 'hello world';
2 var str2 = 'hello world';
3 console.log(str1 == str2);     //true 
4 
5 var obj1 = {name:'xiaoming'};
6 var obj2 = {name:'xiaoming'};
7 console.log(obj1 == obj2);     //false

在上面的代码中,两个字符串都是’hello world’他们比较后的返回值是true,但是两个对象name属性都是’xiaoming’,比较后的返回值却是false,这也是原始类型与引用类型本质上的却别导致的,原始类型存的是值,比较的也是值,如果值相等,则返回true,如果值不等,则返回false,引用类型存的是应用,比较的也是引用,如果两个引用指向同一个对象,返回true,指向不同对象,则返回false,上面的例子中,两个对象虽然属性相同,但明显是不同的两个对象,他们就像两个重名的学生一样,即使有相同的名字,也不会是同一个人,所以返回值是false。

原始类型与引用类型传参的区别

下面我们分别将原始类型和引用类型当做参数传给一个函数,看看有什么样的区别

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1 var str = "hello world";
2 function fun(s){
3     s = "hello javascript";
4 }
5 
6 fun(str);
7 console.log(str);   //hello world

在上面的代码中我们将变量str传给函数fun,在fun内部将参数将另一个字符串赋值给参数,然后在函数外面输出str,发现str的值并没有变,然后我们再来看下面这个例子

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1 var obj = {name:'xiaoming'};
2 function fun(o){
3     o.name = 'xiaohong'
4 }
5 
6 fun(obj);
7 console.log(obj.name);  //xiaohong

将参数换成引用类型后,我们发现再次输出obj的时候,它的值已经变成了函数中赋的值,这是因为原始类型传参的时候,实参是形参的副本,改变形参的时候不会影响实参,而应用类型传参的时候,形参和实参的对象都指向一个引用,这样当我们修改形参的值的时候,其实是操作了内存中的对象,所以函数外部变量的值也就跟着变化了。

上面我们说了原始类型与引用类型的区别,在实际开发的过程中,有一种情况,我们需要得到一个对象的备份。例如我们有一个对象:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1 var student = {
2     name:'xiaoming',
3     age:2,
4     sex:'male'
5 }

三、对象的浅度克隆

现在希望或得一个student对象的克隆对象,这两个对象所有属性都相同,我们修改其中一个对象的时候不会影响另一个对象。我们来编写一个函数,参数是一个对象,返回值是这个对象的克隆对象。

我们首先需要了解一下for…in语句

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1 var student = {name:'xiaoming',age:2,sex:'male'};
2 for(var i in student){
3     console.log("属性"+i);
4     console.log("值"+student[i]);
5 }

我们通过for…in语句可以遍历对象中的属性和属性值,这样我们就可以很容易地实现对象克隆的功能。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 1 var student1 = {name:'xiaoming',age:2,sex:'male'};
 2 
 3 function clone(obj){
 4     var newobj = {};    //创建一个新对象
 5     for(var i in obj){  //遍历传进来的参数对象
 6         newobj[i] = obj[i];  //将传进来的参数的属性和属性值赋值给新对象的同名属性。
 7     }
 8     return newobj;      //返回新创建的对象
 9 }
10 
11 var student2 = clone(student1);
12 student1.name = 'xiaohong';
13 console.log(student1.name);
14 console.log(student2.name);

在上面的代码中,我们成功复制了student1,当我们修改student1的时候,student2不会改变。但是在上面的例子中,对象的所有属性值都是原始类型,如果将对象换成下面的对象

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1 var student = {
2     name:'xiaoming',
3     age:2,
4     sex:'male',
5     friends:["Lily","lucy"]
6 }

然后再用我们的clone方法克隆这个对象,就会发现,当我们改变friends属性的时候,两个对象都会改变。所以这样的clone方法只能叫“浅度克隆”,如果希望对象中所有属性都能被克隆,那么需要“深度克隆”,“深度克隆”我们会在下一章讲解。

四、课后练习

  1. 在表单中输入【姓名】,点击【添加】按钮,创建Student对象。
  2. 将Student对象添加到列表中。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Web前端学习 第3章 JavaScript基础教程6 函数基础
函数是一个可执行的语句块,定义的时候不执行,调用的时候执行,使用"函数名()"的形式可以调用函数, 语法如下所示:
学习猿地
2020/06/16
3530
Web前端学习 第3章 JavaScript基础教程11 常量变量
ECMAscript简称ES,是JavaScript的标准,我们经常说的ES5,ES6等等,可以称作JavaScript的版本,我们在之前学过的所有JavaScript特性,都是基于ES5版本的,今天我们开始讲解的是ES6标准的特性。ES6已更名为ES2015,ES7等后续的版本,我们都可以统称为ES2015+
学习猿地
2020/06/17
5000
Web前端学习 第3章 JavaScript基础教程11 常量变量
javaScript中的浅拷贝 vs 深拷贝
在前端的数据处理当中,有时候往往需要对原有的数据进行克隆拷贝一份,然后在进行操作,但是又不能影响原来的数据
itclanCoder
2020/10/28
6960
javaScript中的浅拷贝 vs 深拷贝
JS中对内存的一些了解
具体查看详细解释, 对理解基础知识点还是很有帮助的. 例如: js的赋值运算顺序永远都是从右往左的,但是.是优先级最高的运算符.
全栈程序员站长
2021/06/16
3730
面试官想要的 JS 基本类型
面试的时候我们经常会被问答js的数据类型。大部分情况我们会这样回答包括: 基本类型(值类型或者原始类型): Number、Boolean、String、NULL、Undefined以及ES6的Symb
grain先森
2019/04/17
5780
面试官想要的 JS 基本类型
2022高频前端面试题合集之JavaScript篇(中)
valueOf()和toString()是定义在Object.prototype上的方法,也就是说,所有的对象都会继承到这两个方法。但是在Object.prototype上定义的这两个方法往往不能满足我们的需求(Object.prototype.valueOf()仅仅返回对象本身),因此js的许多内置对象都重写了这两个函数,以实现更适合自身的功能需要(比如说,String.prototype.valueOf就覆盖了在Object.prototype中定义的valueOf)。当我们自定义对象的时候,最好也重写这个方法。重写这个方法时要遵循上面所说的语义。 「js内部用于实现类型转换的4个函数」 这4个方法实际上是ECMAScript定义的4个抽象的操作,它们在js内部使用,进行类型转换。js的使用者不能直接调用这些函数。
程序员法医
2022/12/20
2.4K0
2022高频前端面试题合集之JavaScript篇(中)
Web前端学习 第3章 JavaScript基础教程7 对象
在现实生活中,所有东西都可以看成对象,比如一台电脑,一个房子,一只猫,一个人,对象有他自己的属性,比如电脑有颜色,房子有尺寸,猫和人都有年龄。
学习猿地
2020/06/16
3160
JavaScript 数据类型
原文链接:https://note.noxussj.top/?source=cloudtencent 常见的 ES5 数据类型分为基本数据类型、引用数据类型两种。包含字符串、数字、对象、数组、函数、布
菜园前端
2023/05/02
1910
最好的JavaScript入门教程
学习JavaScript相对于html和css会复杂一点,js是一门正式的编程语言,和后续要学习的java语言有一些共性,学习JavaScript需要去理解变量、数据类型、函数。
方才编程_公众号同名
2024/10/18
2230
最好的JavaScript入门教程
JavaScript基本类型与引用类型(二)
前文已经对基本类型和引用类型作了简单的介绍,本文将进一步介绍基本类型和引用类型。 基本包装类型   为了方便操作基本类型的值,JavaScript提供了特殊的引用类型:Boolean、Number、String。这些类型与其他的引用类型相似,但是也具有各自的基本类型的特殊行为。每读取一个基本类型,后台都会创建一个对应的基本包装类型的对象。 1 var str="hello world"; 2 var str1=str.substring(0,3); 3 console.log(str1);   上面的
水击三千
2018/02/27
6560
JavaScript基本类型与引用类型
前面已经说过,JavaScript变量是松散类型,它可以保存任何类型的值。变量的值以及数据类型可以在脚本的生命周期内发生改变。变量包含两种不同类型的值:基本类型和引用类型。基本类型值的是简单的数据段,而引用类型指的是可能由多个值构成的对象。 基本类型包括:undefined,null,boolean,number,string。这5中类型是按值访问的,可以操作保存在变量中的实际值。引用类型的值是保存在内存中的对象。JavaScript不允许直接访问内存中的对象,不能直接操作对象的内存空间。在操作对象时,实际
水击三千
2018/02/27
6960
JavaScript基本类型与引用类型
前端面试(8)拷贝
js 的基本数据类型的赋值,就是值传递。引用类型对象的赋值是将对象地址的引用赋值。这时候修改对象中的属性或者值,会导致所有引用这个对象的值改变。如果想要真的复制一个新的对象,而不是复制对象的引用,就要用到对象的深拷贝。
leader755
2022/03/09
3220
前端面试(8)拷贝
深浅拷贝
Object.assign() 方法用于将所有可枚举属性的值从一个或多个源对象复制到目标对象。它将返回目标对象
hss
2022/02/25
3010
JavaScript原型链与继承
只要是对象,一定有原型对象,就是说只要这个东西是个对象,那么一定有proto属性。(错的)
用户7043603
2022/02/26
1.6K0
JavaScript学习总结(四)——this、原型链、javascript面向对象
根据题目要求,对给定的文章进行摘要总结。
张果
2018/01/04
1.5K0
JavaScript学习总结(四)——this、原型链、javascript面向对象
10个例子,深入了解JavaScript
作为一门灵活的编程语言,JS中有很多缺陷,这很可能被人们所忽略,而产生很大的失误,在本文中,我们将通过10个容易出错的示例来学习JS语法的一些关键部分,有些甚至是现实世界中的错误,而某些示例则直接来自于JS的基本语法。
学前端
2020/04/07
5270
深入理解JavaScript中的堆与栈 、浅拷贝与深拷贝
学了这么长时间的JavaScript想必大家对浅拷贝和深拷贝还不太熟悉吧,今天在项目中既然用到了,早晚也要理清一下思路了,在了解之前,我们还是先从JavaScript的数据类型存放的位置 堆栈开始说起吧!
青梅煮码
2023/03/02
2420
Web前端学习 第3章 JavaScript基础教程2 变量与数据
如代码所示,我们可以通过var声明一个变量,var后面的英文字母就是变量名,变量名是自定义的,在一定的规则下我们可以随意命名(下一部分我们来讲命名规则)。
学习猿地
2020/06/16
3470
Web前端学习 第3章 JavaScript基础教程2 变量与数据
Web前端-JavaScript基础教程上
JavaScript是web前端开发的编程语言,大多数网站都使用到了JavaScript,所以我们要进行学习,JavaScript是必备的前端技能。
达达前端
2019/07/03
2.2K0
Web前端-JavaScript基础教程上
JavaScript 对象赋值和浅拷贝的区别
先看赋值,将一个对象赋值给一个新的对象的时候,赋的其实是该对象在栈中的地址,而不是堆中的数据。也就是一个对象的改变就会改变另外一个对象。
GopalFeng
2020/09/24
1K0
JavaScript 对象赋值和浅拷贝的区别
相关推荐
Web前端学习 第3章 JavaScript基础教程6 函数基础
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验