[Đối tượng] có nghĩa là gì?


122

Tôi đang cố gắng cảnh báo một giá trị được trả về từ một hàm và tôi nhận được điều này trong cảnh báo:

[object Object]  

Đây là mã JavaScript:

<script type="text/javascript">
$(function ()
{
var $main = $('#main'),
    $1 = $('#1'),
    $2 = $('#2');

$2.hide(); // hide div#2 when the page is loaded

$main.click(function ()
{
    $1.toggle();
    $2.toggle();
});

 $('#senddvd').click(function ()
{
   alert('hello');
   var a=whichIsVisible();
   alert(whichIsVisible());
});

function whichIsVisible()
{
    if (!$1.is(':hidden')) return $1;
    if (!$2.is(':hidden')) return $2;
}

 });

 </script>

whichIsVisible là chức năng mà tôi đang cố gắng kiểm tra.


3
Nó có nghĩa là kiểu dữ liệu của những gì bạn trả về là một đối tượng.

Không quan tâm: bạn đang mong đợi điều gì sẽ trở lại?
Dancrumb

1
Bạn nên sử dụng bảng điều khiển JavaScript để xem xét các đối tượng bạn quan tâm (ví dụ: Fireorms).
Brian Donovan


Câu trả lời 2 là câu trả lời rõ ràng hơn, bạn có thể xem nó và chọn nó là câu trả lời được chấp nhận nếu bạn cảm thấy như vậy.
Suraj Jain

Câu trả lời:


53

Việc chuyển đổi mặc định từ một đối tượng thành chuỗi là "[object Object]".

Khi bạn đang xử lý các đối tượng jQuery, bạn có thể muốn làm

alert(whichIsVisible()[0].id);

để in ID của phần tử.

Như đã đề cập trong các nhận xét, bạn nên sử dụng các công cụ có trong các trình duyệt như Firefox hoặc Chrome để hướng nội các đối tượng bằng cách thực hiện console.log(whichIsVisible())thay vì alert.

Sidenote : ID không nên bắt đầu bằng chữ số.


3
[Trong HTML5, ID có thể bắt đầu bằng chữ số.] ( Whatwg.org/specs/web-apps/civerse-work/multipage/ trộm )
Matt Ball

Nói chung, tôi lo ngại rằng các đối tượng có thể KHÔNG CÓ thuộc tính id; ví dụ: nếu bạn có một danh sách đối tượng chỉ bằng cách sử dụng bộ chọn css như $ ('. someStyleClass'). Để được rõ ràng về danh tính của bất cứ đối tượng bạn đang làm việc với, nó có thể có ích hoặc ít nhất là thú vị để gán đối tượng của bạn bằng cách sử dụng siêu dữ liệu .data jquery () chức năng, api.jquery.com/data
JSH

134

Như những người khác đã lưu ý, đây là tuần tự hóa mặc định của một đối tượng. Nhưng tại sao nó [object Object]và không chỉ [object]?

Đó là bởi vì có nhiều loại đối tượng khác nhau trong Javascript!

  • Các đối tượng chức năng :
    stringify(function (){})->[object Function]
  • Các đối tượng mảng :
    stringify([])->[object Array]
  • Đối tượng RegExp
    stringify(/x/) ->[object RegExp]
  • Đối tượng ngày
    stringify(new Date) ->[object Date]
  • Giáo dục nhiều hơn ...
  • các đối tượng !
    stringify({})->[object Object]

Đó là bởi vì hàm tạo được gọi Object(với chữ "O") và thuật ngữ "đối tượng" (với "o" nhỏ) dùng để chỉ bản chất cấu trúc của điều này.

Thông thường, khi bạn nói về "đối tượng" trong Javascript, bạn thực sự có nghĩa là " Đối tượng đối tượng " chứ không phải các loại khác.

nơi stringifysẽ trông như thế này:

function stringify (x) {
    console.log(Object.prototype.toString.call(x));
}


Nếu toString () không bị ghi đè trong một đối tượng tùy chỉnh: theo tài liệu 15.2.4.2 Object.prototype.toString () # Ⓣ Khi phương thức toString được gọi, các bước sau sẽ được thực hiện: Nếu giá trị này không được xác định, hãy trả về " [đối tượng không xác định] ". Nếu giá trị này là null, trả về "[object Null]". Đặt O là kết quả của việc gọi ToObject truyền giá trị này làm đối số. Đặt lớp là giá trị của thuộc tính bên trong [[Class]] của O. Trả về giá trị Chuỗi là kết quả của việc nối ba chuỗi "[object", class và "]".
Cá cây Zhang

7
cộng với một thuật ngữ củathingy
Jay Wick

2
Lời giải thích hay! BTW, JSON.opesify không phải là cái được sử dụng ở đây.
lượng

Bạn có thể làm cho nó rõ ràng hơn ở đầu chức năng chuỗi của bạn, rằng nó không JSON.stringify, ai đó có thể có ấn tượng sai.
Suraj Jain

Tại sao không Object.prototype.toString.call(undefined)cho [object Undefined]?
Suraj Jain

21

[object Object] là đại diện toString mặc định của một đối tượng trong javascript.

Nếu bạn muốn biết các thuộc tính của đối tượng của mình, chỉ cần thảo luận về nó như thế này:

for(var property in obj) {
    alert(property + "=" + obj[property]);
}

Trong trường hợp cụ thể của bạn, bạn đang nhận được một đối tượng jQuery. Thay vào đó, hãy thử làm điều này:

$('#senddvd').click(function ()
{
   alert('hello');
   var a=whichIsVisible();
   alert(whichIsVisible().attr("id"));
});

Điều này sẽ cảnh báo id của phần tử nhìn thấy được.


> [Object Object] là đại diện toString mặc định của một đối tượng trong javascript. - điều này vẫn không giải thích nó đến từ đâu.
Dmitri Zaitsev

11

Đó là giá trị được trả về bởi toString()hàm của đối tượng đó .


Tôi hiểu những gì bạn đang cố gắng làm, bởi vì tôi đã trả lời câu hỏi của bạn ngày hôm qua về việc xác định div nào có thể nhìn thấy. :)
Các whichIsVisible()hàm trả về một đối tượng jQuery thực tế, bởi vì tôi nghĩ rằng sẽ có nhiều lập trình hữu ích. Nếu bạn muốn sử dụng chức năng này cho mục đích gỡ lỗi, bạn có thể làm điều gì đó như thế này:

function whichIsVisible_v2()
{
    if (!$1.is(':hidden')) return '#1';
    if (!$2.is(':hidden')) return '#2';
}

Điều đó nói rằng, bạn thực sự nên sử dụng một trình gỡ lỗi thích hợp hơn là alert()nếu bạn đang cố gắng gỡ lỗi một vấn đề. Nếu bạn đang sử dụng Firefox, Fireorms là tuyệt vời. Nếu bạn đang sử dụng IE8, Safari hoặc Chrome, họ có trình gỡ lỗi tích hợp.


Điều này dường như không trả lời câu hỏi.
Dmitri Zaitsev

9

Bạn có thể thấy giá trị bên trong [Object Object] như thế này

Alert.alert(  JSON.stringify(userDate)  );

Hãy thử như thế này

    realm.write(() => {
       const userFormData = realm.create('User',{
       user_email: value.username,
       user_password: value.password,
      });
     });

      const userDate = realm.objects('User').filtered('user_email == $0', value.username.toString(), );
      Alert.alert(  JSON.stringify(userDate)  );

tài liệu tham khảo

https://off.tokyo/blog/react-native-object-object/


Làm thế nào bạn sẽ truy cập ví dụ, userDate.timezone, hoặc nói user.name, v.v.? Trong chương trình của tôi, nếu tôi làm JSON.opesify (đối tượng), rõ ràng tôi có thể thấy mọi thứ. Khi tôi thử console.log (object), tôi nhận được [Object object] ... nhưng khi tôi thử console.log (object.name), tôi nhận được không xác định. (JSON.opesify (object.name) không hoạt động; tôi cũng không xác định được :()
daCoda

7

Khái niệm cơ bản

Bạn có thể không biết điều đó, nhưng trong JavaScript, bất cứ khi nào chúng ta tương tác với các nguyên hàm chuỗi, số hoặc boolean, chúng ta sẽ bước vào một thế giới ẩn của bóng và đối tượng ẩn.

chuỗi, số, boolean, null, không xác định và ký hiệu.

Trong JavaScript có 7 loại nguyên thủy: undefined, null, boolean, string, number, bigintsymbol. Mọi thứ khác là một đối tượng. Các kiểu nguyên thủy boolean, stringnumbercó thể được bao bọc bởi các đối tác của chúng. Những đối tượng là trường hợp của Boolean, StringNumbernhà xây dựng tương ứng.

typeof true; //"boolean"
typeof new Boolean(true); //"object"

typeof "this is a string"; //"string"
typeof new String("this is a string"); //"object"

typeof 123; //"number"
typeof new Number(123); //"object"

Nếu nguyên thủy không có thuộc tính, tại sao "this is a string".lengthtrả về một giá trị?

Bởi vì JavaScript sẽ dễ dàng ép buộc giữa các nguyên thủy và các đối tượng. Trong trường hợp này, giá trị chuỗi được ép buộc vào một đối tượng chuỗi để truy cập vào độ dài thuộc tính. Đối tượng chuỗi chỉ được sử dụng trong một phần giây sau đó nó được hiến tế cho Thần thu gom rác - nhưng theo tinh thần của chương trình khám phá trên TV, chúng tôi sẽ bẫy sinh vật khó nắm bắt và bảo tồn nó để phân tích thêm

Để chứng minh điều này, hãy xem xét thêm ví dụ sau trong đó chúng tôi đang thêm một thuộc tính mới vào nguyên mẫu hàm tạo chuỗi.

String.prototype.sampleProperty = 5;
var str = "this is a string";
str.sampleProperty;            // 5

Điều này có nghĩa là người nguyên thủy có quyền truy cập vào tất cả các thuộc tính (bao gồm các phương thức) được xác định bởi các hàm tạo đối tượng tương ứng của chúng.

Vì vậy, chúng tôi đã thấy rằng các kiểu nguyên thủy sẽ cưỡng chế một cách thích hợp đối tác Đối tượng tương ứng của chúng khi được yêu cầu.

Phân tích toString()phương pháp

Hãy xem xét các mã sau đây

var myObj    = {lhs: 3, rhs: 2};
var myFunc   = function(){}
var myString = "This is a sample String";
var myNumber = 4;
var myArray  = [2, 3, 5];

myObj.toString();     // "[object Object]"
myFunc.toString();    // "function(){}"
myString.toString();  // "This is a sample String"
myNumber.toString();  // "4"
myArray.toString();   // "2,3,5"

Như đã thảo luận ở trên, những gì thực sự xảy ra là khi chúng ta gọi toString()phương thức theo kiểu nguyên thủy, nó phải được ép buộc vào đối tác của nó trước khi nó có thể gọi phương thức.
tức myNumber.toString()là tương đương vớiNumber.prototype.toString.call(myNumber) và tương tự cho các loại nguyên thủy khác.

Nhưng điều gì sẽ xảy ra nếu thay vì kiểu nguyên thủy được truyền vào toString()phương thức của đối tác hàm xây dựng đối tượng tương ứng của nó, chúng ta buộc loại nguyên thủy được truyền dưới dạng tham số vào toString()phương thức của hàm xây dựng hàm Object ( Object.prototype.toString.call(x))?

Nhìn kỹ hơn vào Object.prototype.toString ()

Theo tài liệu , khi phương thức toString được gọi, các bước sau được thực hiện:

  1. Nếu thisgiá trị là undefined, trả về"[object Undefined]" .
  2. Nếu thisgiá trị là null, trả về"[object Null]" .
  3. Nếu giá trị này không có giá trị nào ở trên, hãy Olà kết quả của việc gọi toObjectvượt quathis giá trị làm đối số.
  4. Đặt lớp là giá trị của [[Class]]tài sản nội bộ của O.
  5. Trả lại giá trị String mà là kết quả của concatenating ba Strings "[object ", class"]".

Hiểu điều này từ ví dụ sau

var myObj       = {lhs: 3, rhs: 2};
var myFunc      = function(){}
var myString    = "This is a sample String";
var myNumber    = 4;
var myArray     = [2, 3, 5];
var myUndefined = undefined;
var myNull      = null;

Object.prototype.toString.call(myObj);        // "[object Object]"
Object.prototype.toString.call(myFunc);       // "[object Function]"
Object.prototype.toString.call(myString);     // "[object String]"
Object.prototype.toString.call(myNumber);     // "[object Number]"
Object.prototype.toString.call(myArray);      // "[object Array]"
Object.prototype.toString.call(myUndefined);  // "[object Undefined]"
Object.prototype.toString.call(myNull);       // "[object Null]"

Tài liệu tham khảo: https://es5.github.io/x15.2.html#x15.2.4.2 https://es5.github.io/x9.html#x9.9 https://javascriptweblog.wordpress.com/ 2010/09/27 / the-secret-life-of-javascript-primitive /


4

[object Object]là biểu diễn chuỗi mặc định của JavaScript Object. Đó là những gì bạn sẽ nhận được nếu bạn chạy mã này:

alert({}); // [object Object]

Bạn có thể thay đổi biểu diễn mặc định bằng cách ghi đè toStringphương thức như sau:

var o = {toString: function(){ return "foo" }};
alert(o); // foo

4
Mà gần như chắc chắn không phải là những gì anh ấy muốn làm.
Các cuộc đua nhẹ nhàng trong quỹ đạo

1
Đúng, chỉ minh họa nơi [object Object]chuỗi đến từ.
Brian Donovan

Bạn đang giải thích làm thế nào để thay đổi biểu diễn mặc định, không phải nơi xuất phát của bản gốc.
Dmitri Zaitsev

2

Bạn có một đối tượng javascript

$1$2là các đối tượng jquery, có thể sử dụng alert($1.text());để lấy văn bản hoặc alert($1.attr('id');vv ...

bạn phải đối xử $1$2thích các đối tượng jQuery.


0

Bạn đang cố gắng trả lại một đối tượng. Vì không có cách nào tốt để biểu diễn một đối tượng dưới dạng chuỗi, .toString()giá trị của đối tượng được tự động đặt thành "[object Object]".

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.