二十二世纪古墓奇兵爱慕影院

小梁建站專注重慶中小企業網站建設SEO優化,讓您網站更具價值!

當前位置:首頁 > WEB前端學習 > 如何分析[] == []與[] ==! []的運算規則區別?

如何分析[] == []與[] ==! []的運算規則區別?

時間:2018-08-18 23:37 來源:重慶網站制作公司(www.l2qz.net) 作者:重慶網站建設公司

  如何分析[] == []與[] ==! []的運算規則區別?

如何分析[] == []與[] ==! []的運算規則區別?

  思考題:

  1.[] == [] => false ???

  2.[] == ![] => true ???

  [] == [] ?

  因為[] 和 {} 是引用類型

  簡單類型都是放在棧(stack)里

  對象類型都是放在堆(heap)里

  例如:

  var d = { m: 20 }//地址假設為0x0012ff7c

  var e = { m: 20 }//重新開辟一段內存空間假設為0x0012ff8f

  console.log(e==d); //false

  [] == [] => false

  [] ==![] ?

  這題考察點:

  運算符的優先級

  == 運算規則

  隱式轉換

  首先:了解一下運算符優先級(可以查MDN )

  分析:

  表達式: [] ==! []

  左邊:[]

  右邊:![]

  更具優先級高低,!優先大于 ==,因此首先先處理 ![]

  邏輯非的計算規則:

  產生UnaryExpression: !UnaryExpression按照下面執行過程:

  1.令expr為解釋執行UnaryExpression的結果

  2.令oldValue 為ToBoolean(getValue(expr))

  3.如果oldValue為true,返回 false

  4.返回true

  重點:![] 返回是一個boolean

  分析:

  ![] 是要轉換ToBoolean() 運算

  ToBoolean 運算規則

  undefined => false

  Null => false

  Number => +0,-0,NaN => false,其他是true

  String => 空字符串 => false ,其他的是true

  Object => true

  ToNumber 運算規則:

  undefined => NaN

  Null => +0

  Boolean => true 為1 ,false=> 0

  Number 不轉換

  String 變成Number 有規則

  分析:

  ![] => false

  false => toNumber(false ) => 0

  其次:== 含義

  重點:執行相等比較運算符的結果總是boolean類型,

  表示是否由運算符指定的關系對二操作數成立。

  EqualityExpression :EqualityExpression == RelationExpression按照下面的過程:

  1.令lref 為解釋執行 EqualityExpression

  2.令lval 為GetValue(lref)

  3.令rref為解釋執行RelationExpression的結果

  4.令rval為GetValue(rref)

  5.返回做用相比較算法等于rval == lval 的 結果

  抽象相等比較算法:

  比較運算 x==y,其中x和y是值,產生true或者false

  1.若Type(x) 與 Type(y)相同,則

  a.若Type(x)為undefined,返回true

  b.若Type(x)為Null,返回true

  c.若Type(x)為number,則

  1.若x為NaN,返回false

  2.若y為NaN,返回false

  3.若x與y相等數值,返回true

  4.若x為+0 且y為 -0,返回true

  5.若x為-0 且y為 +0,返回true

  d.若Type(x)為String,則當x和y為完全相同的字符序列(長度相等且字符在相同位置)

  返回true

  e.若Type(x)為Boolean,當x和y為同為true或者同為false時,返回true,否則返回false

  2.若x為null且y為undefined,返回true

  3.若y為undefined且x為null,返回true

  4.若Type(x)為Number且Type(y)為string,返回 x == Tonumber(y) 的結果

  5.若Type(x)為String且Type(y)為 number,返回 Tonumber(x) == y 的結果

  6.若Type(x)為Boolean且Type(y)為number,返回 Tonumber(x) ==y 的結果

  7.若Type(y)為boolean且Type(x) 為number,返回 Tonumber(y)==x 的結果

  8.若Type(x)為String或者Number,且Type(y)為object,返回比較 x == ToPrimitive(y)的結果

  9.若Type(x)為Object,且Type(y)為String或Number,返回比較ToPrimitive(x) ==y的結果

  接下來了解難點:

  JS引擎內部轉換為原始值ToPrimitive(obj,preferredType)

  函數接受兩個參數,第一個obj為被轉換的對象,

  第二個preferredType為希望轉換成的類型(默認為空,接受的值為Number或String)

  在執行ToPrimitive(obj,preferredType)時如果第二個參數為空并且obj為Date的實例時,

  此時preferredType會被設置為String,

  其他情況下preferredType都會被設置為Number如果preferredType為Number,

  ToPrimitive執行過程如下:

  如果obj為原始值,直接返回;

  否則調用 obj.valueOf(),如果執行結果是原始值,返回之;

  否則調用obj.toString(),如果執行結果是原始值,返回之;

  否則拋異常。

  如果preferredType為String,

  將上面的第2步和第3步調換,即:如果obj為原始值,直接返回;

  否則調用obj.toString(),如果執行結果是原始值,返回之;

  否則調用 obj.valueOf(),如果執行結果是原始值,返回之;

  否則拋異常。

  分析:

  滿足相比較8,因此:

  [] => ToPrimitive([]) => ''

  '' => ToNumber('') => 0

  左后比較 0 == 0 => false

  總結:

  1.undefined == null,結果是true。且它倆與所有其他值比較的結果都是false

  2.String == Boolean,需要兩個操作數同時轉為Number

  3.String/Boolean == Number,需要String/Boolean轉為Number。

  4. Object == Primitive,需要Object轉為Primitive(具體通過valueOf和toString方法)。


版權聲明:本文:如何分析[] == []與[] ==! []的運算規則區別? 由重慶網站制作公司(www.l2qz.net)原創內容,如需要轉載請注明原文網址:重慶網站建設公司http://www.l2qz.net/

 
喜歡看,就分享到:

圍觀: 9999次 | 責任編輯:重慶網站建設公司

回到頂部
二十二世纪古墓奇兵爱慕影院 中秋佳节祝福小视频 北京快3走势图 幸运月电子游戏 水果大爆发电子 丛林巨兽 12月22掘金vs快船录像 洛基传奇试玩 丽扬永恒之吻口红多少钱 北京pk10靠谱刷水方案 西部边境走势图 麻将来了那个猜猜乐怎么完成 博世界北京赛车开奖