目录

介绍

背景

JavaScript数据类型

基本类型

基本类型的行为如何?

使用typeof运算符

语法类型

为什么null返回对象?

参考类型

创建对象

对象的行为如何?

销毁对象

基本类型和引用类型之间的区别

总结


介绍

在我看来,理解某种编程语言的类型至关重要,因为它是构建模块。这就是为什么在本文中,我们将看到JavaScript的内置类型以及基本类型和引用类型之间的区别。

而且,来自诸如C#之类的静态类型语言并跳转到JavaScript,由于其动态行为,我感到困惑。有趣的是,我在找类时发现它没有正式的支持。(您可能知道,Java/ c#等语言中的类在JavaScript中并不存在)起初很奇怪,但我已经习惯了。因此,我决定写这篇文章来帮助学生或开发人员分享我的知识和学习JavaScript类型的过程。

背景

当我开始使用JavaScript时,许多出色的开发人员都认为JavaScript没有类型。特别是那些来自强类型语言(例如C#,Java和C ++)的开发人员。那时,老实说,我不知道该说些什么,因为我还不那么了解。然而今天,如果您曾经遇到过或将要遇到这类开发人员,则可以将其指向JavaScript语言规范。我将在下面提供链接,并提供一些屏幕截图,其中指出JavaScript语言确实具有类型。

在撰写本文时,我们拥有“ECMAScript 2020语言规范”,可在此处找到。最后,让我们看看规范对类型必须说些什么。请查看以下屏幕截图:

希望这能节省您的时间。现在,足够了,让我们跳入JavaScript内置类型。

JavaScript数据类型

JavaScript语言有两种类型:基本类型和引用类型。基本类型(也称为值类型)存储为简单数据类型,而引用类型存储为对象,这意味着它持有对内存位置的引用。

当使用JavaScript并处理其不同类型,基本类型和引用时,它们看起来似乎相同,但事实并非如此。此外,为了使语言一致,您可以将基本类型视为引用类型。

这是JavaScript内置类型的列表:

  • boolean
  • number
  • bigint
  • string
  • null
  • undefined
  • symbol
  • object

基本类型

种类

描述

备注

Boolean

true或false| 1或0

Number

任何整数或浮点数值。任何双精度IEEE 754数字。

BigInt

大整数,甚至超出的安全整数的Number限制。

BigInt通过将A附加n到整数的末尾来创建A。
您可以在这里检查浏览器是否支持。

String

UTF-16字符串。由单引号或双引号分隔的字符序列。

Null

仅具有一个null值的特殊基本类型。

我之所以称其为特殊,是因为它会在后面的部分中进行讨论(为什么null 返回对象?)。

Undefined

仅具有一次值(未定义)的基本类型。

undefined关键字是分配给该未初始化的变量的值。

Symbol

独特而不变的值。

有关Symbol的更多信息,您可以在此处内容。

让我们在下面看到一些基本类型的示例:

//boolean
var iLoveJavaScript = true; //number
var yearsOfCoding = 10; //bigint
var bigIntSample = 1234567890987654321n;//string
var programmerName = "Jin Vincent Necesario";//null
var doesntPointToAny = null; //undefined
var badCompany; //undefined

基本类型的行为如何?

始终分配基本类型,然后复制值。

要实际查看行为,让我们看下面的示例:

var name1 = "Jin";
var name2 = name1;console.log(name1); //Jin
console.log(name2); //Jinname2 = "Vincent";console.log(name1); //Jin
console.log(name2); //Vincent

如果您想了解发生了什么,请参见下面的图1:

1

如您所见,变量name1和name2彼此完全分开,您可以更改name2中的值而不会影响name1,反之亦然。

使用typeof运算符

语法类型

//typeof operand
//or
//typeof(operand)

typeof操作符是标识以string格式返回类型的基本类型的最佳方法。操作数是表示基本类型或引用类型的表达式。

让我们看下面的一些例子:

//typeof operator without using the open and close parentheses
console.log(typeof true);                     //booleanconsole.log(typeof 10);                       //numberconsole.log(typeof bigIntSample);             //bigintconsole.log(typeof "Jin Vincent Necesario");  //stringconsole.log(typeof null);                     //object -> oops! more about this laterconsole.log(typeof undefined);                //undefined
//end typeof operator without using the open and close parentheses//typeof operator using the open and close parentheses
console.log(typeof(true));                    //booleanconsole.log(typeof(10));                      //numberconsole.log(typeof(bigIntSample));            //bigintconsole.log(typeof("Jin Vincent Necesario")); //stringconsole.log(typeof(null));                    //object -> oops! more about this laterconsole.log(typeof(undefined));               //undefined
//end typeof operator using the open and close parentheses

为什么null返回对象?

好的,您可能已经运行了上面的代码示例,并且想知道为什么null数据类型返回object。这是语言的棘手部分,即使是我,我一开始也很困惑,但是在这里没有任何疑问可以回答。

确实,这是一个错误,并且得到维护JavaScript语言的委员会TC39承认。这个错误没有修复的一个原因是,提议的修复破坏了许多现有的网站。因此,错误仍然存​​在。有关更多信息,请参见此处。

现在,我们已经知道了为什么会这样。确定价值是否为null的最好方法是什么?为此,您可以将null直接与其值进行比较。请参阅以下示例:

var myObject1 = null;
console.log(myObject1 === null); //true

参考类型

如果您来自其他语言,例如C#,Java或C ++,则引用类型是最接近类的内容。参考值是参考类型的实例。此外,引用类型不会将对象直接存储到为其分配了变量的变量中。因此,它拥有对内存中对象所在位置的引用。

创建对象

有多种方法可以用JavaScript创建对象。它们是:使用new运算符、对象文字和构造函数。

让我们看下面的例子:

var myObject2 = new Object(); //using the new operator
console.log(typeof(myObject2));//objectvar myObject3 = {};//using the object literal ({})
console.log(typeof (myObject3));//object//using the constructor function
function MyUnknownObject(property1, property2) {this.property1 = property1;this.property2 = property2;
}var myObject4 = new MyUnknownObject("JavaSript", 23);
console.log(typeof (myObject4));//object

对象的行为如何?

让我们看下面的例子:

var _object1 = new Object();
_object1.favoriteLanguage = "JavaScript";var _object2 = _object1; console.log(_object1);    //output:{favoriteLanguage: "JavaScript"}
console.log(_object2);    //output:{favoriteLanguage: "JavaScript"}_object1.favoriteLanguage = "C#";console.log(_object1);    //output: {favoriteLanguage: "C#"}
console.log(_object2);    //output: {favoriteLanguage: "C#"}

输出

如您所见,我们已经使用变量_object1声明了一个新object变量,并将其分配给_object2。结果,它们两个都引用相同的对象。这就是为什么对其中任何一个进行任何更改都具有相同效果的原因。

如果您想了解发生了什么,请参见下面的图2:

2

销毁对象

垃圾回收——不再使用对象时将其释放(垃圾回收)。JavaScript就是拥有这种内置特性的语言之一。因此,使用引用类型时,您实际上不必担心手动分配内存。

此外,您可能会产生错误的印象,即不需要尊重对象。因此,最好参照不再需要的对象。为了使垃圾收集器释放该内存空间。为了做到这一点,请将object变量设置为null。

基本类型和引用类型之间的区别

两者之间的主要区别在于基本类型直接包含其值。意思是,当您为变量分配基本值时,该值将被复制到该变量中。虽然引用类型不会将对象直接存储到分配给它的变量中。相反,它保留对内存中对象所在位置的引用。

总结

在本文中,我们解决了JavaScript基本和引用类型。我们首先列出了内置类型,并显示了基本类型和引用类型。此外,我们已经了解了如何使用typeof运算符以及如何创建和销毁object。最后,我们区分了基本类型和引用类型。

JavaScript基本类型和引用类型相关推荐

  1. JavaScript 基本类型和引用类型区别

    基本概念 JS有以下这些数据类型:undefined.null.string.boolean.number.symbol.bigint.object. 其中,前面 7 个被称为基本类型,又叫原始类型( ...

  2. javascript变量中基本类型和引用类型的详解解读

    前言: Javascript语言中的变量和其他语言的变量有很大区别,javascript松散类型的本质,决定了它只是在特定时间时间保存特定值得名字而已.由于不存在定义某个变量必须保存何种数据类型值的规 ...

  3. javascript中基本类型和引用类型的区别分析

    大多数人系统学习过的程序设计语言,在这些语言的学习过程中最早学到的几个要点之一就是值类型和引用类型的区别.下面我们来看一下在 JavaScript 中基本数据类型(Primitive Types)和引 ...

  4. java面向对象(类与对象,局部变量成员变量,基本类型和引用类型作为参数传递)...

    一.类和对象的区别 类是对某一类事物的抽象描述,而对象用于表示现实中该类事物的个体 可以将玩具模型看作是一个类,将一个个玩具看作对象,从玩具模型和玩具之间的关系便可以看出类与对象之间的关系.类用于描述 ...

  5. Java Native Interface 二 JNI中对Java基本类型和引用类型的处理

    本文是<The Java Native Interface Programmer's Guide and Specification>读书笔记 Java编程里会使用到两种类型:基本类型(如 ...

  6. 基本类型和引用类型的值 函数的传递参数

    ECMAScript中函数的传参都是按值传递的. 不管是传基本类型的值还是引用类型的值都是按值传递,访问变量则分按值和按引用两种方式. 向参数传递基本类型的值 被传递的值会被复制(对应文章<基本 ...

  7. 基本类型和引用类型区别

    目录 1.基本类型包括: 2. 引用类型包括: 3.基本类型 3.1 基本类型的值是不可变的 3.2基本类型的比较是值的比较 3.2.1基本类型的数据类型相同时 3.2.2基本类型的数据类型不同时 3 ...

  8. JS:基本类型和引用类型

    JS中的基本类型和引用类型 1.基本类型:number.boolean.string.undefined. null 2.引用类型:array.object.function.regexp- 一.基本 ...

  9. Java的数据类型-基本类型和引用类型

    道生一,一生二,二生三,三生万物------老子 二进制是道.基本类型是一.引用类型是二.框架是三.软件应用是万物------小虎哥. 0.基本类型和引用类型的区别 Java中的数据类型分为 基本类型 ...

最新文章

  1. MATLAB实战系列(十二)-如何用人工鱼群算法解决带时间窗车辆路径(CVRP)问题(附MATLAB代码)
  2. DATAGUARD 三种保护模式
  3. 如何提高自身监控系统的能力?
  4. 使用Automake和Autoconf生成Makefile
  5. strace命令_在软件部署中使用 strace 进行调试
  6. 升级核心产品,不和用户竞争,UCloud进军产业互联网差异化路线
  7. fastdfs暗转 linux_Linux下安装fastDFS
  8. linux7inittab文件不存在,Linux下修复inittab文件丢失的两种方法
  9. 【转】Symstore 详细使用
  10. C#区分中英文统计字符串的长度
  11. Servlet期末复习笔记
  12. steam怎么设公用计算机,steam怎么设置家庭共享 steam家庭共享设置方法
  13. 《Java开发实战经典》习题第3章第12题:使用for循环打印下面的图形(用for循环打印金字塔)
  14. 华为性格测试通关指南
  15. 20189222 《网络攻防实践》安全工具、库的简介以及使用教程
  16. 怎么用c语言编写单片机流水灯程序,单片机编程入门:单片机流水灯程序
  17. 如何VS Code打造成Java开发IDE?
  18. 都说DBA 是越老越值钱, 那你是没干过DBA
  19. flutter 设置全屏背景图(导航栏)
  20. VSCode-解决更新代码时报would clobber existing tag

热门文章

  1. python 灰度直方图_python3+opencv 使用灰度直方图来判断图片的亮暗操作
  2. hibernate mysql 注解_【译】Spring 4 + Hibernate 4 + Mysql + Maven集成例子(注解 + XML)
  3. string型c语言,C++中string字符串类型介绍
  4. python如何限制字符串长度_Python uuid4,如何限制唯一字符的长度 - python
  5. 打开程序并监听程序是否退出
  6. NVIDIA Tesla K40C 的各项性能参数
  7. Linux内核性能架构:perf_event
  8. 深入理解 Cilium 的 eBPF(XDP)收发包路径:数据包在Linux网络协议栈中的路径
  9. excel合并多个工作表_excel中汇总多个工作表数据的神器——合并计算
  10. 联想万全t260磁盘阵列_联想万全T260G3服务器安装windows2008R2系统