浅谈Java和JavaScript中变量和数据类型的区别
对于一门编程语言的学习,如果第一步是安装环境,那么第二步一定是学习这门语言的基本规则,变量和数据类型则首当其冲
JavaScipt作为一个蹭Java热度而命名的语言,在很多方面和Java也有一定的相似之处
所以在我决定整理复习Java知识的时候,我希望通过一篇对比的文章,来顺便复习一下JavaScipt
当然还有一个理由就是,纯写Java或者纯写JavaScipt的文章,很多人都做过了,再写着实没什么意思
设计区别
- Java是一种完全面向对象的编程语言,想要运用Java写东西就必须先设计对象;
而JavaScript不一样,它是基于对象的一种脚本语言,它为开发者自带提供了很多内部对象,要更为简易省时 - Java采用静态联编,Java的对象引用必须在编译时就进行,编译器需要实现强类型检查;
而JavaScript不同,它采用动态联编,它的对象引用可以在运行时检查 - 它们最本质的不同就是用途,Java目前被广泛应用于PC端、手机端、互联网、数据中心等等;
而JavaScript则被主要用于嵌入文本到HTML页面,读写HTML元素,控制cookies等 - 设计区别中的内容参考了这篇博文 —— Java跟JavaScript两者间的关系和区别
关于变量
- 不同之处
- 在Java中,因为其强类型语言的特性,声明变量需要明确该变量的类型,内存管理系统根据变量的类型为变量分配存储空间
- 在JavaScript中,声明变量不需要指定变量类型,只需使用
var关键字;
不过在ES6的后续计划中,添加了let和const两个关键字用于声明不同作用的变量,但是依旧不需要声明变量类型 - 而且JavaScipt中的变量可以存储其他类型的变量的值,但是在Java中则有明确的类型要求,不过部分可以通过类型转换来存储其他类型的值
- 值得一提的是,虽然JavaScript不要求声明变量类型,但是可以通过
new关键字来声明其类型
- 相同之处
- 变量是用于存储信息的容器,所以他们都是需要申请内存来存储值,通过变量名可以引用值,也可以修改变量名的值
- 都是等号右边赋值给等号左边
- 命名规则基本一致,具体参考下面的文章 Java和JavaScript命名规则
++a代表取++运算之后的值,a++表示取++运算之前的值
Java和JavaScript命名规则
- 变量命名必须以字母、下划线
_或者$为开头,其他字符可以是字母、_、$或数字 - 变量名中不允许使用空格和其他标点符号,首个字不能为数字,参考第一条
- 变量名长度不能超过255个字符注意!!!这是JavaScript的规则,Java参考各个类型的大小范围
- 变量名区分大小写,建议驼峰命名法
- 变量名必须放在同一行中
- 不能使用关键字,分别具体是哪些自行百度
- 参考博文
关于数据类型
- 不同之处
- 提供的数据类型不同,具体可以参考下面 Java数据类型 & JavaScript数据类型 两篇文章
- 类型转换并不相同,具体可以参考下面 Java中的类型转换规则 & JavaScript中的类型转换规则 两篇文章
- 相同之处
- 在Java和JavaScript中都分为基本数据类型和引用数据类型两种
Java数据类型
- 基本数据类型
- 8种基本类型,注意!!!下面括号是默认值
- 6种数字类型,其中4个整数型
byte(0b)&short(0s)&int(0)&long(0L),2个浮点型float(0.0f)&double(0.0d) - 1种字符类型
char(无默认值,大小范围是\u0000-\uffff,等效十进制0~65535),
关于char值需要提一句的是,字符A的十进制值是65,字符a的十进制值是97,后续字母依次每个加一,
有个概念叫ascii码有兴趣的可以深入了解下 - 1种布尔类型
boolean(false) - 注意!!!数字类型的结尾字母不需要考虑大小写,都可以
- 在计算机中负数由补码进行表示,
补码 = 源码取反 + 1,举个例子:
22,在计算机中的表示为:00010110;-22,取反:11101001,加1:11101010
- 引用数据类型
- String、对象、数组、类、接口 & .etc
- 所有引用类型的默认值都是
null - 一个引用变量可以用来引用任何与之兼容的类型
JavaScript数据类型
- 基本数据类型
- 字符串
String,单引号双引号包裹都可以 - 数字
Number,不分整数和小数,说实话这点写起来比Java爽,但是会有危险 - 布尔
Boolean,true/false - 空
Null,可以将变量值设置为null来清空值 - 未定义
Undefined,表示变量不含有值 Symbol,ES6中添加的新类型
- 字符串
- 引用数据类型
- 对象
Object,由花括号分隔,在括号内部,对象的属性以名称和值对的形式name:value来定义,属性由逗号分隔 - 数组
Array,new一个或者直接赋值(隐式创建) - 日期
Date,主要是日期时间的一些操作,不过日常工作中习惯用momentjs处理日期和时间
- 对象
- 需要注意的一点
- JavaScript中的类型是针对值来说,而不是针对变量
Java中的类型转换规则
- 隐式(默认)类型转换
- 基本类型的默认转换规则
byte/short/char -> int -> long -> float -> double - 当
byte/short/char相互之间不能转换,它们参与运算首先将转换成int类型再进行运算 - 数字和字符串相加,数字会自动装换成字符串
- 基本类型的默认转换规则
- 显示(强制)类型转换
目标类型 变量名 = (目标类型)被转换的类型- 容量大的数据类型转换为容量小的数据类型时,要加上强制转换符,但可能造成精度降低或溢出
- 有多种类型的数据混合运算时,系统首先自动的将所有数据转换成容量最大的那一种数据类型,然后再进行计算
- 有趣的例子
- 提问:Java是如何处理强制类型转换的溢出处理呢?
byte a = (byte)130- 答:在计算机中,所有的数据都是存储的补码形式,那么130首先被当成int型存储,四个字节32位,
它的补码如下:0000 0000 0000 0000 0000 0000 1000 0010,转换为byte类型,进行截取,
高字节部分去除,保留低字节部分,得到转换为byte类型的补码为:1000 0010,
我们将其转换为源码:补码(1000 0010)-> 反码(1000 0001)-> 原码(1111 1110)为 -126,所以最后的答案是-126 - 参考资料
JavaScript中的类型转换规则
JavaScript是弱类型语言,变量类型完全由当前值决定,这种类型就叫弱类型。
首先要记住的是,JavaScript中的类型转化,它得到的结果永远是基本类型,也就可以分为两种情况,
基本类型和基本类型之间的转化,引用类型转化为基本类型,不可能出现基本类型转化为引用类型,
类型转化出现最多就是转化成Number, String, 和Boolean
Java中的主动类型转换常用方法
这里感觉可以另外写一个专题博文,后期再补档,到时候再补个链接过来,有兴趣的同学可以先阅读这篇文章
JavaScript中的主动类型转换常用方法
- 将其他类型值(数字、布尔、日期)转字符串,一把都是用
toString() - 字符串转数字,
parseInt()转换成整数,parseFloat()转换成浮点数,整数和浮点数都是Number类型 - 将布尔转换成数字可以使用方法
Number() - 当JavaScript尝试操作一个错误的数据类型时,会自动转换为正确的数据类型
- 举个例子:
5 + null // 返回数字5,null 转换为 0 - 举个例子:
'5' + null // 返回字符串5null,null 转换为 'null' - 其他例子就是字符串类型数字和数字类型数字之间的运算都会转成数字运算
- 举个例子:
- 将其他类型值转换成布尔值类型
- 原始类型值转换方法,这六个类型
undefined/null/-0/0/NaN/空字符串全部为false,其他全部为true - 所有对象的布尔值都是
true,甚至false对应的布尔值对象也是true,空对象空数组也都是true - 举个例子:
console.log(Boolean(new Boolean(false))) // 输出true
- 原始类型值转换方法,这六个类型
- 隐式类型的转换是系统进行运算时自动进行的,但是调用的方法都是显式类型转换的方法
- 一元运算符
+可以隐式的将字符串转为数字,如果变量不能转换成数字,他仍会成为一个数字,但值会是NaN,
举个例子:var a = 5; console.log(c = +a); // 输出数字5,
举个例子:var b = 'abc'; console.log(b = +abc); // 输出NaN - * / %(减号、乘号、除号、取余运算符)运算时会通过Number()把数据转换成Number类型后,再进行运算&& || !(与或非运算符)运算时会通过Boolean()把数据转换成Boolean类型后,再进行运算< > <= >= == !=(比较运算符)运算时,当数字和字符串比较大小时,会隐示将字符串转换成Number类型进行比较,
而当字符串和字符串比较大小时,则比较的是ascii码的大小,最后返回的则是布尔值- 注意!!!比较运算符中
undefined和null是不会发生类型转换的,只有相等的值会返回true - 注意!!! 全局
isNaN()函数会将测试值通过Number()转换为数字,然后对其进行测试,
但是Number.isNaN()不会将值转换为数字,并且不会为任何非数字类型的值返回true
- 一元运算符
- 如果用
==来判断两个数值是否相等,由于会发生隐式类型转换,所以是非常存在非常大的漏洞的,
为了解决这一问题,引入了===(绝对等于)和!==(绝对不等于) - 参考资料一、参考资料二
我是 fx67ll.com,如果您发现本文有什么错误,欢迎在评论区讨论指正,感谢您的阅读!
如果您喜欢这篇文章,欢迎访问我的 本文github仓库地址,为我点一颗Star,Thanks~
转发请注明参考文章地址,非常感谢!!!
浅谈Java和JavaScript中变量和数据类型的区别的更多相关文章
- [原创]浅谈JAVA在ACM中的应用
由于java里面有一些东西比c/c++方便(尤其是大数据高精度问题,备受广大ACMer欢迎),所以就可以灵活运用这三种来实现编程,下面是我自己在各种大牛那里总结了一些,同时加上自己平时遇到的一些jav ...
- 浅谈Java虚拟机内存中的对象创建,内存布局,访问定位
参考于 深入理解Java虚拟机 这里介绍HotSpot虚拟机(自带的虚拟机) 1.对象的创建 对于程序员来说,创建对象的方法: User user1 = new User(); User user2 ...
- 浅谈JAVA继承关系中的构造函数
话不多说直接上例子,我的例子中定义了两个类,TheSon和TheFather,TheSon继承了TheFather,如图: TheSon类的定义: TheFather类的定义: 当我们初始化The ...
- 浅谈Java中的equals和==(转)
浅谈Java中的equals和== 在初学Java时,可能会经常碰到下面的代码: 1 String str1 = new String("hello"); 2 String str ...
- 浅谈Java中的对象和引用
浅谈Java中的对象和对象引用 在Java中,有一组名词经常一起出现,它们就是“对象和对象引用”,很多朋友在初学Java的时候可能经常会混淆这2个概念,觉得它们是一回事,事实上则不然.今天我们就来一起 ...
- 浅谈Java中的equals和==
浅谈Java中的equals和== 在初学Java时,可能会经常碰到下面的代码: String str1 = new String("hello"); String str2 = ...
- 浅谈Java中的深拷贝和浅拷贝(转载)
浅谈Java中的深拷贝和浅拷贝(转载) 原文链接: http://blog.csdn.net/tounaobun/article/details/8491392 假如说你想复制一个简单变量.很简单: ...
- 浅谈Java中的深拷贝和浅拷贝
转载: 浅谈Java中的深拷贝和浅拷贝 假如说你想复制一个简单变量.很简单: int apples = 5; int pears = apples; 不仅仅是int类型,其它七种原始数据类型(bool ...
- 浅谈Java中的final关键字
浅谈Java中的final关键字 谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字.另外,Java中的String类就是一个final类,那么今天我们就来 ...
随机推荐
- html视口单位:vw,vh,rem
前言 不像响应式布局,通过media query,设置几个变化点来适配,流体排版通过调整大小,适配所有设备宽度.这个方法可以使我们开发的网页,在几乎所有屏幕尺寸上都可以使用.但出于一些原因,它的使用率 ...
- java的加载与执行原理剖析
到目前为止,我们接触过的重点术语,总结一下: Java体系的技术被划分为三大块: JavaSE:标准版 JavaEE:企业版 JavaME:微型版 安装JDK之后: JDK:java开发工具箱 JRE ...
- 笨方法学python中执行argv提示ValueError: not enough values to unpack (expected 4, got 1)
解决方法:选择Terminal中输入执行ex13.py 1 2 3 执行结果如下图
- CentOS 压缩解压
目录 命令 tar gzip.gunzip bzip2.bunzip2 zip.unzip 命令组合 打包:将多个文件合成一个总的文件,这个总的文件通常称为"归档". 压缩:将一个 ...
- 【Spring】IoC容器 - 依赖来源
前言 上一篇文章已经学习了[依赖注入]相关的知识,这里详细的介绍一下[依赖来源]. 依赖来源 我们把依赖来源分为依赖查找的来源和依赖注入的来源分别讨论. 依赖查找的来源 1. Spring BeanD ...
- Scrum Meeting 0427
零.说明 日期:2021-4-27 任务:简要汇报两日内已完成任务,计划后两日完成任务 一.进度情况 组员 负责 两日内已完成的任务 后两日计划完成的任务 qsy PM&前端 完成部分登录,注 ...
- 【二食堂】Beta - Scrum Meeting 6
Scrum Meeting 6 例会时间:5.19 18:30~18:50 进度情况 组员 当前进度 今日任务 李健 1. 实体标注的优化基本已经实现,后端有bug,还没有进行接口调用 issue 2 ...
- cf12E Start of the season(构造,,,)
题意: 给一个偶数N. 构造出一个矩阵. 满足:主对角线上全为0.每一行是0~N-1的一个全排列.矩阵关于主对角线对称. 思路: 觉得是智商题,,,,看完题解后觉得不难,但是我就是没想出来.只想到了前 ...
- Python学习笔记总结
目录 Python学习笔记总结 前言 安装 数据类型 Hello,World 变量 字符串 首字母大写 全部小写 全部大写 Tab和换行符 格式化 去除空格 List列表 列表增删改查排序 遍历列表 ...
- HDC2021:HMS Core分析服务,数智化营销闭环方案帮助开发者实现精益增长
10.22-10.24华为开发者大会2021(Together)在东莞如期举行.本次大会上,HMS Core华为分析服务作为多平台.跨设备的一站式数据分析平台以数据驱动业务智能决策为理念,带来了数智化 ...