JS中的数据类型可以这样分类:
原始数据类型: number, string ,boolean, undefined, null, symbol

  • 基本类型(简单类型):

    • 值类型: number((整数/小数/NaN));string,boolean
    • 空类型:null,undefined
    • 还有 symbol (ES6)
  • 复杂类型(引用类型):object

基本数据类型

JavaScript 中共有 6 种基本数据类型:undefined、null、boolean、number、string、symbol (new in ES 6) 。

  1. 访问基本数据类型是按值访问的。

    • 基本类型的值不可变
    var str = "123HelloWorld321";str.toUpperCase();
    console.log(str.toUpperCase());  // 123HELLOWORLD321
    console.log(str);      // 123HelloWorld321
    
    1. 基本类型的比较是它们的值的比较
     var a = 1;var b = '1';console.log(a == b);    // trueconsole.log(a === b);   // false
    

    上面 a 和 b 的数据类型不同,但是也可以进行值的比较,这是因为在比较之前,自动进行了数据类型的 隐式转换。

    1. 基本类型的变量存放在栈内存里
    var a = 10;
    var b = a;
    b = 20;
    console.log(a);
    console.log(b);
    


b获取的是a值的一个副本,虽然两个变量的值相等,但是两个变量保存了两个不同的基本数据类型值。所以b值的改变不会影响a的值。

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

    function f1(x) {x=100;}var num1=10;f1(num1);   //num1的值复制了一份给了x,然后 x被重新赋值为100, x的值变了,但是num1的值没有变,console.log(num1); // num1的值还是 10
    

引用数据类型

Object 类型,细分的话有:Object 类型、Array 类型、Date 类型、RegExp 类型、Function 类型等。

  1. 引用类型的值是按引用来访问的。

    1. 引用类型的值是可变的。
    var obj = {name:"lmg"};   // 创建一个对象
    obj.name = "xiaoming";       // 改变 name 属性的值
    obj.age = 18;             // 添加 age 属性
    obj.sayHi = function(){return this.name + " : " + this.age;
    };                        // 添加 sayHi 方法
    obj.sayHi();
    
    1. 引用类型的比较是引用的比较
    var obj1 = {};    // 新建一个空对象 obj1
    var obj2 = {};    // 新建一个空对象 obj2
    console.log(obj1 == obj2);    // false
    console.log(obj1 === obj2);   // false
    

    obj1 和 obj2 分别引用的是存放在堆内存中的2个不同的对象,故变量 obj1 和 obj2 的值(引用地址)也是不一样的。

    1. 引用类型的值是保存在堆内存中的对象
    var a = {name:"percy"};
    var b;
    b = a;
    a.name = "zyj";
    console.log(b.name);    // zyj
    b.age = 22;
    console.log(a.age);     // 22
    var c = {name: "zyj",age: 22
    };
    

    图解:

    注:栈内存中保存了变量标识符和指向堆内存中该对象的指针。堆内存中保存了对象的内容。

    1. 引用类型作为函数的参数,传递的是引用(地址)
    var obj={name:'xiaoming'
    };
    function f2(obj2) {obj2.name='xiaohong';
    }
    console.log(obj.name);  //xiaoming
    f2(obj); //obj的地址复制一份给了obj2,地址相同,指向同一对象, 调用时name改成了xiaohong,xiaoming就被替换掉了,
    console.log(obj.name); // xiaohong
    

案例分析:

 //案例1分析: 会画缓存图var n1=10;var n2=n1;n1=20;console.log(n1); //20console.log(n2);  //10
//案例2:var n3=50;function ff(n3) {  // 这里的n3是形参, 实参与形参即使名字相同。也不是同一个变量n3=60;console.log(n3); //60}ff(n3);  //注意:这里的n3是实参console.log(n3); //这里是函数外的n3,为50,  函数里面的n3是没有关系的
//案例3:var n4=55;var n5=66;function f_(n,n4) {  //n,n4在函数内部是局部变量n=100;  //局部变量,它的传进来的值对应外面的n4, 55n4=100;  //局部变量,它的传进来的值对应外面的n5, 66n5=100; //注意:!!隐式全局变量!!console.log(n);    // 100console.log(n4);  // 100console.log(n5);  // 100}f_(n4,n5);console.log(n4); // 55, 这个是全局变量n4console.log(n5);// 100,这个是函数中的隐式全局变量console.log(n); // ReferenceError: n is not defined报错:这个是函数中的局部变量,访问不到
//案例4:function Person(name,age,salary) {  //自定义构造函数this.name=name;this.age=age;this.salary=salary;}function fff(person) { //创建了普通的函数person.name='ls';  //name修改了, 变成了lsperson=new Person('aa',18,10);  //新创建的一个对象,person指向了这个对象,  person 和p指向的对象不同了}var p = new Person('zs',18,1000);console.log(p.name); //zsfff(p); //函数调用,对象p的地址复制一份给person,所以他们指向同一个对象console.log(p.name);  //ls

数据类型的检测方法:typeof 与 instanceof

  1. typeof: 主要用来检测一个变量是不是一个基本的数据类型,返回的是具体的数据类型。

    var a;
    console.log(typeof a); //undefined 输出的这些类型都是小写的字符串var b = null;
    console.log(typeof b); // object 注意var c = 123;
    console.log(typeof c); // numbervar d = '123';
    console.log(typeof d); // stringvar e = true;
    console.log(typeof e); // booleanvar f = Symbol();
    console.log(typeof f); // symbolvar g = function () {  console.log(g);
    };
    console.log(typeof g); // functionvar h = [];
    console.log(typeof h); // objectvar i = {};
    console.log(typeof i); // objectvar j = /123/g;
    console.log(typeof j); // object
    
  2. instanceof:判断一个引用类型的变量具体是不是某种类型的对象,返回的是布尔值。

    console.log(g instanceof Function); // true
    console.log(h instanceof Array); // true
    console.log(i instanceof Object); // true
    console.log(j instanceof RegExp); // true
    

参考:
JavaScript 深入了解基本类型和引用类型的值

JavaScript中基本数据类型和引用数据类型的区别

JS中的基本数据类型与引用数据类型相关推荐

  1. JavaScript中的基本数据类型与引用数据类型

    JavaScript中的基本数据类型与引用数据类型 转载自:https://www.cnblogs.com/c2016c/articles/9328725.html 1.栈(stack)和堆(heap ...

  2. ie9无法获取未定义或 null 引用的属性“indexof”_前端JS基础篇(二)JS基本数据类型和引用数据类型及检测数据类型方法...

    JS中的数据类型 (一).基本数据类型(值类型) 1.number:数字 -12.12.5.-12.5 0这些数字都是number: js中增加了一个number类型的数据:'NaN' typeof ...

  3. js 基本数据类型和引用数据类型

    1.数据类型 JS分两种数据类型: 基本数据类型:Number.String.Boolean.Null. Undefined.Symbol(ES6),这些类型可以直接操作保存在变量中的实际值. 引用数 ...

  4. js基本数据类型和引用数据类型有什么区别?

    js基本数据类型和引用数据类型有什么区别? 1.基本数据类型和引用数据类型包括哪些? 基本数据类型: 在javascript中,有6种基本数据类型:string.number.boolean.null ...

  5. java 数据类型分为_JAVA中分为基本数据类型及引用数据类型

    byte:Java中最小的数据类型,在内存中占8位(bit),即1个字节,取值范围-128~127,默认值0 short:短整型,在内存中占16位,即2个字节,取值范围-32768~32717,默认值 ...

  6. java中数组的返回值是什么类型_java基础学习:数组的常用操作与基础二维数组用法、及基本数据类型和引用数据类型赋值的区别...

    一.Arrays jdk中为了便于开发,给开发者提供了Arrays类,其中包含了很多数组的常用操作.例如快速输出.排序.查找等. 1.数组的常用方法 1.数组以字符串形式的输出,2.sort对数组排序 ...

  7. [转载] JAVA中分为基本数据类型及引用数据类型

    参考链接: C++和Java中布尔数据类型的比较 一.基本数据类型: byte:Java中最小的数据类型,在内存中占8位(bit),即1个字节,取值范围-128~127,默认值0 short:短整型, ...

  8. Java中的基本数据类型和引用数据类型

    一.数据类型 Java中的数据类型分为两大类,基本数据类型和引用数据类型. 1.基本数据类型 基本数据类型只有8种,可按照如下分类 ①整数类型:long.int.short.byte ②浮点类型:fl ...

  9. JavaScript中基本数据类型和引用数据类型的区别

    1.基本数据类型和引用数据类型 ECMAScript包括两个不同类型的值:基本数据类型和引用数据类型. 基本数据类型指的是简单的数据段,引用数据类型指的是有多个值构成的对象. 当我们把变量赋值给一个变 ...

最新文章

  1. appium ios 真机自动化环境搭建
  2. java 循环查询list_Java用list储存,遍历,查询指定信息过程详解
  3. 手机的小窗口怎么弄_荣耀9X如何设置桌面小工具?划重点,这个要考
  4. [UE4]响应鼠标点击
  5. iphone11没有电池小组加件_iPhone 11系列工信部数据:全系4GB运存电池最大达3969mAh...
  6. Spark Shuffle 堆外内存溢出问题与解决(Shuffle通信原理)
  7. 快速排序算法之我见(附上C代码)
  8. 线性可分支持向量机与硬间隔最大化
  9. Missing artifact com.oracle:ojdbc7:jar:12.1.0.1. 配置maven.pom.xml,ojdbc.jar包出错
  10. 批处理文件(bat文件)注册dll批量注册dll
  11. 中兴2021批笔试题解
  12. 《东周列国志》第四十九回 公子鲍厚施买国 齐懿公竹池遇变
  13. 新概念英语第二册课文电子版_新概念英语第二册:课文+音频+教学视频合集(可下载)...
  14. ios7禁止屏幕旋转,强制竖屏
  15. 【经验分享】用PS如何将图片的四角做成圆弧角
  16. JavaScript 浏览器端 this的指向性问题
  17. 健身为什么要吃肌酸!肌酸四大作用
  18. LNK1181:无法打开输入文件“release/.obj“
  19. 【KATA练习日记】关于std::accumulate的使用
  20. 西邮Linux兴趣小组纳新笔试试题

热门文章

  1. JQuery AJAX 加载 HTML代码“lt”形式的。怎么解析成形式,并且把img解析成图片输出到浏览器中。...
  2. 利用优先级队列实现堆栈
  3. 12 个提高JavaScript编码效率的 NPM 技巧
  4. Python-DDoS攻击
  5. Java 11新特性
  6. Spring Data MongoDB示例
  7. ASP.NET CORE 使用Consul实现服务治理与健康检查(2)——源码篇
  8. kafka2.3.1+zookeeper3.5.6+kafka-manager2.0.0.2集群部署(centos7.7)
  9. 【记录】Docker 安装 activemq
  10. checksec未完待续~