Javascript - 運算子與型別

目錄

運算順序

先運算完再指定

i = 1 
//賦值
i += 1
// i = i+1
-=
// i = i-1
/=
// i = i /
*=
//i = i*
%=
//餘數

 

等號位置的差異

let i = 1, b
b = i--
//b = 1 , i = 0
//先執行b=i,再執行i = i-1

b = --i

//先執行i = i-1 再執行z=i
// b = 0, i = 0

型別

原始型別:六種

  • Boolean, Null, Undefined, Number, BigInt, String, Symbol
  • 都是原始定義的值,不能被改變
  • Boolean: true/false
  • Null: 只有Null
  • Undefined:還沒被定義的變數,例如let num
    console.log(typeof (num))
  • Number:一般的數字再加上+Infinity-InfinityNaN
  • String:文字資料
  • Symbol
Symbol("foo") === Symbol("foo"); // false

const sym = new Symbol(); // TypeError

const sym = Symbol("foo");
typeof sym; // "symbol"
const symObj = Object(sym);
typeof symObj; // "object"

 

非原始型別:Object

  • function, array,...等等都包含在內
  • 特性:可以自由新增屬性
console.log(typeof True) //boolean

console.log(typeof "123")//string

console.log(typeof 1) //number

console.log(typeof 123n) //bigint

console.log(typeof []) //object

console.log(typeof null) //object

//但原始型別為null

console.log(typeof function() {}) //function

//但原始型別為object

const obj = {}

obj.name = 'hello'

console.log(obj.name) //hello

new

使用new會讓型別成為object

例如

const string1 = "abc"

console.log(typeof string1)//string

console.log(typeof "abc") //string


const string2 = new String("xyz")

console.log(typeof string2) //object

型別轉換

顯性轉換

字串轉型別

console.log(+"1") //1

console.log(+true) //1

console.log(!0) //true

console.log(!!0) //false

console.log(!1) //false

數字轉型別

var num = 55
console.log(String(num) //"55"

console.log(Symbol(num) //Symbol(55)

console.log(Number(num) //55

console.log(BigInt(num) //55n

console.log(Boolean(num) //true

 

數字+字串的組合

var num = 55console.log(Number(num) //NaN

console.log(Number.parseInt((num)) //55

console.log(parseInt((num)) //55

 

轉布林 Boolean()

console.log(!0) //true

console.log(!!0) //false

console.log(!1) //false

parseInt

parseInt(轉型的數字,進位數值),取整數

parseFloat包含小數點

var num = 55.2console.log(parseInt((num,10)) //55

console.log(parseFloat((num)) //55.2

隱性轉換

  • 有一個是字串=>都變字串
  • 有一個非原始型別=>當字串
  • true會被視為1,false視為0

"+"

num+str =>str

str+str =>str

"+="

只要有一個是string/object=>當成字串運算

var aa= 1
console.log(aa+=true) //2,number
console.log(aa+=null) //2,number
console.log(aa+=[]) //2, string

var aa= "1"
console.log(aa+=true) //1true
console.log(aa+=null) //1truenull
console.log(aa+=[]) //1truenull


"其他"

都視為number

console.log(1+true) //2

console.log(String([1,2])) //1,2

console.log("1"+2) //12 加號在有string的情況下會當成string拼接
console.log("1"-2) //-1 遇到-號會試著轉換成數字
console.log(1+[2]) //12
console.log(1+[1,2]) //11,2
console.log(1-[1,2]) //NaN

console.log("12"+true) //12true
console.log(1 +{}) //1[object Object]
console.log(String({})) //[object Object]

 

 

note:

  • Bigint(n)可以彼此運算但跟一般型別混和會錯誤
  • Symbol不能運算

型別比較('==' '===')

寬鬆比較

  • 物件與物件相比=>false
  • 物件vs非物件 =>先string在Number
  • 大部分會轉成number, string或boolean做比較
  • ture=>1 / false=>0
  • null=>false
  • undefined=>false
console.log(1==true) //true

console.log(3 == true) //false

console.log(null == undefined) //true

console.log(0 == undefined) //false

console.log(1==1n) //true

console.log({} == []) //false
console.log({} == '[object Object]') //T

Symbol

寬鬆或嚴格比對都是false

var a = Symbol(1)
var b = Symbol(2)
console.log( a ==b ) //false

var a = Symbol(1)
var b = a
console.log( a ==b ) //true,共用一個記憶體

 

//先轉成數字
console.log(Number([])) //0
console.log(Number([1])) //1
console.log(Number([1,2])) //NaN

console.log([] == 0) //T
console.log([1] == 1) //T
console.log([1,2] == 12) //F
console.log([] == "0") //F

//物件相比
var numObj = new Number('13456') //object

var num = Number('13456') //number

numObj === 13456  //False

num === 13456  //True
console.log(new Number(1) ==new Number(1)) //false

console.log({} ==={} ) //F
console.log([] ===[] ) //F

||, &&的用法

&&

前面值為false=>回傳前者

前面值為true=>回傳後者

||

前面值為false=>回傳後者

前面值為true=>回傳前者

1&&2=>2

0&&1=>0

2||0=>2

https://www.youtube.com/watch?v=kX3madakVl0

 

Related post

J J

JAVASCRIPT筆記 - for loop

for loop可說是第一個大魔王,雖然python的時候已經覺得稍微打敗它,但換個用法就快死掉了,所以決定整理一下各種用法 for…

Comments