2015-07-28 13 views
5

Nếu tôi có biến chưa khai báo và sử dụng typeof, nó cho tôi biết là undefined. Nhưng nếu tôi sau đó kiểm tra nó bằng cách sử dụng if (qweasdasd === undefined) nó ném một ngoại lệ.Sử dụng typeof vs === để kiểm tra biến không khai báo tạo ra kết quả khác nhau

Tôi không hiểu hành vi này, bởi vì nếu lần đầu tiên thông báo undefined, thì kiểm tra thứ hai sẽ được đánh giá là if (undefined === undefined), tại sao nó lại ném ngoại lệ ReferenceError?

+0

Không thể tái sản xuất: http://jsfiddle.net/y1xhw9un/ – Jamiec

+0

@Jamiec - Có thể tái sản xuất: http: // jsfiddle.net/y1xhw9un/1/ – Quentin

+0

@Quentin - ahh, thats * undeclared *, Khi nó không được xác định, thì nó hoạt động http://jsfiddle.net/y1xhw9un/2/ – Jamiec

Trả lời

7

typeof trông giống như một cuộc gọi chức năng, nhưng không phải - đó là toán tử. Các nhà khai thác được phép phá vỡ các quy tắc. typeof(qweasdasd) không giả định qweasdasd tồn tại; cho dù nó tồn tại hay không và những gì nó là những gì typeof tồn tại để khám phá. Tuy nhiên, khi bạn kiểm tra qweasdasd === undefined, bạn đang sử dụng qweasdasd làm giá trị và JS phàn nàn khi bạn sử dụng biến mà bạn chưa chỉ định giá trị.

+0

Nhưng nó không phải là một lời nói dối để nói rằng 'qweasdasd' là một' undefined'? Bởi vì sau đó trong tâm trí của tôi kiểm tra 'if' là hoàn toàn hợp lệ và nên đánh giá để' if (undefined === undefined) '. – damluar

+1

JavaScript là một chút bối rối ở đây (và nó không phải là nơi duy nhất; không làm cho tôi bắt đầu vào sự điên rồ của 'sắp xếp'). Như tôi đã nói, không xác định và có giá trị 'undefined' là hai thứ khác nhau, một tình huống không may làm trầm trọng thêm bởi thực tế là 'typeof (qweasdasd)' và 'typeof (undefined)' đều tạo ra cùng một kết quả. – Amadan

+0

Đôi khi bạn chỉ cần từ bỏ việc hiểu logic của javascript. – damluar

1

Cố gắng đọc giá trị của biến chưa khai báo (mà bạn phải làm trước khi bạn có thể so sánh giá trị đó với giá trị undefined) ném một tham chiếu lỗi.

Áp dụng toán tử typeof cho biến không được khai báo không.

+0

Tại sao 'typeof' hoạt động khác với, ví dụ, unary' + '(ví dụ:' + foo -> boom! ')? –

0

Bạn có biến không xác định, nhưng không phải là giá trị đối tượng không xác định.

console.log(variable) // undefined 
console.log(typeof variable) // "undefined" 
console.log(variable === undefined) // Reference error 
variable = undefined ; 
console.log(variable === undefined) // true 
0

Cố gắng truy cập biến không xác định trong Javascript cung cấp ReferenceError. typeof đang hoạt động vì không truy cập được giá trị biến. Nó kiểm tra kiểu của nó.

typeof không yêu cầu biến được xác định. Tham số của nó phải là một biểu thức đại diện cho đối tượng hoặc nguyên thủy có kiểu được trả về.

0

typeof là toán tử trả về cho bạn chuỗi chỉ ra loại toán hạng chưa được đánh giá. Nó không quan trọng nếu toán hạng chưa được đánh giá là không xác định hay không. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/typeof

>>> if (a !== 'undefined'); 
Exception: ReferenceError: Can't find variable: a 
>>> if (typeof a !== undefined); 
undefined 
>>> if (typeof a !== void 0); 
undefined 
+0

'typeof (parseInt)': '" function "'. Nhưng 'typeof (typeof)': 'SyntaxError'. 'typeof' là * không phải là hàm *; nếu nó * là * một hàm, nó sẽ cung cấp cho 'ReferenceError' giống như' parseInt (qweasdasd) '. – Amadan

+0

Có, bạn chính xác, tôi đã chỉnh sửa câu trả lời của tôi. –

1

Tôi nghĩ rằng tôi có một lời giải thích rất đơn giản cho điều này - vì các thông số kỹ thuật nói như vậy:

  • typeof operator không có nghĩa vụ phải ném ngoại lệ ReferenceError nếu biến không được định nghĩa
  1. If Type(val) is Reference, then
    a. If IsUnresolvableReference(val) is true, return "undefined" .
  • === operator là nghĩa vụ phải ném ngoại lệ ReferenceError nếu toán hạng (s) tham khảo các biến không xác định
  1. Let lval be GetValue(lref).

[And inside the definition of GetValue we have]

  1. Let base be the result of calling GetBase(V).
  2. If IsUnresolvableReference(V), throw a ReferenceError exception.
Các vấn đề liên quan