JavaScript】【Web前端基础】JavaScript简单数据类型和复杂数据类型有什么区别

2020-12-17 20:22发布

8条回答
我是大脸猫
2楼 · 2020-12-18 09:39

 

原始数据类型: number,string,boolean,undefined, null,object

基本类型(简单类型),值类型: number,string,boolean

复杂类型(引用类型):object

空类型:undefined,null


值类型的值在哪一块空间中存储? 栈中存储

引用类型的值在哪一块空间中存储?对象在堆上存储,地址在栈上存储


var num=10;//值类型,值在栈上

var obj={};//复杂类型,对象在堆,地址(引用)在栈


值类型之间传递,传递的是值

引用类型之间传递,传递的是地址(引用)


值类型作为函数的参数,传递的是值

引用类型作为函数的参数,传递的是地址  

复制代码

function Person(name,age,salary) {      this.name = name;      this.age = age;      this.salary = salary;
    }    function f1(person) {
      person.name = "ls";
      person = new Person("aa",18,10);
    }    var p = new Person("zs",18,1000);
    console.log(p.name);//zs    f1(p);
    console.log(p.name);//is



小磊子
3楼 · 2020-12-18 09:59
一,简单类型又叫做基本数据类型或者值类型,复杂类型又叫做引用类型。

1.值类型:简单数据类型/基本数据类型,在存储时变量中存储的是值本身,因此叫做值类型string,number,boolean,undefined,null

2.引用类型:复杂数据类型,在存储时变量中存储的仅仅是地址(引用),因此叫做引用数据类型通过new关键字创建的对象(系统对象、自定义对象),如Object、Array、Date等

二,堆栈空间分配区别:

1、栈(操作系统):由操作系统自动分配释放存放函数的参数值、局部变量的值等。其操作方式类似于数据结构中的栈。简单数据类型存放到栈里面
2、堆(操作系统):存储复杂类型(对象),一般由程序员分配释放,若程序员不释放,由垃圾回收机制回收。复杂数据类型存放到堆里面

注意:JavaScript中没有堆栈的概念,通过堆栈的方式,可以让大家更容易理解代码的一些执行方式,便于将来学习其他语言。(只是隐含堆和栈的功能)

三,简单类型的内存分配

      一.值类型(简单数据类型):string,number,boolean,undefined,null
      二.值类型变量的数据直接存放在变量(栈空间)中
在这里插入图片描述

四,复杂类型的内存分配

      一.引用类型(复杂数据类型):通过new关键字创建的对象(系统对象、自定义对象),如Object、Array、Date等
      二.引用类型变量(栈空间)里存放的是地址,真正的对象实例存放在堆空间中
在这里插入图片描述
下图是两个的详细辨析
在这里插入图片描述

五,简单类型传参

函数的形参也可以看做是一个变量,当我们把一个值类型变量作为参数传给函数的形参时,其实是把变量在栈空间里的值复制了一份给形参,那么在方法内部对形参做任何修改,都不会影响到的外部变量。

下面我们放两个例子

// 第一个var num = 10;num = 20;console.log(num);-----------------------// 第二个function fn(a){
 a++; 
 console.log(a); }varx = 10; fn(x); console.log(x);123456789101112131415

在这里插入图片描述

六,复杂类型传参

函数的形参也可以看做是一个变量,当我们把引用类型变量传给形参时,其实是把变量在栈空间里保存的堆地址复制给了形参,形参和实参其实保存的是同一个堆地址,所以操作的是同一个对象。

function Person(name){
 this.name = name;}function f1(x){ // x=p 
 console.log(x.name); // 2.这个输出什么?
 x.name = "张学友";
 console.log(x.name); // 3.这个输出什么?}var p=new Person("刘德华"); console.log(p.name); // 1,这个输出什么?f1(p);console.1og(p.name); // 4.这个输出什么?123456789101112

在这里插入图片描述


aijingda
4楼 · 2020-12-18 13:49

简单类型和复杂类型的区别

  • 基本类型又叫做值类型,复杂类型又叫做引用类型

  • 值类型:简单数据类型,基本数据类型,在存储时,变量中存储的是值本身,因此叫做值 类型

  • 引用类型:复杂数据类型,在存储时,变量中存储的仅仅是地址(引用),因此叫做引用 数据类型

简单类型在内存中的存储

  • 变量中如果存储的是简单类型的数据,那么变量中存储的是值本身,如果将变量赋值给另一 个变量,是将内部的值复制一份给了另一个变量,两个变量之间没有联系,一个变化,另一 个不会同时变化

[removed]
    // 基础数据类型
    var a = 5; 
    var b = a; // 将 a 内部储存的数据 5 复制了一份给 b
    a = 10;
    console.log(a); // 10
    console.log(b); // 5
[removed]

复杂类型在内存中的存储

如果将复杂类型的数据赋值给一个变量,复杂类型的数据会在内存中创建一个原型,而变量 中存储的是指向对象的一个地址,如果将变量赋值给另一个变量,相当于将地址复制一份给了新的变量,两个变量的地址相同,指向的是同一个原型,不论通过哪个地址更改了原型,都是在原型上发生的更改,两个变量下次访问时,都会发生变化

[removed]
    // 复杂数据类型    var p = {name: "wth", age: 18, sex: true};
    var p1 = p; // p 将内部储存的指定对象原型的地址复制给了 p    // 两个变量之间是一个联动的关系,一个变化,会引起另一个变化    p.name = "www";
    console.log(p);
    console.log(p1);

    // 数组和函数存储在变量中是,也是储存的地址    var arr = [1, 2, 3, 4];
    var arr2 = arr;
    arr[4] = 5;
    console.log(arr);
    console.log(arr2);[removed]


奥利给
5楼 · 2020-12-18 19:58

原始数据类型: number,string,boolean,undefined, null,object

基本类型(简单类型),值类型: number,string,boolean

复杂类型(引用类型):object

空类型:undefined,null


   值类型的值在哪一块空间中存储? 栈中存储

   引用类型的值在哪一块空间中存储?对象在堆上存储,地址在栈上存储


   var num=10;//值类型,值在栈上

   var obj={};//复杂类型,对象在堆,地址(引用)在栈


   值类型之间传递,传递的是值

   引用类型之间传递,传递的是地址(引用)


   值类型作为函数的参数,传递的是值

   引用类型作为函数的参数,传递的是地址 


梵梵
6楼 · 2020-12-19 15:19

1.简单数据类型和复杂数据类型

简单类型又叫做基本数据类型或者值类型  复杂类型又叫做引用类型

值类型:简单数据类型或者基本数据类型 在存储时变量中存储的是值本身 因此叫做值类型

string number boolean undefined null

但是如果你使用 typeof(null) 你会发现返回的是一个空的对象Object

如果有个变量我们想要存储为对象 但是暂时没想好做什么 这个时候我们可以用null

引用类型:复杂数据类型 在存储时变量中存储的仅仅是地址(引用) 因此叫做引用数据类型

通过new 关键字创建的对象(系统对象 自定义对象) 如 Object Array Date等

2.堆和栈

堆栈空间分配区别

1.栈(操作系统) 由操作系统自动分配释放 存放函数的参数值 局部变量的值等 其操作方式类似于数据结构中的栈

简单数据类型存放到栈里面

2.堆(操作系统) 存放复杂的数据类型(对象) 一般由程序员分配释放 若程序员不释放 由垃圾回收机制回收

复杂数据类型存放到堆里面

但是JS中没有堆栈的概念 

简单数据类型 是存放在栈里面 里面直接开辟一个空间存放的值。

复杂数据类型 首先在栈里面存放地址(16进制表示) 这个地址指向堆里面的数据。


简单类型的传参和复杂类型的传参

函数的形参也可以看作是一个变量 当我们把一个值类型作为参数传递给函数的形参时 其实是把变量在栈中的值复制

一份给形参 那么在方法内部对形参做任何修改 都不会影响到外部变量

当我们把一个复杂类型给传参时 其实是把栈中存放的指向值的地址复制给了形参 形参和实参其实指向的是堆里的同一个值

所以操作的是同一个对象。


灰机带翅膀
7楼 · 2020-12-20 09:27

1.在内存中的存储方式

基本数据类型把数据名和值直接存储在栈当中

复杂数据类型在栈中存储数据名和一个堆的地址,在堆中存储属性及值。访问时先从栈获取地址,再到堆中拿出相应的值。

2.不同数据类型作为参数时 函数内部对参数的修改是否改变外部变量的值

(1)基本数据类型作为参数时,函数内部对参数值的修改不会改变外部变量的值

function a(s){//定义以s为参数的函数,返回s的值
    s=100;
    return s;
    }
    var y=1;
    a(y);//y作为参数调用函数a
    console.log(y);//y还是为1

结果还是1因为把y的值给s时是简单的复制了一份,y和s可以单独操作不相互影响

(2)复杂数据类型作为参数时,函数内部对参数值的修改会改变外部变量的值

因为复杂数据类型赋值是把栈中对象的地址赋给变量,函数内外两个变量指向同一个对象,所以只要对象的属性值改变,两个变量值都会改变

function student(age,name,agrde){
    this.age=age;
    this.name=name;
    this.score=agrde;
    }

    var s1=new student(18,"wjq",2);//创建一个student对象

    function a(s){
    s.name="xxx";
    }
    a(s1)//把s1赋给s
    console.log(s1.name);//输出xxx

所以要弄懂js中简单数据类型和复杂数据类型的区别,关键还要搞懂两个在内存中的存储过程。




清屿
8楼 · 2020-12-20 18:46

简单数据类型:包括类型number  string  Boolean  undifined  null

复杂数据类型:又称为引用类型,包括Object  Array  Date  function


summermo
9楼 · 2021-01-27 11:16

简单数据类型:number、string、boolean、null、undefined

复杂数据类型:object、array、function


主要的区别还是在于值的传递行为上


简单的数据类型:值传递,也就是说,当一个变量的值被定义了,这个值存储在的是内存中的栈空间,并且赋值个给了另一个变量,一个变量的值修改了,不会影响另一个变量,因为两个变量存储的是不同的内存地址


复杂数据类型:址传递,也就是说,数组以及对象的结构被定义在了栈内存中,其中的数据被存储到了堆内存中,当一个变量的值被赋值给了另一个变量,那么这两个变量传递的就是栈内存中的地址,当这个地址中的数据发生改变的话,那么被引用这个地址中的变量,无论有多少个,都会受影响


相关问题推荐

  • 回答 8

    向一个对象数组里面添加新的属性var arry= [{a:11,b:22,c:33,d:44},{a:11,b:0,c:0,d:44},{a:11,b:22,c:99,d:99}];var arry2=[];arry.map(((item, index)=> {arry2.push(Object.assign({},item,{mess1:item.c,mess2:item.d}))}))cons...

  • 回答 2

    我觉得getTopWindow() 应该是他自己写的函数 mask  应该是getTopWindow()函数中 return 出的一个什么玩意show()  jQuery的显示

  • 回答 9

    如图所示

  • 回答 12

    1、原型对象也是普通的对象,是对象一个自带隐式的 __proto__ 属性,原型也有可能有自己的原型,如果一个原型对象的原型不为 null 的话,我们就称之为原型链 2、 原型链是由一些用来继承和共享属性的对象组成的(有限的)对象链...

  • 回答 6

    使用VS code对JS进行Debug,需要安装一个插件,这个插件是根据你所使用的浏览器来的,不同浏览器对应插件不同,以下是插件对应情况,下载完相应的插件以后还要下载一个live server在浏览器下查看你界面运行效果,记得在到设置里修改下live server的端口号,然...

  • 回答 8
    已采纳

    没有基础,是可以学Java的,在网上也能找到很多免费的视频、学习资料等资源,只不过想要光靠自己摸索学透Java并不容易,最好是找一个比较靠谱的有实训的培训机构。不过,我给你点建议:1.脑子里要有编程思维,2.学习态度要有,3.了解了基本概念后,从图形界面...

  • 回答 7

    假设文本框的id=text1js:document.getElementById(text1).value = 测试;//即可

  • 回答 2

    这两个事件都是在js原生开发时经常会用到的,比如需要对页面dom进行动态处理,这时就需要用到DOMContentLoaded和[removed]事件,大家都知道,就是在dom构建完毕后,才可以对dom元素进行操作,否则会获取不到相应的dom元素,但是DOMContentLoaded和[removed]还...

  • 回答 11

    基本概念CookieCookie 是小甜饼的意思。顾名思义,cookie 确实非常小,它的大小限制为4KB左右。它的主要用途有保存登录信息,比如你登录某个网站市场可以看到记住密码,这通常就是通过在 Cookie 中存入一段辨别用户身份的数据来实现的。localStoragelocalStor...

  • 回答 2

    在vscode 头疼的问题是 用浏览器查看网页!会是以文件夹的方式打开的!  我遇到这个问题 我还重新配置了Apache    ! 但是现在可以解决:使用vscode  ==================== 打开cmd   : 在cmd 控制台中输入  :   1.运行cnpm install live-server...

  • 回答 1

    在进行对象之间的合并的时候,就会使用到extend方法进行合并语法结构:$.extend(true,{},对象1,对象2...)但是这里需要考虑一个问题,如果对象间有相同的属性名,就会涉及到哪一个对象和哪一个对象的值覆盖合并的问题,如果对象中的属性值还是一个对象的话,那...

  • 回答 5
    已采纳

    先说下要实现什么功能,比如:限制图片大小不能超过30K,宽高为121x75上面需求提了,然后我直接把代码给你放出来,可以照着下面代码敲一遍试试就知道怎么限制图片宽高了 $(#picFile4).on(change,function(){ var imgFile = this.files[0]; va...

  • 回答 3

    用python爬取近30天百度指数代码均转载,如下:#1.登录url = ‘http://index.baidu.com/’driver = webdriver.Chrome(executable_path=‘C:/Program Files(x86)/Google/Chrome/Application/chromedriver.exe’)driver.get(url)cookieList = [......

  • 回答 7

    基本类型基本类型分为以下六种:string(字符串)boolean(布尔值)number(数字)symbol(符号)null(空值)undefined(未定义)注意:string 、number 、boolean 和 null  undefined 这五种类型统称为原始类型(Primitive),表示不能再细分下去的基本类...

  • 回答 11

    实体类中添加时间转换注解(注意时区问题)12345/**  * 开始时间  */ @JsonFormat(pattern = yyyy-MM-dd HH:mm:ss, timezone=GMT+8) private Date startTime;

  • 回答 5

    实例中包含加、减、乘、除四种运算,由于先乘和除的优先级别高,所以乘和除将首先被运算,接下来是加和减运算。乘和除优先级相同,所以左边的乘法将被先执行,然后是除法,接下来按从左到右的顺序进行加减运算...

没有解决我的问题,去提问