对于一门编程语言的学习,如果第一步是装置环境,那么第二步肯定是学习这门语言的根本规定,变量和数据类型则首当其冲
JavaScipt作为一个蹭Java热度而命名的语言,在很多方面和Java也有肯定的相似之处
所以在我决定整顿温习Java常识的时候,我心愿通过一篇比照的文章,来顺便温习一下JavaScipt

当然还有一个理由就是,纯写Java或者纯写JavaScipt的文章,很多人都做过了,再写着实没什么意思 :)

设计区别

  1. Java是一种齐全面向对象的编程语言,想要使用Java写货色就必须先设计对象;
    而JavaScript不一样,它是基于对象的一种脚本语言,它为开发者自带提供了很多外部对象,要更为繁难省时
  2. Java采纳动态联编,Java的对象援用必须在编译时就进行,编译器须要实现强类型查看;
    而JavaScript不同,它采纳动静联编,它的对象援用能够在运行时查看
  3. 它们最实质的不同就是用处,Java目前被广泛应用于PC端、手机端、互联网、数据中心等等;
    而JavaScript则被次要用于嵌入文本到HTML页面,读写HTML元素,管制cookies等
  4. 设计区别中的内容参考了这篇博文 —— Java跟JavaScript两者间的关系和区别

对于变量

  1. 不同之处

    • 在Java中,因为其强类型语言的个性,申明变量须要明确该变量的类型,内存管理系统依据变量的类型为变量调配存储空间
    • 在JavaScript中,申明变量不须要指定变量类型,只需应用var关键字;
      不过在ES6的后续打算中,增加了letconst两个关键字用于申明不同作用的变量,然而仍旧不须要申明变量类型
    • 而且JavaScipt中的变量能够存储其余类型的变量的值,然而在Java中则有明确的类型要求,不过局部能够通过类型转换来存储其余类型的值
    • 值得一提的是,尽管JavaScript不要求申明变量类型,然而能够通过new关键字来申明其类型
  2. 相同之处

    • 变量是用于存储信息的容器,所以他们都是须要申请内存来存储值,通过变量名能够援用值,也能够批改变量名的值
    • 都是等号左边赋值给等号右边 :)
    • 命名规定基本一致,具体参考上面的文章 Java和JavaScript命名规定
    • ++a代表取++运算之后的值,a++示意取++运算之前的值

<span id="jumpId-NameType"></span>

Java和JavaScript命名规定

  1. 变量命名必须以字母、下划线_或者$为结尾,其余字符能够是字母、_$或数字
  2. 变量名中不容许应用空格和其余标点符号,首个字不能为数字,参考第一条
  3. 变量名长度不能超过255个字符留神!!!这是JavaScript的规定,Java参考各个类型的大小范畴
  4. 变量名辨别大小写,倡议驼峰命名法
  5. 变量名必须放在同一行中
  6. 不能应用关键字,别离具体是哪些自行百度
  7. 参考博文

    • 命名规定中的内容参考了这篇博文 —— js变量命名规定
    • 命名规定中的内容参考了这篇博文 —— Java变量命名规定

对于数据类型

  1. 不同之处

    • 提供的数据类型不同,具体能够参考上面 Java数据类型 & JavaScript数据类型 两篇文章
    • 类型转换并不相同,具体能够参考上面 Java中的类型转换规定 & JavaScript中的类型转换规定 两篇文章
  2. 相同之处

    • 在Java和JavaScript中都分为根本数据类型和援用数据类型两种

<span id="jumpId-JavaType"></span>

Java数据类型

  1. 根本数据类型

    • 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
  2. 援用数据类型

    • String、对象、数组、类、接口 & .etc
    • 所有援用类型的默认值都是null
    • 一个援用变量能够用来援用任何与之兼容的类型

<span id="jumpId-JsType"></span>

JavaScript数据类型

  1. 根本数据类型

    • 字符串 String,单引号双引号包裹都能够
    • 数字 Number,不分整数和小数,说实话这点写起来比Java爽,然而会有危险 :)
    • 布尔 Booleantrue/false
    • Null,能够将变量值设置为null来清空值
    • 未定义 Undefined,示意变量不含有值
    • Symbol,ES6中增加的新类型
  2. 援用数据类型

    • 对象 Object,由花括号分隔,在括号外部,对象的属性以名称和值对的模式name:value来定义,属性由逗号分隔
    • 数组 Arraynew一个或者间接赋值(隐式创立)
    • 日期 Date,次要是日期工夫的一些操作,不过日常工作中习惯用momentjs解决日期和工夫
  3. 须要留神的一点

    • JavaScript中的类型是针对值来说,而不是针对变量

<span id="jumpId-JavaTypeChange"></span>

Java中的类型转换规定

  1. 隐式(默认)类型转换

    • 根本类型的默认转换规则 byte/short/char -> int -> long -> float -> double
    • byte/short/char相互之间不能转换,它们参加运算首先将转换成int类型再进行运算
    • 数字和字符串相加,数字会主动装换成字符串
  2. 显示(强制)类型转换

    • 指标类型 变量名 = (指标类型)被转换的类型
    • 容量大的数据类型转换为容量小的数据类型时,要加上强制转换符,但可能造成精度升高或溢出
    • 有多种类型的数据混合运算时,零碎首先主动的将所有数据转换成容量最大的那一种数据类型,而后再进行计算
  3. 乏味的例子

    • 发问: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
    • 参考资料

<span id="jumpId-JsTypeChange"></span>

JavaScript中的类型转换规定

JavaScript是弱类型语言,变量类型齐全由以后值决定,这种类型就叫弱类型。
首先要记住的是,JavaScript中的类型转化,它失去的后果永远是根本类型,也就能够分为两种状况,
根本类型和根本类型之间的转化,援用类型转化为根本类型,不可能呈现根本类型转化为援用类型,
类型转化呈现最多就是转化成Number, String, 和Boolean

Java中的被动类型转换罕用办法

这里感觉能够另外写一个专题博文,前期再补档,到时候再补个链接过去,有趣味的同学能够先浏览这篇文章

JavaScript中的被动类型转换罕用办法

  1. 将其余类型值(数字、布尔、日期)转字符串,一把都是用toString()
  2. 字符串转数字,parseInt()转换成整数,parseFloat()转换成浮点数,整数和浮点数都是Number类型
  3. 将布尔转换成数字能够应用办法Number()
  4. 当JavaScript尝试操作一个谬误的数据类型时,会主动转换为正确的数据类型

    • 举个例子:5 + null // 返回数字5,null 转换为 0
    • 举个例子:'5' + null // 返回字符串5null,null 转换为 'null'
    • 其余例子就是字符串类型数字和数字类型数字之间的运算都会转成数字运算
  5. 将其余类型值转换成布尔值类型

    • 原始类型值转换方法,这六个类型undefined/null/-0/0/NaN/空字符串全副为false,其余全副为true
    • 所有对象的布尔值都是true,甚至false对应的布尔值对象也是true,空对象空数组也都是true
    • 举个例子:console.log(Boolean(new Boolean(false))) // 输入true
  6. 隐式类型的转换是零碎进行运算时主动进行的,然而调用的办法都是显式类型转换的办法

    • 一元运算符+能够隐式的将字符串转为数字,如果变量不能转换成数字,他仍会成为一个数字,但值会是NaN
      举个例子:var a = 5; console.log(c = +a); // 输入数字5
      举个例子:var b = 'abc'; console.log(b = +abc); // 输入NaN
    • - * / %(减号、乘号、除号、取余运算符)运算时会通过Number()把数据转换成Number类型后,再进行运算
    • && || !(与或非运算符)运算时会通过Boolean()把数据转换成Boolean类型后,再进行运算
    • < > <= >= == !=(比拟运算符)运算时,当数字和字符串比拟大小时,会隐示将字符串转换成Number类型进行比拟,
      而当字符串和字符串比拟大小时,则比拟的是ascii码的大小,最初返回的则是布尔值
    • 留神!!!比拟运算符中undefinednull是不会产生类型转换的,只有相等的值会返回true
    • 留神!!! 全局isNaN()函数会将测试值通过Number()转换为数字,而后对其进行测试,
      然而Number.isNaN()不会将值转换为数字,并且不会为任何非数字类型的值返回true
  7. 如果用==来判断两个数值是否相等,因为会产生隐式类型转换,所以是十分存在十分大的破绽的,
    为了解决这一问题,引入了===(相对等于)和!==(相对不等于)
  8. 参考资料一、参考资料二