2013-07-03 34 views
5
<script type="text/javascript"> 
function saveName (firstName) { 
    function capitalizeName() { 
     return firstName.toUpperCase(); 
    } 
    var capitalized = capitalizeName();console.log(capitalized instanceof String); 
    return capitalized; 
} 
console.log(saveName("Robert")); // Returns "ROBERT" 
</script> 

Câu hỏi:cách tốt nhất để kiểm tra loại biến trong javascript là gì

Tôi muốn kiểm tra các loại hoa, vì vậy tôi sử dụng capitalized instanceof String? Nhưng nó cho thấy: false trong giao diện điều khiển, tôi không muốn thử capitalized instanceof Function, Object ... Sẽ mất quá nhiều thời gian, vậy cách tốt nhất để phát hiện loại biến là gì?

+1

Vì chuỗi ký tự không phải là đối tượng của loại 'Chuỗi'. Xem 'typeof capitalized' – zerkms

Trả lời

13

Cách tốt nhất là sử dụng từ khóa typeof.

typeof "hello" // "string" 

Nhà điều hành typeof bản đồ một toán hạng cho một trong sáu giá trị: "string", "number", "object", "function", "undefined""boolean". Các thử nghiệm phương pháp instanceof nếu nguyên mẫu của hàm được cung cấp nằm trong chuỗi nguyên mẫu của đối tượng.

This Wikibooks article cùng với this MDN articles thực hiện công việc khá tốt khi tổng hợp các loại JavaScript.

+0

' typeof new String ("hello") == "object" 'nhưng nó có thể được hưởng lợi từ tất cả các đặc tính giống nhau của' string'. Nó sẽ là an toàn nhất để nói 'typeof x ==" string "|| x instance of String' –

+0

Tôi cho rằng bạn đúng, mặc dù trong thực tế, tôi hầu như không bao giờ thấy 'chuỗi mới (" hello ")' được sử dụng. – LandonSchropp

+0

"JavaScript chỉ có năm loại được tích hợp sẵn:" Điều đó sai. Có nhiều hơn nữa. Toán tử 'typeof' ánh xạ chúng tới sáu kết quả có thể có. Bạn quên 'boolean '' ở đó. – user123444555621

0

sử dụng typeof();

dụ:

> typeof "foo" 
"string" 
> typeof true 
"boolean" 
> typeof 42 
"number" 

Vì vậy, bạn có thể làm:

if(typeof bar === 'string') { 
    //whatever 
} 

Hãy ghi nhớ rằng, typeof chỉ tốt cho trở về các loại "nguyên thủy", số lượng, boolean, đối tượng, chuỗi. Bạn cũng có thể sử dụng instanceof để kiểm tra nếu một đối tượng thuộc loại cụ thể.

function MyObj(prop) { 
    this.prop = prop; 
} 

var obj = new MyObj(10); 

console.log(obj instanceof MyObj && obj instanceof Object); // outputs true 
1

Cách tốt nhất là sử dụng typeof

typeof "blahha" 

tôi đã thực hiện một chức năng với sự giúp đỡ của mã thư viện jQuery, jQuery library type method github link.

var getType = (function() { 

    var objToString = ({}).toString , 
     typeMap  = {}, 
     types = [ 
      "Boolean", 
      "Number", 
      "String",     
      "Function", 
      "Array", 
      "Date", 
      "RegExp", 
      "Object", 
      "Error" 
     ]; 

    for (var i = 0; i < types.length ; i++){ 
     typeMap[ "[object " + types[i] + "]" ] = types[i].toLowerCase(); 
    };  

    return function(obj){ 
     if (obj == null) { 
      return String(obj); 
     } 
     // Support: Safari <= 5.1 (functionish RegExp) 
     return typeof obj === "object" || typeof obj === "function" ? 
      typeMap[ objToString.call(obj) ] || "object" : 
      typeof obj; 
    } 
}()); 

Bạn có thể gọi nó như getType("Hello")

0

Các getVarType phương pháp (dưới đây) làm việc cho gần như tất cả các biến. Check out this fiddle. Đầu tiên nó sử dụng loại rất nhanh cho các trường hợp kết quả đáng tin cậy. Sau đó, nó sử dụng phương pháp toString tốn kém hơn cho các trường hợp khác. Cuối cùng, nếu nó đang xử lý một đối tượng được đặt tên (như được trả về bởi Firefox cho các đối tượng như document.location), nó sẽ kiểm tra các đối tượng giống như mảng và báo cáo chúng như các mảng.

Để so sánh, typeof thật đáng xấu hổ. typeof ([]) trả về đối tượng '', typeof (new Number()) trả về đối tượng. Nó cũng trả về 'đối tượng' cho nhiều biến khác không phải là đối tượng thực tế. Xem kết quả fiddle để so sánh.

// Begin public utility /getVarType/ 
    // Returns 'Function', 'Object', 'Array', 
    // 'String', 'Number', 'Null', 'Boolean', or 'Undefined' 
    // 
    getVarType = (function() { 
    var typeof_map = { 
     'undefined' : 'Undefined', 
     'boolean' : 'Boolean', 
     'number' : 'Number', 
     'string' : 'String', 
     'function' : 'Function', 

     'Undefined' : 'Undefined', 
     'Null'  : 'Null', 
     'Boolean' : 'Boolean', 
     'Number' : 'Number', 
     'String' : 'String', 
     'Function' : 'Function', 
     'Array'  : 'Array', 
     'StyleSheetList' : 'Array' 
    }; 

    return function(data) { 
     var type, type_str; 

     if (data === null  ) { return 'Null'; } 
     if (data === undefined) { return 'Undefined'; } 

     type  = typeof(data); 
     type_str = typeof_map[ type ]; 

     if (type_str) { return type_str; } 

     type = {}.toString.call(data).slice(8, -1); 
     return typeof_map[ type ] 
     || (data instanceof Array ? 'Array' : 
     (data.propertyIsEnumerable(0) && data.length !== undefined 
      ? 'Array' : 'Object') 
     ); 
    }; 
    }()); 
    // End public utility /getVarType/ 

Chế độ lỗi duy nhất có thể xảy ra nếu bạn đang thử nghiệm một mảng được đặt tên trống (ví dụ:một đối tượng DOM enumerable rỗng bên cạnh StyleSheetList). Nhưng trên có thể thêm những người vào type_of_map khi cần thiết.

Tôi hy vọng điều đó sẽ hữu ích!

0

Loại biến số Javascript có thể được quyết định với typeof/instanceOf.

Nhưng làm thế nào để phân biệt giữa các mảng và các đối tượng, vì:

typeof [] === typeof {} 

Dễ dàng chúng ta có thể phân biệt chúng với có tên lớp với toString:

function what(v) { 
    if (v === null) return 'null'; 
    if (v !== Object(v)) return typeof v; 
    return ({}).toString.call(v).slice(8, -1).toLowerCase(); 
} 

Hãy để tôi kiểm tra what chức năng:

what({}); // 'object' 
what({abc: 123}); // 'object' 

what([]); // 'array' 
what([123, 'abc']); // 'array' 

what(function() {}); // 'function' 
what(setTimeout); // 'function' 

what(/^what\.js$/); // 'regexp' 

what(new Date()); // 'date' 

what(null); // 'null' 
what(undefined); // 'undefined' 

what('abc'); // 'string' 
what(123); // 'number' 
what(12.3); // 'number' 

what(true); // 'boolean' 
what(false); // 'boolean' 

Chức năng what chỉ dành cho việc kiểm tra kiểu của một biến duy nhất, Cách kiểm tra một biến phức tạp.

Để xử lý trường hợp này, tôi làm điều gì đó dựa trên what(), với dự án nguồn mở có tên variable-type, rất dễ sử dụng, bạn có thể thử.

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