不要讓Javascript的等價表格看上去那麼難看
2014年3月
時不時的會有人貼出一張表格,用來展現javascript的 '==' 比較出來的結果。像最近的這個例子,看看這張表格有多麼的無序。
這些文章基本上都是對的,他們指出 '==' 設計的很糟糕。但是他們通過表格的組織順序讓的結果看上去更糟。比如,這是之前的一張表格。
多麼的亂呀!但是這種混亂是因為表格裡值的順序。
通過恰當的分組,你會得到一個看上去更合理的表格:
這個看上去好多了。現在你看到了一些更合格的東西,很好地表格出了引用相等和價值相等,你可以很好地瞭解地哪些東西是等價的,哪些傳值操作是危險的。
這張表反應出了'=='的缺陷,而不是掩蓋圖本身的缺陷。
程式碼
下面是我用來組織圖表的程式碼。這個也可以在 js fiddle上面找到。
html
<canvas id="drawCanvas" width="500" height="500" />
Javascript:
var cmp = function(v1, v2) { return v1 == v2; }; var vals = [ ["false", function() { return false; }], ["0", function() { return 0; }], ['""', function() { return ""; }], ["[[]]", function() { return [[]]; }], ["[]", function() { return []; }], ['"0"', function() { return "0"; }], ["[0]", function() { return [0]; }], ["[1]", function() { return [1]; }], ['"1"', function() { return "1"; }], ["1",function() { return 1; }], ["true", function() { return true; }], ["-1", function() { return -1; }], ['"-1"', function() { return "-1"; }], ["null", function() { return null; }], ["undefined", function() { return undefined; }], ["Infinity", function() { return Infinity; }], ["-Infinity", function() { return -Infinity; }], ['"false"', function() { return "false"; }], ['"true"', function() { return "true"; }], ["{}", function() { return {}; }], ["NaN", function() { return NaN; }] ]; var canvas = document.getElementById("drawCanvas"); var ctx = canvas.getContext("2d"); var n = vals.length; var r = 20; // diameter of grid squares var p = 60; // padding space for labels // color grid cells for (var i = 0; i < n; i++) { var v1 = vals[i][1](); for (var j = 0; j < n; j++) { var v2 = vals[j][1](); var eq = cmp(v1, v2); ctx.fillStyle = eq ? "orange" : "white"; ctx.fillRect(p+i*r,p+j*r,r,r); } } // draw labels ctx.fillStyle = "black"; var f = 12; ctx.font = f + "px Helvetica"; for (var i = 0; i < n; i++) { var s = vals[i][0]; var w = ctx.measureText(s).width; ctx.save(); ctx.translate(p+i*r+r/2-f*0.4,p-w-2); ctx.rotate(3.14159/2); ctx.fillText(s, 0, 0); ctx.restore(); } for (var i = 0; i < n; i++) { var s = vals[i][0]; var w = ctx.measureText(s).width; ctx.fillText(s, p-w-2, p+i*r+r/2+f*0.4); } // draw grid lines ctx.beginPath(); ctx.strokeStyle = "black"; for (var i = 0; i <= n; i++) { ctx.moveTo(p+r*i, p); ctx.lineTo(p+r*i, p+r*n); ctx.moveTo(p, p+r*i); ctx.lineTo(p+r*n, p+r*i); } ctx.stroke();
摘要
JavaScript的 == 操作符是一種鬆散的比較,絕對有理由使用 === 來代替,但是它又不像上面的表格看起來的那麼差.
更新
讓 < 操作符看起來合理是比較難的, (js fiddle程式碼)
JS less-than 的表格
比較操作符的真值表格看起來像個三角形,當排列合適的順序,就會像一個樓梯,
相關文章
- 如何讓網頁設計不那麼難看[資訊檢視]網頁
- 新款MacBook Air價格優惠等於效能縮水,蘋果吃相難看MacAI蘋果
- CORS 理解(不要那麼多術語)CORS
- 遊戲的留存為什麼那麼難調?遊戲
- Javascript之其實我覺得原型鏈沒有難的那麼誇張!JavaScript原型
- block沒那麼難(一):block的實現BloC
- 神奇的JavaScript弱等價型別轉換JavaScript型別
- 聊聊Spring的FactoryBean其實沒那麼難SpringBean
- Python的協程真的有那麼難嗎?Python
- Excel 中的 VLOOKUP 函式,沒你想的那麼難Excel函式
- 閉包並不那麼難以理解
- 在遊戲裡“翻盤”為什麼那麼難?遊戲
- 自己實現JSON、XML的解析 沒那麼難JSONXML
- 智慧經營3.0真有那麼難嗎?做到這些就不難!
- 為什麼有些設計師找工作那麼難?
- 自動化測試落地為什麼那麼難
- 軟體人才並沒有那麼難找
- 給程式設計師的壞建議:不要工作得那麼辛苦程式設計師
- iOS遊戲開發沒有你想的那麼難–HardestiOS遊戲開發
- 讓人難以置信的HTML5和JavaScript實驗HTMLJavaScript
- 前端入門那麼容易,工作很難找嗎?前端
- ijkplayer編譯so庫真沒那麼難編譯
- 讓你的Qt桌面程式看上去更加native(四):stylesheetQT
- 讓你的Qt桌面程式看上去更加native(二):StyleQT
- Netty快速上手:Netty沒有你想象的那麼難Netty
- block沒那麼難(三):block和物件的記憶體管理BloC物件記憶體
- 【秋招復盤】覆盤我的美團,阿里,騰訊等面試經驗,其實進BAT上班真沒那麼難!阿里面試BAT
- 表格式佈局讓每個列高度等於該行最大高度
- JavaScript動態建立表格和增加表格的行JavaScript
- API 與 Webhook,其實並沒有那麼難懂APIWebHook
- 在重慶找個IT職位就那麼難嗎?
- 從難以普及的資料增強技術,看AI的價效比時代AI
- 【網路心情】讓我們的微笑不再那麼虛偽
- 大資料SQL中的Join謂詞下推,真的那麼難懂?大資料SQL
- block沒那麼難(二):block和變數的記憶體管理BloC變數記憶體
- 為什麼程式設計那麼難?是我腦子不行嗎?程式設計
- 為什麼開發一款APP價格那麼高APP
- 讓Aptana +RadRails 像TextMeta那麼強大薦APTAI