對于一門編程語言的學(xué)習(xí)焚刚,如果第一步是安裝環(huán)境巡蘸,那么第二步一定是學(xué)習(xí)這門語言的基本規(guī)則咐蚯,變量和數(shù)據(jù)類型則首當(dāng)其沖
JavaScipt作為一個(gè)蹭Java熱度而命名的語言健无,在很多方面和Java也有一定的相似之處
所以在我決定整理復(fù)習(xí)Java知識的時(shí)候旬迹,我希望通過一篇對比的文章火惊,來順便復(fù)習(xí)一下JavaScipt
當(dāng)然還有一個(gè)理由就是,純寫Java或者純寫JavaScipt的文章奔垦,很多人都做過了屹耐,再寫著實(shí)沒什么意思 :)
設(shè)計(jì)區(qū)別
- Java是一種完全面向?qū)ο蟮木幊陶Z言,想要運(yùn)用Java寫東西就必須先設(shè)計(jì)對象椿猎;
而JavaScript不一樣惶岭,它是基于對象的一種腳本語言,它為開發(fā)者自帶提供了很多內(nèi)部對象犯眠,要更為簡易省時(shí) - Java采用靜態(tài)聯(lián)編按灶,Java的對象引用必須在編譯時(shí)就進(jìn)行,編譯器需要實(shí)現(xiàn)強(qiáng)類型檢查筐咧;
而JavaScript不同鸯旁,它采用動(dòng)態(tài)聯(lián)編,它的對象引用可以在運(yùn)行時(shí)檢查 - 它們最本質(zhì)的不同就是用途量蕊,Java目前被廣泛應(yīng)用于PC端铺罢、手機(jī)端、互聯(lián)網(wǎng)危融、數(shù)據(jù)中心等等畏铆;
而JavaScript則被主要用于嵌入文本到HTML頁面,讀寫HTML元素吉殃,控制cookies等 - 設(shè)計(jì)區(qū)別中的內(nèi)容參考了這篇博文 —— Java跟JavaScript兩者間的關(guān)系和區(qū)別
關(guān)于變量
- 不同之處
- 在Java中辞居,因?yàn)槠鋸?qiáng)類型語言的特性楷怒,聲明變量需要明確該變量的類型,內(nèi)存管理系統(tǒng)根據(jù)變量的類型為變量分配存儲空間
- 在JavaScript中瓦灶,聲明變量不需要指定變量類型鸠删,只需使用
var
關(guān)鍵字;
不過在ES6的后續(xù)計(jì)劃中贼陶,添加了let
和const
兩個(gè)關(guān)鍵字用于聲明不同作用的變量刃泡,但是依舊不需要聲明變量類型 - 而且JavaScipt中的變量可以存儲其他類型的變量的值,但是在Java中則有明確的類型要求碉怔,不過部分可以通過類型轉(zhuǎn)換來存儲其他類型的值
- 值得一提的是烘贴,雖然JavaScript不要求聲明變量類型,但是可以通過
new
關(guān)鍵字來聲明其類型
- 相同之處
- 變量是用于存儲信息的容器撮胧,所以他們都是需要申請內(nèi)存來存儲值桨踪,通過變量名可以引用值,也可以修改變量名的值
- 都是等號右邊賦值給等號左邊 :)
- 命名規(guī)則基本一致芹啥,具體參考下面的文章 Java和JavaScript命名規(guī)則
-
++a
代表取++
運(yùn)算之后的值锻离,a++
表示取++
運(yùn)算之前的值
<span id="jumpId-NameType"></span>
Java和JavaScript命名規(guī)則
- 變量命名必須以字母、下劃線
_
或者$
為開頭墓怀,其他字符可以是字母汽纠、_
、$
或數(shù)字 - 變量名中不允許使用空格和其他標(biāo)點(diǎn)符號傀履,首個(gè)字不能為數(shù)字虱朵,參考第一條
- 變量名長度不能超過255個(gè)字符注意!!!這是JavaScript的規(guī)則,Java參考各個(gè)類型的大小范圍
- 變量名區(qū)分大小寫钓账,建議駝峰命名法
- 變量名必須放在同一行中
- 不能使用關(guān)鍵字卧秘,分別具體是哪些自行百度
- 參考博文
關(guān)于數(shù)據(jù)類型
- 不同之處
- 提供的數(shù)據(jù)類型不同,具體可以參考下面 Java數(shù)據(jù)類型 & JavaScript數(shù)據(jù)類型 兩篇文章
- 類型轉(zhuǎn)換并不相同官扣,具體可以參考下面 Java中的類型轉(zhuǎn)換規(guī)則 & JavaScript中的類型轉(zhuǎn)換規(guī)則 兩篇文章
- 相同之處
- 在Java和JavaScript中都分為基本數(shù)據(jù)類型和引用數(shù)據(jù)類型兩種
<span id="jumpId-JavaType"></span>
Java數(shù)據(jù)類型
- 基本數(shù)據(jù)類型
- 8種基本類型,注意!!!下面括號是默認(rèn)值
- 6種數(shù)字類型羞福,其中4個(gè)整數(shù)型
byte
(0b)&short
(0s)&int
(0)&long
(0L)惕蹄,2個(gè)浮點(diǎn)型float
(0.0f)&double
(0.0d) - 1種字符類型
char
(無默認(rèn)值,大小范圍是\u0000
-\uffff
治专,等效十進(jìn)制0
~65535
)卖陵,
關(guān)于char
值需要提一句的是,字符A
的十進(jìn)制值是65张峰,字符a
的十進(jìn)制值是97泪蔫,后續(xù)字母依次每個(gè)加一,
有個(gè)概念叫ascii碼
有興趣的可以深入了解下 - 1種布爾類型
boolean
(false) - 注意!!!數(shù)字類型的結(jié)尾字母不需要考慮大小寫喘批,都可以
- 在計(jì)算機(jī)中負(fù)數(shù)由補(bǔ)碼進(jìn)行表示撩荣,
補(bǔ)碼 = 源碼取反 + 1
铣揉,舉個(gè)例子:
22,在計(jì)算機(jī)中的表示為:00010110餐曹;-22逛拱,取反:11101001,加1:11101010
- 引用數(shù)據(jù)類型
- String台猴、對象朽合、數(shù)組、類饱狂、接口 & .etc
- 所有引用類型的默認(rèn)值都是
null
- 一個(gè)引用變量可以用來引用任何與之兼容的類型
<span id="jumpId-JsType"></span>
JavaScript數(shù)據(jù)類型
- 基本數(shù)據(jù)類型
- 字符串
String
曹步,單引號雙引號包裹都可以 - 數(shù)字
Number
,不分整數(shù)和小數(shù)休讳,說實(shí)話這點(diǎn)寫起來比Java爽讲婚,但是會有危險(xiǎn) :) - 布爾
Boolean
,true
/false
- 空
Null
衍腥,可以將變量值設(shè)置為null
來清空值 - 未定義
Undefined
磺樱,表示變量不含有值 -
Symbol
,ES6中添加的新類型
- 字符串
- 引用數(shù)據(jù)類型
- 對象
Object
婆咸,由花括號分隔竹捉,在括號內(nèi)部,對象的屬性以名稱和值對的形式name:value
來定義尚骄,屬性由逗號分隔 - 數(shù)組
Array
块差,new
一個(gè)或者直接賦值(隱式創(chuàng)建) - 日期
Date
,主要是日期時(shí)間的一些操作倔丈,不過日常工作中習(xí)慣用momentjs
處理日期和時(shí)間
- 對象
- 需要注意的一點(diǎn)
- JavaScript中的類型是針對值來說憨闰,而不是針對變量
<span id="jumpId-JavaTypeChange"></span>
Java中的類型轉(zhuǎn)換規(guī)則
- 隱式(默認(rèn))類型轉(zhuǎn)換
- 基本類型的默認(rèn)轉(zhuǎn)換規(guī)則
byte/short/char -> int -> long -> float -> double
- 當(dāng)
byte/short/char
相互之間不能轉(zhuǎn)換,它們參與運(yùn)算首先將轉(zhuǎn)換成int
類型再進(jìn)行運(yùn)算 - 數(shù)字和字符串相加需五,數(shù)字會自動(dòng)裝換成字符串
- 基本類型的默認(rèn)轉(zhuǎn)換規(guī)則
- 顯示(強(qiáng)制)類型轉(zhuǎn)換
目標(biāo)類型 變量名 = (目標(biāo)類型)被轉(zhuǎn)換的類型
- 容量大的數(shù)據(jù)類型轉(zhuǎn)換為容量小的數(shù)據(jù)類型時(shí)鹉动,要加上強(qiáng)制轉(zhuǎn)換符,但可能造成精度降低或溢出
- 有多種類型的數(shù)據(jù)混合運(yùn)算時(shí)宏邮,系統(tǒng)首先自動(dòng)的將所有數(shù)據(jù)轉(zhuǎn)換成容量最大的那一種數(shù)據(jù)類型泽示,然后再進(jìn)行計(jì)算
- 有趣的例子
- 提問:Java是如何處理強(qiáng)制類型轉(zhuǎn)換的溢出處理呢?
byte a = (byte)130
- 答:在計(jì)算機(jī)中蜜氨,所有的數(shù)據(jù)都是存儲的補(bǔ)碼形式械筛,那么130首先被當(dāng)成int型存儲,四個(gè)字節(jié)32位飒炎,
它的補(bǔ)碼如下:0000 0000 0000 0000 0000 0000 1000 0010
埋哟,轉(zhuǎn)換為byte類型,進(jìn)行截取郎汪,
高字節(jié)部分去除赤赊,保留低字節(jié)部分闯狱,得到轉(zhuǎn)換為byte類型的補(bǔ)碼為:1000 0010
,
我們將其轉(zhuǎn)換為源碼:補(bǔ)碼(1000 0010)-> 反碼(1000 0001)-> 原碼(1111 1110)為 -126砍鸠,所以最后的答案是-126 - 參考資料
<span id="jumpId-JsTypeChange"></span>
JavaScript中的類型轉(zhuǎn)換規(guī)則
JavaScript是弱類型語言扩氢,變量類型完全由當(dāng)前值決定,這種類型就叫弱類型爷辱。
首先要記住的是录豺,JavaScript中的類型轉(zhuǎn)化,它得到的結(jié)果永遠(yuǎn)是基本類型饭弓,也就可以分為兩種情況双饥,
基本類型和基本類型之間的轉(zhuǎn)化,引用類型轉(zhuǎn)化為基本類型弟断,不可能出現(xiàn)基本類型轉(zhuǎn)化為引用類型咏花,
類型轉(zhuǎn)化出現(xiàn)最多就是轉(zhuǎn)化成Number
, String
, 和Boolean
Java中的主動(dòng)類型轉(zhuǎn)換常用方法
這里感覺可以另外寫一個(gè)專題博文,后期再補(bǔ)檔阀趴,到時(shí)候再補(bǔ)個(gè)鏈接過來昏翰,有興趣的同學(xué)可以先閱讀這篇文章
JavaScript中的主動(dòng)類型轉(zhuǎn)換常用方法
- 將其他類型值(數(shù)字、布爾刘急、日期)轉(zhuǎn)字符串棚菊,一把都是用
toString()
- 字符串轉(zhuǎn)數(shù)字,
parseInt()
轉(zhuǎn)換成整數(shù)叔汁,parseFloat()
轉(zhuǎn)換成浮點(diǎn)數(shù)统求,整數(shù)和浮點(diǎn)數(shù)都是Number
類型 - 將布爾轉(zhuǎn)換成數(shù)字可以使用方法
Number()
- 當(dāng)JavaScript嘗試操作一個(gè)錯(cuò)誤的數(shù)據(jù)類型時(shí),會自動(dòng)轉(zhuǎn)換為正確的數(shù)據(jù)類型
- 舉個(gè)例子:
5 + null // 返回?cái)?shù)字5据块,null 轉(zhuǎn)換為 0
- 舉個(gè)例子:
'5' + null // 返回字符串5null码邻,null 轉(zhuǎn)換為 'null'
- 其他例子就是字符串類型數(shù)字和數(shù)字類型數(shù)字之間的運(yùn)算都會轉(zhuǎn)成數(shù)字運(yùn)算
- 舉個(gè)例子:
- 將其他類型值轉(zhuǎn)換成布爾值類型
- 原始類型值轉(zhuǎn)換方法,這六個(gè)類型
undefined/null/-0/0/NaN/空字符串
全部為false
另假,其他全部為true
- 所有對象的布爾值都是
true
像屋,甚至false
對應(yīng)的布爾值對象也是true
,空對象空數(shù)組也都是true
- 舉個(gè)例子:
console.log(Boolean(new Boolean(false))) // 輸出true
- 原始類型值轉(zhuǎn)換方法,這六個(gè)類型
- 隱式類型的轉(zhuǎn)換是系統(tǒng)進(jìn)行運(yùn)算時(shí)自動(dòng)進(jìn)行的边篮,但是調(diào)用的方法都是顯式類型轉(zhuǎn)換的方法
- 一元運(yùn)算符
+
可以隱式的將字符串轉(zhuǎn)為數(shù)字开睡,如果變量不能轉(zhuǎn)換成數(shù)字,他仍會成為一個(gè)數(shù)字苟耻,但值會是NaN
,
舉個(gè)例子:var a = 5; console.log(c = +a); // 輸出數(shù)字5
扶檐,
舉個(gè)例子:var b = 'abc'; console.log(b = +abc); // 輸出NaN
-
- * / %
(減號凶杖、乘號、除號款筑、取余運(yùn)算符)運(yùn)算時(shí)會通過Number()
把數(shù)據(jù)轉(zhuǎn)換成Number
類型后智蝠,再進(jìn)行運(yùn)算 -
&& || !
(與或非運(yùn)算符)運(yùn)算時(shí)會通過Boolean()
把數(shù)據(jù)轉(zhuǎn)換成Boolean
類型后腾么,再進(jìn)行運(yùn)算 -
< > <= >= == !=
(比較運(yùn)算符)運(yùn)算時(shí),當(dāng)數(shù)字和字符串比較大小時(shí)杈湾,會隱示將字符串轉(zhuǎn)換成Number
類型進(jìn)行比較解虱,
而當(dāng)字符串和字符串比較大小時(shí),則比較的是ascii碼
的大小漆撞,最后返回的則是布爾值 -
注意!!!比較運(yùn)算符中
undefined
和null
是不會發(fā)生類型轉(zhuǎn)換的殴泰,只有相等的值會返回true
-
注意!!! 全局
isNaN()
函數(shù)會將測試值通過Number()
轉(zhuǎn)換為數(shù)字,然后對其進(jìn)行測試浮驳,
但是Number.isNaN()
不會將值轉(zhuǎn)換為數(shù)字悍汛,并且不會為任何非數(shù)字類型的值返回true
- 一元運(yùn)算符
- 如果用
==
來判斷兩個(gè)數(shù)值是否相等,由于會發(fā)生隱式類型轉(zhuǎn)換至会,所以是非常存在非常大的漏洞的离咐,
為了解決這一問題,引入了===
(絕對等于)和!==
(絕對不等于) - 參考資料一奉件、參考資料二
我是 fx67ll.com宵蛀,如果您發(fā)現(xiàn)本文有什么錯(cuò)誤,歡迎在評論區(qū)討論指正县貌,感謝您的閱讀术陶!
如果您喜歡這篇文章,歡迎訪問我的 本文github倉庫地址窃这,為我點(diǎn)一顆Star瞳别,Thanks~ :)
轉(zhuǎn)發(fā)請注明參考文章地址,非常感謝:脊ァK盍病!