Những gì khẳng định hung dữ trong JavaScript là gì?


263

Không gì assertcó nghĩa là trong JavaScript?

Tôi đã thấy một cái gì đó như:

assert(function1() && function2() && function3(), "some text");

Và muốn biết những gì phương pháp assert()làm.

Câu trả lời:


367

Không có assertJavaScript (chưa có, nói về việc thêm một , nhưng nó ở giai đoạn đầu). Có lẽ bạn đang sử dụng một số thư viện cung cấp một. Ý nghĩa thông thường là ném lỗi nếu biểu thức được truyền vào hàm là sai; đây là một phần của khái niệm chung về kiểm tra khẳng định . Thông thường các xác nhận (như chúng được gọi) chỉ được sử dụng trong các bản dựng "thử nghiệm" hoặc "gỡ lỗi" và loại bỏ mã sản xuất.

Giả sử bạn có một hàm được cho là luôn chấp nhận một chuỗi. Bạn muốn biết nếu ai đó gọi hàm đó bằng một chuỗi không phải là một chuỗi. Vì vậy, bạn có thể làm:

assert(typeof argumentName === "string");

... Trường hợp assertsẽ ném một lỗi nếu điều kiện là sai.

Một phiên bản rất đơn giản sẽ như thế này:

function assert(condition, message) {
    if (!condition) {
        throw message || "Assertion failed";
    }
}

Tốt hơn nữa, hãy sử dụng Errorđối tượng nếu công cụ JavaScript hỗ trợ nó (những cái thực sự cũ có thể không), có lợi thế là thu thập dấu vết ngăn xếp và như vậy:

function assert(condition, message) {
    if (!condition) {
        message = message || "Assertion failed";
        if (typeof Error !== "undefined") {
            throw new Error(message);
        }
        throw message; // Fallback
    }
}

Ngay cả IE8 cũng có Error(mặc dù nó không có stacktài sản, nhưng các công cụ hiện đại [bao gồm cả IE hiện đại] thì có).


6
... nhận được sự quan tâm về các loại trong JS? Tôi cho rằng đó là một trong những lý do tồi tệ nhất assert.
cHao

137
@cHao: Có trường hợp sử dụng hợp lệ. Đó chỉ là ví dụ đầu tiên xuất hiện trong đầu. Ví dụ không phải là vấn đề. Khái niệm khẳng định là điểm.
TJ Crowder

4
một cái gì đó mà tôi đã thêm vào mã của tôi bên trong if(!condition)được thiết lập var throwError=true;sau đó debugger;sau đó quấn phần ném trong một if(throwError). Theo cách đó, nếu tôi mở trình gỡ lỗi, nó sẽ bị throwErrorhỏng và nếu tôi muốn, tôi có thể đặt thành sai và sau đó kiểm tra tất cả các phạm vi trong khi bước ra ngoài.
Rick

8
@Rick nếu bạn sử dụng Chrome DevTools, bạn chỉ cần bật "Tạm dừng các trường hợp ngoại lệ chưa được xử lý" trong tab Nguồn và nó sẽ tự động ngắt tại throw. Bằng cách đó bạn không cần debugger;tuyên bố. Xem developer.chrome.com/devtools/docs/v để biết thêm.
Vicky Chijwani

1
@machineghost: Tôi không thấy cách đó "đơn giản hơn", bạn vừa giao dịch ifcho một nhà điều hành có điều kiện. Dù sao, trong thế giới ngày nay, tôi sẽ không bận tâm đến việc hỗ trợ các công cụ không có Error.
TJ Crowder

157

Nếu sử dụng trình duyệt hiện đại hoặc nodejs, bạn có thể sử dụng console.assert(expression, object).

Để biết thêm thông tin:


46
FYI, điều này hoạt động giống như console.errortrong đó mã tiếp tục thực thi.
Daniel Sokolowski

10
@DanielSokolowski, Chính xác. console.assertlà không tốt, trừ khi nó có hành vi tương tự như throw.
Pacerier

23
Việc thực hiện lý do tiếp tục sau đó console.assertlà vì các xác nhận không phải là các hàm xử lý lỗi. Chúng được thiết kế để kiểm tra tính chính xác của mã trong quá trình phát triển. Theo truyền thống, họ bị vô hiệu hóa hoàn toàn trong môi trường sản xuất để tránh các hệ thống sống chấm dứt vì một cái gì đó tầm thường. Trình duyệt được coi là một môi trường sản xuất, vì vậy console.assertkhông chấm dứt thực thi ở đó. Nếu bạn đang dựa vào các xác nhận để dừng thực thi thì bạn nên sử dụng xử lý lỗi thích hợp thay vào đó, vì đây không phải là xác nhận dành cho.
Malvineous

8
@RonBurk: Các nhà thiết kế ngôn ngữ đã quyết định "những xác nhận đó có nghĩa là gì". Trong C ++ [một xác nhận] được thiết kế để ghi lại các lỗi lập trình, không phải lỗi người dùng hoặc thời gian chạy, vì nó thường bị vô hiệu hóa sau khi chương trình thoát khỏi giai đoạn gỡ lỗi. PHP nói Theo quy tắc, mã của bạn sẽ luôn có thể hoạt động chính xác nếu kiểm tra xác nhận không được kích hoạt. Tiếng nói thụ động không có nghĩa là trao quyền cho một sở thích cá nhân, mà là để báo cáo những gì được chấp nhận rộng rãi thực tiễn chung.
Malvineous

4
@Don: Điểm lấy nhưng tôi chỉ trích dẫn từ các trang được liên kết. Tôi tin rằng các xác nhận nên được xử lý như thể chúng có thể bị vô hiệu hóa, nếu chỉ vì mã của bạn một ngày nào đó có thể được sử dụng bởi một người cho rằng nó an toàn để làm như vậy. Nếu các xác nhận là quan trọng đối với mã của bạn, thì tôi nghĩ rằng chúng thực sự nên được nâng cấp lên kiểm tra lỗi thích hợp thay vì dựa vào phương pháp gỡ lỗi không phải lúc nào cũng được đảm bảo để chấm dứt thực thi. Chưa kể đến việc mã của bạn liên tục chết trong môi trường sản xuất khi nó có thể trả về lỗi và tiếp tục có thể gây ra căng thẳng nhiều hơn giá trị của nó!
Malvineous

29

Các câu trả lời khác đều tốt: không có chức năng khẳng định nào được tích hợp trong ECMAScript5 (ví dụ: JavaScript hoạt động cơ bản ở mọi nơi) nhưng một số trình duyệt cung cấp cho bạn hoặc có các tiện ích bổ sung cung cấp chức năng đó. Mặc dù có lẽ tốt nhất là sử dụng một thư viện được thiết lập tốt / phổ biến / được duy trì cho việc này, cho mục đích học thuật, chức năng "người đàn ông nghèo" có thể trông giống như thế này:

const assert = function(condition, message) {
    if (!condition)
        throw Error('Assert failed: ' + (message || ''));
};

assert(1 === 1); // Executes without problem
assert(false, 'Expected true');
// Yields 'Error: Assert failed: Expected true' in console


BTW, người ta có thể dễ dàng sửa đổi điều này để nó chỉ gây ra lỗi trong môi trường phát triển (ví dụ: bằng cách gói vào một cái khác nếu / thêm một điều kiện khác) và nếu không thì không có gì hoặc chỉ in cảnh báo. Cá nhân, ý kiến ​​của tôi là các xác nhận chỉ nên có trong mã kiểm tra (ví dụ: kiểm tra xem kết quả dự kiến ​​và kết quả thực tế có phù hợp không); trong mã sản xuất họ nên hoặc được thừa (đảm bảo đúng theo thiết kế) và do đó loại bỏ hoặc chỉ dành cho bảo vệ người dùng / đầu vào bên ngoài trong trường hợp này họ có thể được thay thế bằng sanitizing logic & xử lý ngoại lệ tiêu chuẩn (ví dụ như try, catch, throw)
iX3

8

assert()không phải là một chức năng javascript gốc. Nó là một chức năng tùy chỉnh ai đó thực hiện. Bạn sẽ phải tìm nó trên trang của bạn hoặc trong các tệp của bạn và đăng nó cho bất kỳ ai để giúp xác định những gì nó đang làm.


5

kiểm tra điều này: http://net.tutsplus.com/tutorials/javascript-ajax/quick-tip-quick-and-easy-javascript-testing-with-assert/

nó là để thử nghiệm JavaScript. Thật đáng ngạc nhiên, chỉ trong năm hoặc sáu dòng, mã này cung cấp một mức độ mạnh mẽ và khả năng kiểm soát mã của bạn khi kiểm tra.

Hàm khẳng định chấp nhận hai tham số:

kết quả: Một boolean, tham chiếu cho dù bài kiểm tra của bạn vượt qua hay thất bại

mô tả: Một mô tả ngắn về bài kiểm tra của bạn.

Sau đó, chức năng khẳng định chỉ đơn giản là tạo một mục danh sách, áp dụng một lớp của Pass pass hay hoặc không thành công, tùy thuộc vào việc kiểm tra của bạn trả về đúng hay sai, sau đó thêm mô tả vào mục danh sách. Cuối cùng, khối mã hóa đó được thêm vào trang. Thật điên rồ, nhưng hoạt động hoàn hảo.


4

Đây là một thực hiện đơn giản của một chức năng khẳng định. Nó có một giá trị và một mô tả về những gì bạn đang thử nghiệm.

 function assert(value, description) {
        var result = value ? "pass" : "fail";
        console.log(result + ' - ' +  description); 
    };

Nếu giá trị ước tính là đúng, nó sẽ vượt qua.

assert (1===1, 'testing if 1=1');  

Nếu nó trả về sai thì thất bại.

assert (1===2, 'testing if 1=1');

1
Mục đích của một xác nhận không phải là đăng nhập vào thiết bị xuất chuẩn ở mức thông tin, mà là dừng thực thi chương trình (thường đưa ra một ngoại lệ) và đăng nhập vào thiết bị lỗi chuẩn nếu xác nhận được đánh giá là sai.
Nuno André

4

Nếu xác nhận là sai, thông báo sẽ được hiển thị. Cụ thể, nếu đối số thứ nhất là sai, đối số thứ hai (thông báo chuỗi) sẽ được ghi vào bảng điều khiển công cụ dành cho nhà phát triển. Nếu đối số đầu tiên là đúng, về cơ bản không có gì xảy ra. Một ví dụ đơn giản - Tôi đang sử dụng Google Developer Tools:

var isTrue = true;
var isFalse = false;
console.assert(isTrue, 'Equals true so will NOT log to the console.');
console.assert(isFalse, 'Equals false so WILL log to the console.');

3

Nó có thể đi kèm với một thư viện thử nghiệm mà một số mã của bạn đang sử dụng. Đây là một ví dụ về một (rất có thể đó không phải là thư viện giống như mã của bạn đang sử dụng, nhưng nó cho thấy ý tưởng chung):

http://chaijs.com/guide/styles/#assert


2

Từ hoặc chức năng "khẳng định" chủ yếu được sử dụng trong các phần thử nghiệm của ứng dụng.

Các hàm khẳng định là một cách ngắn để hướng dẫn chương trình kiểm tra điều kiện (còn gọi là "khẳng định") và nếu điều kiện này không đúng, nó sẽ đưa ra lỗi.

Vì vậy, hãy xem nó trông như thế nào trong "mã bình thường"

if (typeof "string" === "array") { throw Error('Error: "string" !== "array"'); }

Với assertbạn chỉ có thể viết:

assert(typeof "string" === "array")

Trong Javascript, không có assertchức năng gốc , vì vậy bạn phải sử dụng một chức năng từ một số thư viện.

Để giới thiệu đơn giản, bạn có thể kiểm tra bài viết này:

http://fredkschott.com/post/2014/05/nodejs-testing-essentials/

Tôi hy vọng nó sẽ giúp.


2

Xác nhận ném thông báo lỗi nếu thuộc tính đầu tiên là sai và thuộc tính thứ hai là thông báo được ném.

console.assert(condition,message);

Có nhiều ý kiến ​​nói rằng khẳng định không tồn tại trong JavaScript nhưng console.assert()là chức năng khẳng định trong JavaScript Ý tưởng của khẳng định là tìm lý do tại sao / nơi xảy ra lỗi.

console.assert(document.getElementById("title"), "You have no element with ID 'title'");
console.assert(document.getElementById("image"), "You have no element with ID 'image'");

Ở đây tùy thuộc vào thông báo bạn có thể tìm thấy lỗi là gì. Các thông báo lỗi này sẽ được hiển thị cho bảng điều khiển màu đỏ như thể chúng ta đã gọi console.error();
Để xem thêm các chức năng trong bảng điều khiển thực thiconsole.log(console);


1

Câu trả lời trước có thể được cải thiện về hiệu suất và khả năng tương thích.

Kiểm tra một lần nếu Errorđối tượng tồn tại, nếu không khai báo nó:

if (typeof Error === "undefined") {
    Error = function(message) {
        this.message = message;
    };
    Error.prototype.message = "";
}

Sau đó, mỗi xác nhận sẽ kiểm tra điều kiện và luôn ném một Errorđối tượng

function assert(condition, message) {
    if (!condition) throw new Error(message || "Assertion failed");
}

Hãy nhớ rằng bàn điều khiển sẽ không hiển thị số dòng lỗi thực sự, nhưng dòng của assertchức năng, không hữu ích để gỡ lỗi.


1

Nếu bạn sử dụng webpack, bạn chỉ có thể sử dụng thư viện khẳng định Node.js . Mặc dù họ cho rằng đó là "không có ý định là một thư viện xác nhận mục đích chung", nhưng dường như nó không ổn đối với các xác nhận ad hoc và dường như không có đối thủ nào tồn tại trong không gian Node (Chai được thiết kế để thử nghiệm đơn vị).

const assert = require('assert');
...
assert(jqXHR.status == 201, "create response should be 201");

Bạn cần sử dụng webpack hoặc browserify để có thể sử dụng cái này, vì vậy rõ ràng điều này chỉ hữu ích nếu chúng đã có trong quy trình làm việc của bạn.


1

Ngoài các tùy chọn khác như console.assert hoặc tự lăn , bạn có thể sử dụng bất biến . Nó có một vài tính năng độc đáo:

  • Nó hỗ trợ các thông báo lỗi được định dạng (sử dụng một %sspecifier).
  • Trong các môi trường sản xuất (như được xác định bởi môi trường Node.js hoặc Webpack), thông báo lỗi là tùy chọn, cho phép (hơi) nhỏ hơn .js.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.