2011-09-12 27 views
5

Đọc rộng rãi về các khung công tác xác nhận khác nhau trong JavaScript. Có bất kỳ loại thư viện/khung công tác "chuẩn" phổ biến nhất nào không? Khi chọn một - điểm nào đáng chú ý nhất?Các xác nhận trong JavaScript

Yêu cầu (chỉ) mà tôi có thể nghĩ đến là chi phí hiệu năng gần bằng 0 khi ở chế độ sản xuất.

+0

Có thể chỉ là một trục trặc phrasing - nhưng hiệu suất bằng không là sản xuất sẽ là xấu. Có lẽ bạn có nghĩa là chi phí gần bằng không. –

+4

Xác nhận? Hm, 'console.assert()'? –

+0

@Marc B: bạn nói đúng :) sửa nó. – BreakPhreak

Trả lời

6

Hai giải pháp có thể có:

Có tập lệnh phát hành bản dựng của bạn xóa dòng Assert.

hoặc

Có tập lệnh xây dựng của bạn ghi đè hàm Assert để nó chỉ là một hàm trống. Nhược điểm này là nếu bạn khẳng định cuộc gọi có logic trong nó [aka khẳng định (x> 100, "foo")] hơn logic đó [x> 100] vẫn sẽ được chạy.

+0

đã đồng ý! vì vậy, không có cách nào để làm cho các đối số tính toán void, phải không? – BreakPhreak

+0

Cách duy nhất là xóa nó, hoặc thay đổi ngôn ngữ khẳng định thành giống như jUnit/JSUnit/QUnit nơi bạn có các kiểm tra khác nhau assertTrue, assertFalse, assertEquals, assertNotSame. – epascarello

+0

Giới thiệu về việc phê duyệt câu trả lời. Chỉ nếu có thể - bạn có thể làm rõ về điều sau không? Giống như, nếu tôi có 'assertTrue (a! = B)' - tôi có thể áp dụng mẹo nào, vì vậy mà 'a! = B' sẽ không được tính trong chế độ sản xuất (chi phí thấp hơn)? – BreakPhreak

4

Đây là những gì tôi sử dụng:

Khi tôi đang làm việc trên mã, tôi có initDevMode(); ở đầu tệp tôi đang làm việc và khi tôi sẵn sàng phát hành vào sản xuất, tôi chỉ xóa dòng đó và tất cả các xác nhận chỉ cần chuyển đến một hàm trống.

/** 
* Log a message to console: 
* either use jquery's console.error 
* or a thrown exception. 
* 
* call initDevMode(); before use to activate 
* use with: 
*  assert(<condition>, "message"); 
*  eg: assert(1 != 1, "uh oh!"); 
* 
* Log errors with: 
*  errorLog(message); 
*  eg: errorLog(xhr.status); 
*/ 
assert = function(test, msg) { } 
errorLog =function(msg) { } 

initDevMode = function() { 
    assert = function(test, msg) { 
     msg = msg || "(no error message)"; 
     if(!test) { 
      try { 
        throw Error(); 
       } catch(e) { 
        var foo = e; 
        var lines = e.stack.split('\n'); 
        for(i in lines) { 
         if(i > 2) { 
         errorLog(msg + lines[i]); 
        } 
       } 
      } 
     } 
     throw("Assertion failed with: " + msg); 
    }; 
    errorLog = function(msg) { 
     if(typeof console.error == 'function') { 
      console.error(msg); 
     } else { 
      function errorLog(msg) { 
       console.log("foo"); 
       setTimeout(function() { 
        throw new Error(msg); 
       }, 0); 
      } 
     } 
    }; 
} 
+1

Không nên 'ném ("Xác nhận không thành công")' cư trú bên trong 'nếu (! Kiểm tra)' khối? –

0

Hãy xem Jascree; về cơ bản nó là một công cụ có thể loại bỏ các xác nhận với logic gần như tùy ý từ mã của bạn. Nó rất tiện lợi để sử dụng như một bộ xử lý hàng loạt để tạo mã sản xuất của bạn hoặc cho một thư mục script được fastcgi hỗ trợ mà bạn có thể sử dụng khi bạn cần kiểm tra hiệu năng/cấu hình mã của bạn.

2

Tôi sử dụng thông tin sau để thay thế console.assert khi không khả dụng vì bất kỳ lý do gì.

Nó chắc chắn không phải là một tiêu chuẩn thực tế, và nó là xa lý tưởng, nhưng nó đáp ứng yêu cầu của bạn rằng khẳng định không được đánh giá trong chế độ sản xuất. Ngoài ra, nó cho bạn thấy biểu thức đã kích hoạt xác nhận không thành công, hỗ trợ gỡ lỗi.

Cú pháp gọi điện ngớ ngẩn (có biểu thức hàm) ở đó để tạo một đóng, để hàm xác nhận có quyền truy cập vào cùng các biến mà người gọi của nó có quyền truy cập.

Tôi nghi ngờ rằng tính năng này có thời gian biên dịch và thời gian chạy cao, nhưng tôi chưa thử xác minh điều đó.

function assert(func) { 
    var name; 
    if (typeof(ENABLE_ASSERTIONS) !== "undefined" && !ENABLE_ASSERTIONS) { 
     return; 
    } 
    name = arguments.callee.caller; 
    name = name ? name.name : "(toplevel)"; 
    if (!func()) { 
     throw name + ": assertion failed: " + ('' + func).replace(/function[^(]*\([^)]*\)[^{]*{[^r]*return/, '').replace(/;[ \t\n]*}[ \t\n]*$/, ''); 
    } 
} 

Sử dụng nó trông giống như:

function testAssertSuccess() { 
    var i = 1; 
    assert(function() { return i === 1; }); 
} 
function testAssertFailure() { 
    var j = 1; 
    assert(function() { return j === 2; }); 
} 
ENABLE_ASSERTIONS = true; 
testAssertSuccess(); 
testAssertFailure(); 

HTH!

Các vấn đề liên quan