[object Object] หมายถึงอะไร?


122

ฉันพยายามแจ้งเตือนค่าที่ส่งคืนจากฟังก์ชันและได้รับสิ่งนี้ในการแจ้งเตือน:

[object Object]  

นี่คือรหัส 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 เป็นฟังก์ชันที่ฉันพยายามตรวจสอบ


3
หมายความว่าประเภทข้อมูลของสิ่งที่คุณส่งคืนเป็น Object

ไม่อยู่ในความสนใจ: คุณคาดหวังอะไรให้มันกลับมา?
Dancrumb

1
คุณควรใช้คอนโซล JavaScript เพื่อพิจารณาวัตถุที่คุณสนใจ (เช่น Firebug)
Brian Donovan


คำตอบ 2 เป็นคำตอบที่ชัดเจนมากขึ้นลองดูและเลือกเป็นคำตอบที่ยอมรับได้หากคุณรู้สึกเหมือนกัน
Suraj Jain

คำตอบ:


53

"[object Object]"การแปลงค่าเริ่มต้นจากวัตถุที่จะเป็นสตริง

ในขณะที่คุณกำลังจัดการกับวัตถุ jQuery คุณอาจต้องการทำ

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

เพื่อพิมพ์ ID ขององค์ประกอบ

ตามที่ระบุไว้ในความคิดเห็นที่คุณควรใช้เครื่องมือที่รวมอยู่ในเบราว์เซอร์เช่น Firefox หรือ Chrome วัตถุ INTROSPECT โดยการทำแทนconsole.log(whichIsVisible())alert

Sidenote : ID ไม่ควรขึ้นต้นด้วยตัวเลข


3
[ใน HTML5 ID สามารถขึ้นต้นด้วยตัวเลข] ( whatwg.org/specs/web-apps/current-work/multipage/… )
Matt Ball

โดยทั่วไปแล้วฉันกังวลว่าวัตถุอาจไม่มีแอตทริบิวต์ id ตัวอย่างเช่นหากคุณมีรายการวัตถุโดยใช้ตัวเลือก css เช่น $ ('. someStyleClass') เพื่อให้ชัดเจนเกี่ยวกับตัวตนของวัตถุใด ๆ ที่คุณกำลังจัดการอยู่การกำหนดข้อมูลเมตาของวัตถุของคุณอาจเป็นประโยชน์หรืออย่างน้อยก็น่าสนใจโดยใช้ฟังก์ชัน jquery .data (), api.jquery.com/data
jsh

137

ดังที่คนอื่น ๆ ได้กล่าวไว้นี่คือการทำให้เป็นอนุกรมของวัตถุ แต่ทำไมมัน[object Object]ไม่ใช่แค่[object]?

นั่นเป็นเพราะมีวัตถุประเภทต่างๆใน Javascript!

  • วัตถุฟังก์ชัน :
    stringify(function (){})->[object Function]
  • อาร์เรย์วัตถุ :
    stringify([])->[object Array]
  • วัตถุ RegExp
    stringify(/x/) ->[object RegExp]
  • วัตถุวันที่
    stringify(new Date) ->[object Date]
  • อื่น ๆ อีกมากมาย
  • และวัตถุสิ่งของ !
    stringify({})->[object Object]

นั่นเป็นเพราะฟังก์ชันตัวสร้างถูกเรียกใช้Object(ด้วยตัวพิมพ์ใหญ่ "O") และคำว่า "อ็อบเจกต์" (มี "o" เล็ก ๆ ) หมายถึงลักษณะโครงสร้างของสิ่ง

โดยปกติแล้วเมื่อคุณพูดถึง "วัตถุ" ใน Javascript คุณหมายถึง " วัตถุ " จริงๆไม่ใช่ประเภทอื่น ๆ

ที่stringifyควรจะมีลักษณะเช่นนี้

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


ถ้า toString () ไม่ถูกแทนที่ในออบเจ็กต์ที่กำหนดเอง: ตามเอกสารประกอบ 15.2.4.2 Object.prototype.toString () # ⓉⒺⓇเมื่อเรียกเมธอด toString ขั้นตอนต่อไปนี้จะถูกดำเนินการ: หากไม่ได้กำหนดค่านี้ให้ส่งกลับ " [object Undefined] " ถ้าค่านี้เป็นค่าว่างให้ส่งคืน "[object Null]" ให้ O เป็นผลลัพธ์ของการเรียก ToObject ผ่านค่านี้เป็นอาร์กิวเมนต์ ให้คลาสเป็นค่าของคุณสมบัติภายใน [[คลาส]] ของ O ส่งกลับค่า String ที่เป็นผลมาจากการเชื่อมสตริงทั้งสาม "[อ็อบเจกต์" คลาสและ "]" เข้าด้วยกัน
Treefish Zhang

7
บวกหนึ่งสำหรับคำศัพท์ของthingy
Jay Wick

2
คำอธิบายที่ดี! BTW, JSON.stringify ไม่ใช่สิ่งที่ใช้ที่นี่
ธีม

คุณสามารถทำให้ชัดเจนมากขึ้นที่ด้านบนสุดของฟังก์ชัน stringify ของคุณได้หรือไม่ว่ามันไม่ใช่JSON.stringifyใครบางคนสามารถแสดงผลผิดพลาดได้
Suraj Jain

ทำไมถึงObject.prototype.toString.call(undefined)ให้[object Undefined]?
Suraj Jain

21

[object Object] เป็นค่าดีฟอลต์ toString แทนอ็อบเจ็กต์ใน javascript

หากคุณต้องการทราบคุณสมบัติของวัตถุของคุณเพียงแค่นำเสนอสิ่งนี้:

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

ในกรณีของคุณคุณจะได้รับวัตถุ jQuery ลองทำสิ่งนี้แทน:

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

สิ่งนี้ควรแจ้งเตือนรหัสขององค์ประกอบที่มองเห็นได้


> [object Object] เป็นค่าดีฟอลต์ toString แทนอ็อบเจกต์ใน javascript - ยังไม่สามารถอธิบายได้ว่ามาจากไหน
Dmitri Zaitsev

11

เป็นค่าที่ส่งคืนโดยtoString()ฟังก์ชันของวัตถุนั้น


ฉันเข้าใจว่าคุณกำลังพยายามทำอะไรอยู่เพราะฉันตอบคำถามของคุณเมื่อวานนี้เกี่ยวกับการกำหนด div ที่มองเห็นได้ :) ฟังก์ชันส่งกลับวัตถุ jQuery จริงเพราะผมคิดว่าจะมีโปรแกรมที่มีประโยชน์ หากคุณต้องการใช้ฟังก์ชันนี้เพื่อวัตถุประสงค์ในการดีบักคุณสามารถทำสิ่งนี้ได้:
whichIsVisible()

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

ที่กล่าวว่าคุณควรใช้ดีบักเกอร์ที่เหมาะสมมากกว่าที่alert()จะพยายามแก้ไขปัญหา หากคุณใช้ Firefox Firebugนั้นยอดเยี่ยมมาก หากคุณใช้ IE8, Safari หรือ Chrome พวกเขามีตัวแก้จุดบกพร่องในตัว


สิ่งนี้ดูเหมือนจะไม่ตอบคำถาม
Dmitri Zaitsev

9

คุณสามารถเห็นค่าภายใน [object Object] เช่นนี้

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

ลองแบบนี้ดูสิ

    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)  );

การอ้างอิง

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


คุณจะเข้าถึงได้อย่างไรเช่น userDate.timezone หรือพูดว่า user.name เป็นต้น ในโปรแกรมของฉันถ้าฉันทำ JSON.stringify (วัตถุ) เห็นได้ชัดว่าฉันสามารถเห็นทุกอย่าง เมื่อฉันลอง console.log (object) ฉันได้รับ [Object object] ... แต่เมื่อฉันลอง console.log (object.name) ฉันไม่ได้กำหนด (JSON.stringify (object.name) ไม่ทำงานฉันไม่ได้กำหนดเช่นกัน :()
daCoda

9

ข้อมูลพื้นฐานเกี่ยวกับ

คุณอาจไม่รู้ แต่ใน JavaScript เมื่อใดก็ตามที่เราโต้ตอบกับสตริงตัวเลขหรือบูลีนดั้งเดิมเราจะเข้าสู่โลกที่ซ่อนอยู่ของเงาวัตถุและการบีบบังคับ

สตริงตัวเลขบูลีนโมฆะไม่ได้กำหนดและสัญลักษณ์

ใน JavaScript มี 7 ชนิดดั้งเดิม: undefined, null, boolean, string, number, และbigint symbolทุกสิ่งทุกอย่างเป็นวัตถุ ประเภทดั้งเดิมboolean, stringและnumberสามารถห่อโดยคู่ของวัตถุของพวกเขา วัตถุเหล่านี้เป็นกรณีของBoolean, StringและNumberก่อสร้างตามลำดับ

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"

ถ้า primitives ไม่มีคุณสมบัติเหตุใดจึง"this is a string".lengthส่งคืนค่า

เนื่องจาก JavaScript จะบังคับระหว่างสิ่งดั้งเดิมและวัตถุได้อย่างง่ายดาย ในกรณีนี้ค่าสตริงจะถูกบังคับให้กับอ็อบเจ็กต์สตริงเพื่อเข้าถึงความยาวคุณสมบัติ สตริงออบเจ็กต์ใช้เพียงเสี้ยววินาทีหลังจากนั้นจะถูกสังเวยให้กับเทพเจ้าแห่งการเก็บขยะ - แต่ด้วยจิตวิญญาณของรายการค้นพบทางทีวีเราจะดักจับสิ่งมีชีวิตที่เข้าใจยากและเก็บรักษาไว้เพื่อการวิเคราะห์ต่อไป ...

เพื่อสาธิตสิ่งนี้เพิ่มเติมให้พิจารณาตัวอย่างต่อไปนี้ซึ่งเรากำลังเพิ่มคุณสมบัติใหม่ให้กับต้นแบบตัวสร้างสตริง

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

โดยวิธีนี้ดั้งเดิมสามารถเข้าถึงคุณสมบัติทั้งหมด (รวมถึงวิธีการ) ที่กำหนดโดยตัวสร้างอ็อบเจ็กต์ตามลำดับ

ดังนั้นเราจึงเห็นว่าประเภทดั้งเดิมจะบังคับให้เข้ากับ Object ตามลำดับได้อย่างเหมาะสมเมื่อจำเป็น

การวิเคราะห์toString()วิธีการ

พิจารณารหัสต่อไปนี้

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"

ดังที่ได้กล่าวไว้ข้างต้นสิ่งที่เกิดขึ้นจริง ๆ คือเมื่อเราเรียกtoString()method ในประเภทดั้งเดิมมันจะต้องถูกบีบบังคับให้อยู่ในวัตถุคู่กันก่อนจึงจะสามารถเรียกใช้เมธอดได้
นั่นmyNumber.toString()คือเทียบเท่าNumber.prototype.toString.call(myNumber)และในทำนองเดียวกันสำหรับประเภทดั้งเดิมอื่น ๆ

แต่จะเกิดอะไรขึ้นถ้าแทนที่จะส่งผ่านประเภทดั้งเดิมไปยังtoString()เมธอดของฟังก์ชันตัวสร้างวัตถุที่สอดคล้องกันเราบังคับให้ประเภทดั้งเดิมถูกส่งผ่านเป็นพารามิเตอร์ไปยังtoString()เมธอดของ Object function constructor ( Object.prototype.toString.call(x))?

ดู Object.prototype.toString () อย่างใกล้ชิด

ตามเอกสารประกอบเมื่อเรียกเมธอด toString จะดำเนินการตามขั้นตอนต่อไปนี้:

  1. หากthisค่าตอบแทนundefined"[object Undefined]"
  2. หากthisค่าตอบแทนnull"[object Null]"
  3. ถ้าค่านี้ไม่ใช่ค่าข้างต้นให้Oเป็นผลลัพธ์ของการเรียกtoObjectส่งthisค่าเป็นอาร์กิวเมนต์
  4. ให้คลาสเป็นค่าของ[[Class]]คุณสมบัติภายในของO.
  5. ส่งกลับค่าสตริงที่เป็นผลมาจากการเชื่อมโยงสามสาย"[object ", และclass"]"

ทำความเข้าใจสิ่งนี้จากตัวอย่างต่อไปนี้

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]"

อ้างอิง: https://es5.github.io/x15.2.html#x15.2.4.2 https://es5.github.io/x9.html#x9.9 https://javascriptweblog.wordpress.com/ 2010 / 27/09 / ที่ลับในชีวิตของจาวาสคริปต์-พื้นฐาน /


4

[object Object]คือการแสดงสตริงเริ่มต้นของ ObjectJavaScript นี่คือสิ่งที่คุณจะได้รับหากคุณเรียกใช้รหัสนี้:

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

คุณสามารถเปลี่ยนการแสดงค่าเริ่มต้นได้โดยการลบล้างtoStringวิธีการดังนี้:

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

4
ซึ่งแทบจะไม่ใช่สิ่งที่เขาอยากทำ
Lightness Races ใน Orbit

1
จริงแค่แสดงให้เห็นว่า[object Object]สตริงมาจากไหน
Brian Donovan

คุณกำลังอธิบายวิธีเปลี่ยนการแสดงค่าเริ่มต้นไม่ใช่ที่มาของต้นฉบับ
Dmitri Zaitsev

2

คุณมีวัตถุจาวาสคริปต์

$1และ$2เป็นวัตถุ jquery อาจใช้alert($1.text());เพื่อรับข้อความหรือalert($1.attr('id');อื่น ๆ ...

คุณต้องปฏิบัติ$1และ$2ชอบวัตถุ jQuery


0

คุณกำลังพยายามส่งคืนวัตถุ เพราะไม่มีวิธีที่ดีที่จะเป็นตัวแทนของวัตถุเป็นสตริงที่วัตถุถูกตั้งค่าโดยอัตโนมัติขณะที่.toString()"[object Object]"

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.