摘要:先測試得到以下結果可看到正則進行全局搜索判斷返回一個數據數組的首元素為成功匹配的文本因此每次進行時都會返回數組的首元素也就是匹配的文本由此實現這個功能參考自微信公眾號魚頭的海洋
關于這道題目:
var a = ?; if (a == 1 && b == 2 && c == 3) { console.log("yes"); }
學習了網上的幾種解法,如下:
首先,JS中類型轉化只有三種情況:
轉換為布爾值
轉換為數字
轉換為字符串
對象在轉換類型的時候,會執行原生方法ToPrimitive
其算法如下:
1.如果已經是原始類型,則返回當前值;
2.如果需要轉字符串則先調用toString方法,如果此時是原始類型則直接返回,否則再調用valueOf方法并返回結果;
3.如果不是字符串,則先調用valueOf方法,如果此時是原始類型則直接返回,否則再調用toString方法并返回結果;
4.如果都沒有原始類型返回,則跑出TypeError類型錯誤.
解法如下:
1.
var a = { arr: [3, 2, 1], valueOf () { console.group("valueOf"); console.log(this.arr); console.groupEnd("valueOf"); return this.arr.pop(); } } if (a == 1 && a == 2 && a == 3) { console.log("yes"); }
執行結果:
解析:
1.運行時會先判斷 a 的類型,此時typeof a === "object",不是原始類型,也不是字符串,因此會先執行a.valueOf()
2.由于valueOf()被覆蓋了,因此執行覆蓋后的valueOf(),每一次都會返回a.arr的尾元素,并更新a.arr
3.得出三次執行結果為 1, 2, 3, 實現了這個功能
2.
var b = { arr: [3, 2, 1], toString () { console.group("toString"); console.log(this.arr); console.groupEnd("toString"); return this.arr.pop(); } } if (b == 1 && b == 2 && b == 3) { console.log("yes"); }
執行結果:
解析:
1.運行時會先判斷 b 的類型,此時typeof a === "object",不是原始類型,也不是字符串,因此會先執行b.valueOf()
2.b.valueOf()得到的結果是 {arr: Array(3), toString: ?}, 不是原始類型. 不是字符串, 因此執行b.toString()
3.由于toString()被覆蓋了,因此執行覆蓋后的toString(),每一次都會返回b.arr的尾元素,并更新b.arr
3.得出三次執行結果為 1, 2, 3, 實現了這個功能
3.
var c = { arr: [3, 2, 1], [Symbol.toPrimitive] () { console.group("Symbol.toPrimitive"); console.log(this.arr); console.group("Symbol.toPrimitive"); return this.arr.pop(); } } if (c == 1 && c == 2 && c == 3) { console.log("yes"); }
執行結果:
解析:
先把上面的方法合并,測試優先級:
var d = { arr: [3, 2, 1], valueOf () { console.group("valueOf"); console.log(this.arr); console.groupEnd("valueOf"); return this.arr.pop(); }, toString () { console.group("toString"); console.log(this.arr); console.groupEnd("toString"); return this.arr.pop(); }, [Symbol.toPrimitive] () { console.group("Symbol.toPrimitive"); console.log(this.arr); console.group("Symbol.toPrimitive"); return this.arr.pop(); } } if (d == 1 && d == 2 && d == 3) { console.log("yes"); }
執行結果:
可以看出會先執行toPrimitive這個原生方法,但是被覆蓋了,所以執行覆蓋后的toPrimitive()
4.
var f = { reg: /d/g, valueOf() { return this.reg.exec(123)[0] } } if (f == 1 && f == 2 && f == 3) { console.log("yes"); }
執行結果:
解析:
1.exec() 方法在一個指定字符串中執行一個搜索匹配。返回一個結果數組或 null。
2.如果匹配成功,exec() 方法返回一個數組,并更新正則表達式對象的屬性。返回的數組將完全匹配成功的文本作為第一項,將正則括號里匹配成功的作為數組填充到后面。如果匹配失敗,exec() 方法返回 null。
3.先測試 var reg=/d/g; reg.exec(123);得到以下結果:
可看到正則進行全局搜索,判斷返回一個數據,數組的首元素為成功匹配的文本
4.因此每次進行 f == 1, f == 2, f == 3 時都會返回數組的首元素,也就是匹配的文本.由此實現這個功能
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/105774.html
要是別人問您:如何讓 x 等于 1 且讓 x 等于 2 且讓 x 等于 3 的等式成立? 咋地,知道如何實現?想罵人有不 現在我們一起來分解思路: 我們先來講講寬松相等== 和嚴格相等 ===,這兩個都能用來判斷兩個值是否相等,但們明確上文提到的等于指的是哪一種,二者的區別看下: (1) 這兩個基礎直接的區別: (1.1) 不同類型間比較,== 比較轉化成同一類型后的值看值是否相等,...
這篇文章為大家講如何用JSd代碼實現音樂播放。 音樂播放的主要js代碼 音樂數據的數組對象 這里不僅有前端網頁提供數據,還有為后面的js代碼提供了音樂路徑,分享給大家。 { ablum:"海闊天空", artist:"Beyond", id:1, name:"大地", path:"musics/1...
今天主要就是匯總JavaScript數組的9中不同方法匯總,也將詳細示例展示給大家。 如果你還不知道數組實例中迭代方法有什么區別,可以看下面這張圖: map 代表返回一個新的數組,且數組中的每一項都是執行過map提供的回調函數結果。 實現代碼如下: constmap=(array,fun)=>{ //類型約束 if(Object.prototype.toString.c...
什么是樹 現實中樹隨處可見;在計算機世界,樹就是一種分層結構的抽象模型。 如下圖所示: 樹結構的可以用在很多情景,就如下圖公司的組織架構,用樹就可以表達出來,如下圖: 組織架構只是其中之一,比如族譜、省市等用樹的結構形式展現是完全可以。 樹的術語 樹有很多的術語,如下圖: 樹:n(n≥0)個節點所構成的有限集合,當n=0時,稱為空樹; 節點的度:節點的子樹個數,例如B節點的度就...
我們說下想要實現,一副牌里有54張,我們可以知道 3 - 2 的牌總共有13張,這分為4個花色是 ?? ?? ?? ?? 另外加上2個大小王!第一步:形成一個數組, 就要寫一個函數,利用牌數量和花色,這樣可以用來形成一個雙重循環將 number 里面的內容 和 flower 里面的內容 進行一個循環嵌入?最后在用 push 生成一個對象放到數組的后面?再到最后放入 大小王 。 constnu...
閱讀 1261·2023-04-25 19:10
閱讀 1140·2021-09-10 10:50
閱讀 3028·2021-09-02 15:21
閱讀 1383·2019-08-30 15:52
閱讀 1681·2019-08-30 13:56
閱讀 2077·2019-08-30 12:53
閱讀 1870·2019-08-28 18:22
閱讀 2115·2019-08-26 13:47