Javascript基礎鞏固系列——運算符+數據類型轉換

全手打原創,轉載請標明出處:https://www.cnblogs.com/dreamsqin/p/13704608.html, 多謝,=。=~(如果對你有幫助的話請幫我點個贊啦)

重新學習JavaScript是因爲當年轉前端有點兒趕鴨子上架的意味,我一直在反思我的知識點總是很零散,不能在腦海中形成一個完整的體系,所以這次想通過再次學習將知識點都串聯起來,結合日常開發的項目,達到溫故而知新的效果。與此同時,總結一下我認爲很重要但又被我遺漏的知識點~

運算符

加法運算符(+

  • 可以進行數值相加運算或非數值連接運算,運算子的不同,導致了不同的語法行爲,即“重載”(overload)。
  • 如果運算子是對象,會先轉成原始類型的值(先執行valueOf(),如果非原始類型再執行toString(),這兩個方法支持自定義),然後再相加。
var obj = { p: 1 };
obj + 2 // "[object Object]2"
  • 如果運算子爲Date對象的實例,會先執行toString()
var obj = new Date();
obj.valueOf = function () { return 1 };
obj.toString = function () { return 'hello' };

obj + 2 // "hello2"

餘數運算符(%

  • 運算結果的正負號由第一個運算子的正負號決定。
-1 % 2 // -1
1 % -2 // 1

數值運算符(+

  • 爲一元運算符(加法是二元運算符),可以將任何值轉爲數值,與Number函數作用相同 ,會返回一個新的值,不會改變原始變量的值。
+true // 1
+[] // 0
+{} // NaN

指數運算符(**

  • 完成指數運算,前一個運算子是底數,後一個運算子是指數,多個指數運算符連用時,先進行最右邊的計算。
2 ** 4 // 16
// 相當於 2 ** (3 ** 2)
2 ** 3 ** 2
// 512

非相等運算符(<<=>>=

  • 兩個運算子均爲字符串時就按照字典順序比較(實際上是比較 Unicode 碼點),任何值(包括NaN本身)與NaN使用非相等運算符進行比較,返回的都是false
1 > NaN // false
1 <= NaN // false
'1' > NaN // false
'1' <= NaN // false
NaN > NaN // false
NaN <= NaN // false

相等運算符(=====

  • ==比較兩個值是否相等,如果兩個運算子非同一類型,會先轉換成同一類型(原始類型的值會轉換成數值,複合類型會先轉換爲原始類型,undefinednull只有與自身比較,或者互相比較時,纔會返回true,與其他類型的值比較時,結果都爲false)再進行嚴格比較。
'true' == true // false
// 等同於 Number('true') === Number(true)
// 等同於 NaN === 1

[1, 2] == '1,2' // true

undefined == null // true
false == null // false
0 == undefined // false
  • ===比較兩個值是否爲“同一個值”,如果兩個運算子非同一類型,直接返回falseNaN與任何值都不嚴格相等(包括自身),複合類型(對象、數組、函數)比較它們是否指向同一個地址。
NaN === NaN  // false
+0 === -0 // true
{} === {} // false
[] === [] // false
(function () {} === function () {}) // false

取反運算符(!

  • 對於非布爾值,取反運算符會將其轉爲布爾值。undefinednullfalse0NaN、空字符串''六個值取反後爲true,其他值都爲false,兩次取反就是將一個值轉爲布爾值的簡便寫法。
!54 // false
!'hello' // false
![] // false
!{} // false

!!x
// 等同於
Boolean(x)

且運算符(&&

  • 如果第一個運算子的布爾值爲true,則返回第二個運算子的值(注意是值,不是布爾值);如果第一個運算子的布爾值爲false,則直接返回第一個運算子的值,且不再對第二個運算子求值(很多人喜歡用這種“短路”替代if語句,但不利於排錯也看不出目的,應慎用)。
't' && 'f' // "f"
't' && (1 + 2) // 3

var x = 1;
(1 - 1) && ( x += 1) // 0
x // 1

或運算符(||

  • 如果第一個運算子的布爾值爲true,則返回第一個運算子的值,且不再對第二個運算子求值;如果第一個運算子的布爾值爲false,則返回第二個運算子的值(常用於爲一個變量設置默認值)。
't' || 'f' // "t"
'' || 'f' // "f"

function saveText(text) {
  text = text || '';
  // ...
}

void運算符(void

  • 執行一個表達式,然後不返回任何值,或者說返回undefined,主要用途是瀏覽器的書籤工具(Bookmarklet),以及在超級鏈接中插入代碼防止網頁跳轉。
<!-- 點擊鏈接後會先執行f()但不會跳轉頁面 -->
<a href="javascript: void(f())">文字</a>
<!-- 用戶點擊鏈接提交表單,但是不產生頁面跳轉 -->
<a href="javascript: void(document.form.submit())">
  提交
</a>

左結合與右結合

  • 在運算符優先級相同時,JavaScript 語言的大多數運算符是“左結合”,少數運算符是“右結合”,有賦值運算符、三元運算符、指數運算符。
// 相當於w = (x = (y = z));
w = x = y = z;

// 相當於q = a ? b : (c ? d : (e ? f : g));
q = a ? b : c ? d : e ? f : g;

// 相當於2 ** (3 ** 2)
2 ** 3 ** 2

數據類型轉換

Number()強制轉換

  • 將任意類型的值轉化成數值,需要與parseInt()區分,Number函數比parseInt函數嚴格很多,只要有一個字符無法轉成數值,整個字符串就會被轉爲NaN,但都會自動過濾字符串前後的空格。
parseInt('42 cats') // 42
Number('42 cats') // NaN

parseInt('\t\v\r12.34\n') // 12
Number('\t\v\r12.34\n') // 12.34
  • 參數是對象時,將返回NaN,除非是包含單個數值的數組,走的是先調用valueOf()再調用toString()的那套邏輯。
Number({a: 1}) // NaN
Number([1, 2, 3]) // NaN
Number([5]) // 5

String()強制轉換

  • 可以將任意類型的值轉化成字符串,參數如果是對象,返回一個類型字符串,如果是數組,返回該數組的字符串形式,走的是先調用toString()再調用valueOf()的邏輯。
String({a: 1}) // "[object Object]"
String([1, 2, 3]) // "1,2,3"

Boolean()強制轉換

  • 與取反運算符邏輯相同,除了undefinednull0NaN、空字符串''這五個值的轉換結果爲false,其他的均爲true。
Boolean(new Boolean(false)) // true

參考資料

JavaScript 語言入門教程 :https://wangdoc.com/javascript/index.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章