Javascript 盲點

1.javestript 中所有的數(shù)字都是浮點型

js在浮點數(shù)運算時會出現(xiàn)多位小數(shù)的不準確結(jié)果,浮點數(shù)運算的誤差。在javestript 中所有的數(shù)字都是浮點型,許多編程語言支持多種數(shù)字類型,如浮點型、雙精度型、整數(shù)型和雙精度型,但JS卻不是這樣。在JS中,按照IEEE 754-2008標準的定義,所有數(shù)字都以雙精度64位浮點格式表示。
js無法正常表示大于16位的整數(shù)【非科學計數(shù)】。當你的 所要表達的數(shù) 大于16位整數(shù)時,建議寫成 字符串的形式。

//精度不同的問題
var num1 = .3-.2
var num2 = .2-.1
num1 == num2
num1 == .1
num2 == .1
0.09999999999999998
0.1
false
false
true
// 本身就是浮點數(shù),0當除數(shù)不會報錯
5/2 == 5.0/2   // true
5/0 == Infinity
0/0 == NaN

2.字符串是固定不變的

var str = "string"
str.len = 4
var t = str.len
t

字符串是固定不變的,字符串是基本類型,是直接保存在棧內(nèi)存的變量空間中的,字符串除了是基本類型他還是包裝類型(每當讀取數(shù)據(jù)的時候,后臺就會創(chuàng)建一個對應(yīng)的基本包裝類型的對象 new String(s),從而讓我們能夠調(diào)用一些方法來操作這些數(shù)據(jù)),所以他可以進行slice等操作,但它本質(zhì)上就是一個字符串,不是對象
在js中字符串是固定不變的,類似replace()和toUpperCase()的方法都返回新字符串,但原字符串本身并沒有發(fā)生改變。

t // undefined
str ="String" 
"String"
str.toUpperCase()
"STRING"
str
"String"

3.javascript的‘==’ 和‘===’

1=="1"
true
1==="1" 
false

雙等號==:
 ?。?)如果兩個值類型相同,再進行三個等號(===)的比較
  (2)如果兩個值類型不同,也有可能相等,需根據(jù)以下規(guī)則進行類型轉(zhuǎn)換在比較:
    1)如果一個是null,一個是undefined,那么相等
    2)如果一個是字符串,一個是數(shù)值,把字符串轉(zhuǎn)換成數(shù)值之后再進行比較
三等號===:
 ?。?)如果類型不同,就一定不相等
  (2)如果兩個都是數(shù)值,并且是同一個值,那么相等;如果其中至少一個是NaN,那么不相等。(判斷一個值是否是NaN,只能使用isNaN( ) 來判斷)
  (3)如果兩個都是字符串,每個位置的字符都一樣,那么相等,否則不相等。
 ?。?)如果兩個值都是true,或是false,那么相等
 ?。?)如果兩個值都引用同一個對象或是函數(shù),那么相等,否則不相等
 ?。?)如果兩個值都是null,或是undefined,那么相等

null == undefined
true
null === undefined
false
typeof undefined
"undefined"
//null也是對象
typeof null
"object"
var obj1 = null
var obj2 = null
obj1 == obj2
true
var obj3 = {}
var obj4 = {}
obj3 == obj4
false

對象的比較并非值的比較,是引用的比較,但是javascript權(quán)威指南中是這樣寫的

If both values are null or both values are undefined, they are equal.

null也是對象確相等,這個不清楚。

4.delete關(guān)鍵字的使用

delete關(guān)鍵字的使用注意:
1.返回值類型為布爾值(true / false),刪除成功返回true

b = {}
delete b
true

2.刪除對象中不存在的屬性,返回值是true

b = {}
delete b.name
true

3.刪除對象的原型對象中的屬性(不能刪除),返回值是true

 function Obj() {
    this.age = 18;
  }
  Obj.prototype.name = "張三";
  var p1 = new Obj();
  console.log(p1.name); //張三
  p1.name = "李四";
  console.log(p1.name); //李四
  //不能直接刪除原型屬性
  delete p1.name; 
  console.log(p1.name); //張三
  //刪除原型屬性
  delete Person.prototype.name;
  console.log(p1.name);//undefined
  console.log(p1.age); //18
  p1.age = 22;
  //可以直接刪除實例屬性
  delete p1.age; //可以刪除
  console.log(p1.age); //undefined
  //刪除不存在的屬性,返回true

4.無法刪除使用var聲明的全局的變量。

var obj = {}
undefined
delete obj
false
obj
{}

5."+"的優(yōu)先轉(zhuǎn)換規(guī)則是字符串連接優(yōu)先

"1"+"2" == "12"
"1"+2 =="12” //轉(zhuǎn)成字符串再相加
1+2 = 3
1+{} = "1[object Object]"  //對象先轉(zhuǎn)字符串再相加
(2 + null) == 2 // null轉(zhuǎn)換后變成0
(2 + undefined) == NaN   //undefined 轉(zhuǎn)成NaN

6.比較大小

比較運算中的操作數(shù)可以是任意類型的值,但是在執(zhí)行運算時,會被轉(zhuǎn)換為數(shù)字或字符串,然后再進行比較。如果是數(shù)字,則比較大??;如果是字符串,則根據(jù)字符編碼表中的編號值從左到右逐個比較每個字符。

"11"<"3" // true
11<"3" // false
11<3 // false

1.如果一個操作數(shù)為 NaN,或者被轉(zhuǎn)換為 NaN,則始終返回 false。

undefined>"a"
false

2.如果操作數(shù)都無法轉(zhuǎn)換為數(shù)字或字符串,則比較結(jié)果為 false。

{} > {a:1}
false

7.js類型轉(zhuǎn)換表

JavaScript類型轉(zhuǎn)換表格
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容