2011-09-13 27 views

Trả lời

3

bạn không thể. a!=b được thực hiện trước và chỉ kết quả của việc này (true hoặc false) được trao cho chức năng của bạn để bạn không có cơ hội nhận lại a!=b hoặc 2!=3.

+0

tại sao câu trả lời này nhận được 3 phiếu khi nó không thực sự giải quyết các câu hỏi yêu cầu và thay vào đó chỉ ra một lỗi cú pháp trong một câu hỏi mà thậm chí không có nhiều cú pháp? Cấp, đó là một gợi ý hữu ích, nhưng tôi không thấy làm thế nào nó có giá trị bỏ phiếu lên như là câu trả lời "tốt nhất" vì nó không thực sự là một ở tất cả. –

+1

@GeniaS. ... nó trực tiếp giải quyết các mối quan tâm của OP ... họ muốn nhận được các giá trị từ bên trong var a và b, không phải là giá trị được truyền. Thay đổi tinh tế trong việc đọc câu hỏi .... – Rondo

2
console.log (arguments) 

sẽ in các đối số cho các chức năng, nhưng trong trường hợp của bạn, tất cả các chức năng của bạn thấy là một boolean, vì a != b sẽ được đánh giá đầu tiên, và chỉ có kết quả thông qua như là một tham số trong lời gọi hàm.

1

umm ... ở đây, tôi sẽ google nó cho bạn :) http://www.seifi.org/javascript/javascript-arguments.html

Theo một số người khác đã chỉ ra, đi qua trong một thử nghiệm (a! = B) sẽ chỉ giúp bạn có được một giá trị boolean (true | false) làm đối số của bạn. Nhưng nếu bạn gọi myAssert (a, b), bạn có thể đánh giá các đối số và kiểm tra sự bình đẳng của chúng, cũng như in các giá trị của chúng, theo lời khuyên trong liên kết tôi đã dán.

+0

Tôi google'd nó và kết thúc ở đây ... đó không phải là quá xấu, phải không? :) – Rondo

0

Bạn không thể làm điều đó. Khi bạn có những dòng sau:

my_assert(a!=b); 

Khái niệm a!=b đầu tiên sẽ được đánh giá và kết quả của nó sẽ được chuyển đến my_assert.

Giả sử hàm số my_assert() bạn được sử dụng đặc biệt cho các thử nghiệm riêng của bạn và bạn có thể kiểm soát cách thức hoạt động và những gì bạn vượt qua vào nó, bạn có thể làm một cái gì đó như thế này:

my_assert(a!=b, "a!=b"); 

Ie, vượt qua một tham số bổ sung cho các chức năng với một chuỗi đại diện của những gì đang được thử nghiệm. Rõ ràng điều đó không ngăn bạn vô tình nói rằng my_assert(a!=b, "a==b");, và nó rất khó, nhưng tôi không thể nghĩ ra một cách khác để làm điều đó.

+0

Hoặc đúng hơn là 'khẳng địnhNotEqual (a, b)' – Thilo

+0

Điểm tốt @Thilo, mặc dù điều đó vẫn không cho phép hàm xác nhận biết tên của các biến được truyền vào. Rõ ràng trong câu trả lời của tôi, tôi đã suy nghĩ nhiều hơn về một 'assertIsTrue (biểu hiện bất kỳ) '. – nnnnnn

0

Ở đây bạn đi:

my_assert = (test) -> 
    str = my_assert.caller.toString() 
    match = /return my_assert\((.*)\)/.exec str 
    console.log match[1], test 

a = '1' 
b = '2' 
do -> my_assert(a!=b) 
do -> my_assert(b!=a) 


> a !== b true 
> b !== a true 

http://jsfiddle.net/m7qRN/

Thông báo trước là bạn phải gọi my_assert cuộc gọi từ chức năng ẩn danh riêng biệt để có thể chắc chắn lấy mã nguồn của cuộc gọi khẳng định .

Trong CoffeeScript, nó không quá tệ khi sử dụng ký hiệu do ->.

Trong JS, đây là: (function(){my_assert(a!=b)})();.

Bạn có thể vượt qua trong các thử nghiệm như một chức năng như vậy:

my_assert -> a!=b

my_assert(function(){a!=b});

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