【JS】關於JS的一些知識點(JS基礎,純記錄)

本想着記筆記裏,可是筆記裏沒有分類,仍是以文章的形式,當我的總結吧,這一篇就看成JS基礎篇的記錄吧,有修改的和新增的持續更新~數組

關於JS的一些小技巧

1:JS中toString和valueof()區別

toString():返回一個反映這個對象的字符串

valueOf():返回它相應的原始值
函數

console.log([1,2,3].toString()); // "1,2,3"
console.log(new Date(2015,4,4).toString()); // "Mon May 04 2015 00:00:00 GMT+0800
c"
console.log(new Date(2015,4,4).valueOf()); //  "1430668800000  "

注意: Math和Error沒有valueOf方法this

字符串轉換爲數字的三種方法js
1:pasreInt()parseFloat()方法:轉換不成功的返回NaN

2:強制類型轉換: Boolean(val)/Number(val)/String(val)

3: 利用js變量弱類型轉換:*1 (實際上調用了.valueOf方法),而後使用Number.isNaN來判斷是否爲NaN,或者使用a!==a來判斷是否爲NaN,由於NaN!==NaNcode

'32'*1  //32
'ds'*1  //NaN

也可使用+來轉化爲數字,一元正號位於操做數前面,計算操做數的數值,若是操做數不是一個數值,會嘗試將其轉壞爲一個數值,參考見 https://developer.mozilla.org...對象

+'123' //123
"'ds'  //NaN
+null  //0
+undefined //NaN
+{valueOf: () => '3'}  //3
2:Boolean能夠過濾掉數組的全部假值

除了false,null,undefined,0,"",NaN,都是假值ip

const compact = arr => arr.filter(Boolean)
compact([0, 1, false, 2, '', 3, 'a', 'e' * 23, NaN, 's', 34])             // [ 1, 2, 3, 'a', 's', 34 ]
3:雙位運算符

雙否認位操做符的優點在於它執行相同的操做運行速度更快ci

Math.floor(4.9) === 4簡寫爲 ~~4.9 === 4 字符串

注意:對於負數來講結果不一樣

ps: 還能夠用 4.9 | 0 === 4get

4:判斷奇偶數

num & 1 //奇數返回,偶數返回0it

5:精確到指定位數的小數2
const round = (n, decimals = 0) => Number(`${Math.round(`${n}e${decimals}`)}e-${decimals}`)
round(1.245, 2) //1.25
6:程序中全部的等於判斷都要用===,除了obj.c == null這種狀況

obj.c == null 等價於obj.c === undefined/null

7:變量前加兩個感嘆號,判斷變量的值

若是值爲真,首先能夠排除undefined和null,根據對象類型,能夠作出以下判斷

數值類型:表示不是0,而且有肯定含義的值(包括無窮大)

數組,對象,函數:只能表示不是undefined或null,並不能判斷是否有元素和內容。

var a = undefined/null !!a === false
var b = 0   !!b === false
var c = ''  !!c === false
//  其餘都爲true

var d = []/{} !!d === true

做爲條件表達式,不須要使用!!進行轉換,JS會自動轉換,!!就只將類型轉換爲Boolean值

if (!!value) {}  // 等價與下面
if (value) {}

原始類型和引用類型比較

1:String和Number比較,會先將String轉換成Number類型
123 == '123'  //true
'' == 0  //true
2:null和undefined比較結果是true,除此以外,null、undefined和其餘任何結果值的比較值都爲false
null == undefined //true
null == '' //false
null == 0 //fasle
null == false //false
undefined == '' //false
undefined == 0 //false
undefined == false //false
3:當原始類型和引用類型作比較時,對象類型會依照Toprimitive規則轉換爲原始類型
'[object Object] == {}' //true
'1,2,3' == [1, 2, 3] //true
[] == ![] //true

關於第三個:!的優先級高於==,![]首先會被轉換成false,而後根據上面第三點,false轉換成Number類型0,左側[]轉化成爲0,兩側比較相等。

4:如何讓:a==1 && a==2 && a==3
根據拆箱轉換,以及==的隱式轉換,能夠以下寫:

const a = {
   value:[3,2,1],
   valueOf: () => {return this.value.pop(); },
}
5:爲何0.1+0.2 !=0.3
計算機中全部的數據都是以二進制存儲的,因此在計算機計算時要把數據先轉換成二進制進行計算,而後把計算結果轉換成十進制。

會存在精度丟失問題

0.10.2的二進制都是以1100無線循環的小數

0.1的二進制:
0.0001100110011001100110011001100110011001100110011001101

0.的二進制:
0.001100110011001100110011001100110011001100110011001101

相關文章
相關標籤/搜索