JavaScript లో Objects (మరియు JSON బేసిక్స్)
మునుపటి పాఠంలో మనం Arrays గురించి నేర్చుకున్నాం. Array లో చాలా విలువలను [10, 20, 30] లాగా నంబర్ల (ఇండెక్సుల) ఆధారంగా వరుసగా దాస్తాం. కానీ ఒక విద్యార్థి పూర్తి వివరాలను దాచాలంటే?
["రాహుల్", 20, "CSE", 85.5] అని array లో రాస్తే... ఇందులో 20 వయసా? లేక రోల్ నంబరా? 85.5 మార్కులా? లేక అటెండెన్సా? కేవలం ఇండెక్స్ నంబర్లను చూసి గుర్తుపెట్టుకోవడం చాలా కష్టం!
దీనికి పరిష్కారమే Object. నిజ జీవితంలో మీ స్మార్ట్ఫోన్ లేదా స్టూడెంట్ ఐడీ కార్డును ఊహించుకోండి. దానికి స్పష్టమైన లేబుల్స్ ఉంటాయి: పేరు (Name: రాహుల్), వయసు (Age: 20), బ్రాంచ్ (Branch: CSE). ఇలా పేరు-విలువ జంటలుగా (Key-Value Pairs) సమగ్ర డేటాను నిల్వ చేసే అత్యంత శక్తివంతమైన సాధనమే JavaScript Object. జావాస్క్రిప్ట్ ప్రపంచంలో దాదాపు సమస్తమూ Object ఆధారంగానే నడుస్తుంది!
నిజ జీవితంలోని వస్తువులకు రెండు విషయాలు ఉంటాయి:
- లక్షణాలు (Properties / Attributes): ఆ వస్తువు గురించిన వివరాలు. ఉదాహరణకు కారుకు బ్రాండ్ (Tata), రంగు (Red), ధర (12 లక్షలు).
- చేసే పనులు (Actions / Methods): ఆ వస్తువు చేసే క్రియలు. ఉదాహరణకు కారును స్టార్ట్ చేయడం (start()), డ్రైవ్ చేయడం (drive()), బ్రేక్ వేయడం (brake()).
| ఫీచర్ | Array [ ] |
Object { } |
|---|---|---|
| డేటా అమరిక | వరుస క్రమంలో లిస్ట్ (Ordered List) | పేరు-విలువ జంటలు (Key-Value Pairs) |
| విలువలను గుర్తించేది | సంఖ్యలు/ఇండెక్స్ ద్వారా (0, 1, 2...) |
ప్రాపర్టీ పేర్ల ద్వారా (name, age, price) |
| ఎప్పుడు వాడాలి? | ఒకే రకమైన చాలా అంశాలు ఉన్నప్పుడు (మార్కులు, పేర్ల జాబితా) | ఒకే అంశం లేదా వ్యక్తికి సంబంధించిన బహుళ వివరాలు దాచడానికి |
JavaScript లో object ని తయారు చేయడానికి అత్యంత సులభమైన, ఆధునిక పద్ధతి Object Literal: కర్లీ బ్రాకెట్లు { } లోపల key: value రూపంలో రాస్తాం.
const student = {
name: "రాహుల్",
age: 20,
branch: "CSE",
isEnrolled: true,
skills: ["HTML", "CSS", "JavaScript"]
};
console.log(student);
console.log(typeof student);
{
name: 'రాహుల్',
age: 20,
branch: 'CSE',
isEnrolled: true,
skills: [ 'HTML', 'CSS', 'JavaScript' ]
}
object
name,age,branchలను Keys (లేదా Properties) అంటారు. ఇవి ఎల్లప్పుడూ స్ట్రింగ్స్ గా ఉంటాయి.- వాటి ఎదురుగా ఉన్న
"రాహుల్",20,true, arrays లను Values అంటారు. - ఒక object లో numbers, strings, booleans, arrays, మరియు ఇతర objects ని కూడా విలువలుగా ఉంచవచ్చు.
const empty = {};అని రాస్తే ఖాళీ object తయారవుతుంది.
Object లోపలి విలువలను చదవడానికి రెండు మార్గాలు ఉన్నాయి:
- Dot Notation (డాట్ పద్ధతి):
object.key— ఇది రాయడానికి చిన్నగా, చదవడానికి సులభంగా ఉంటుంది. 90% సమయాల్లో ఇదే వాడతాం. - Bracket Notation (బ్రాకెట్ పద్ధతి):
object["key"]— చతురస్ర బ్రాకెట్లు మరియు కొటేషన్లు వాడతాం.
const person = {
name: "సురేష్",
age: 25,
"home town": "విజయవాడ"
};
// 1. Dot Notation
console.log(person.name);
// 2. Bracket Notation
console.log(person["age"]);
console.log(person["home town"]);
// 3. Variable ద్వారా Access చేయడం
const key = "name";
console.log(person[key]); // variable లోని "name" ని వెతుకుతుంది
console.log(person.key); // ❌ undefined! "key" అనే పేరుతో ప్రాపర్టీ లేదు
// 4. లేని ప్రాపర్టీని అడిగితే:
console.log(person.salary); // undefined (error రాదు)
సురేష్
25
విజయవాడ
సురేష్
undefined
undefined
- కీ పేరులో Space లేదా హైఫన్ (-) ఉన్నప్పుడు:
person["home town"]కుదరదుperson.home townరాస్తే SyntaxError వస్తుంది. - డైనమిక్ వేరియబుల్స్ ద్వారా యాక్సెస్ చేస్తున్నప్పుడు: లూప్స్ లో లేదా యూజర్ ఇచ్చే ఇన్పుట్ ఆధారంగా
person[userInput]అని డైనమిక్ గా చదవాలంటే బ్రాకెట్ నొటేషన్ తప్పనిసరి. డాట్ వాడితేperson.userInputఅని అక్షరాలా వెతుకుతుంది.
Object ని తయారుచేసిన తర్వాత కూడా కొత్త ఫీచర్లను చేర్చవచ్చు, ఉన్నవాటిని మార్చవచ్చు లేదా పూర్తిగా తీసివేయవచ్చు:
const car = {
brand: "Tata",
model: "Nexon",
price: 1200000
};
// 1. కొత్త ప్రాపర్టీని చేర్చడం (Add)
car.color = "Red";
// 2. ఉన్న ప్రాపర్టీ విలువను మార్చడం (Update)
car.price = 1250000;
// 3. ప్రాపర్టీని పూర్తిగా తొలగించడం (Delete)
delete car.model;
console.log(car);
{ brand: 'Tata', price: 1250000, color: 'Red' }
const Object ని మార్చవచ్చా? (Object Mutation vs Reassignment)
Arrays లాగానే, const తో డిక్లేర్ చేసిన Object లోని ప్రాపర్టీలను కూడా సులభంగా మార్చవచ్చు, చేర్చవచ్చు, డిలీట్ చేయవచ్చు. const అంటే ఆ వేరియబుల్ కి సరికొత్త Object అడ్రస్ని రీఅసైన్ చేయలేం అని మాత్రమే అర్థం:
const user = { name: "మనోజ్" };
user.name = "అజయ్"; // ✅ allowed (mutation)
console.log(user);
user = {}; // ❌ TypeError! Reassignment not allowed
{ name: 'అజయ్' }
TypeError: Assignment to constant variable.
ఒక Object లోని ప్రాపర్టీ విలువగా ఒక Function ని దాచితే, దాన్ని Method అంటారు. అంటే ఆ Object చేయగల ఒక పని అన్నమాట.
`this` అంటే ఏమిటి?
Method లోపల ఉన్నప్పుడు, this అనేది ప్రస్తుతం ఆ method ని పిలిచిన ఆబ్జెక్ట్ను సూచిస్తుంది. "నా పేరు (this.name)", "నా వయసు (this.age)" అని ఆబ్జెక్ట్ తన స్వంత వివరాలను తాను వాడుకోవడానికి this కీవర్డ్ తోడ్పడుతుంది.
const user = {
firstName: "అనిల్",
lastName: "కుమార్",
age: 24,
// Method రాసే ఆధునిక ES6 పద్ధతి:
getFullName() {
return `${this.firstName} ${this.lastName}`;
},
celebrateBirthday() {
this.age += 1;
return `హ్యాపీ బర్త్డే! ఇప్పుడు వయసు: ${this.age}`;
}
};
console.log(user.getFullName());
console.log(user.celebrateBirthday());
console.log(user.age);
అనిల్ కుమార్
హ్యాపీ బర్త్డే! ఇప్పుడు వయసు: 25
25
Chapter 13 లో నేర్చుకున్నట్లు, Arrow function (=>) కి స్వంత this ఉండదు (lexical scope ని బట్టి గ్లోబల్/విండో ని చూస్తుంది). కాబట్టి method గా arrow function రాస్తే this.firstName అనేది undefined అవుతుంది:
const bad = {
name: "రవి",
greet: () => `హలో, ${this.name}` // ❌ this.name is undefined!
};
అందుకే Object Methods రాసేటప్పుడు ఎల్లప్పుడూ సాధారణ ఫంక్షన్ లేదా ES6 షార్ట్హ్యాండ్ greet() { ... } మాత్రమే వాడాలి!
Array కి for...of వాడినట్లుగా, Object లోని అన్ని కీలు మరియు విలువలను చదవడానికి for...in మరియు ఆధునిక Object క్లాస్ మెథడ్స్ వాడతాం:
const marks = {
maths: 90,
physics: 85,
chemistry: 88
};
// 1. for...in లూప్ (ప్రతి కీ పై తిరుగుతుంది)
for (const subject in marks) {
console.log(`${subject}: ${marks[subject]}`);
}
// 2. Object.keys() — అన్ని ప్రాపర్టీ పేర్ల Array ఇస్తుంది
console.log(Object.keys(marks));
// 3. Object.values() — అన్ని విలువల Array ఇస్తుంది
console.log(Object.values(marks));
// 4. Object.entries() — [key, value] జంటల 2D Array ఇస్తుంది
console.log(Object.entries(marks));
// 5. 'in' Operator — ప్రాపర్టీ ఉందో లేదో తనిఖీ చేస్తుంది
console.log("maths" in marks, "english" in marks);
maths: 90
physics: 85
chemistry: 88
[ 'maths', 'physics', 'chemistry' ]
[ 90, 85, 88 ]
[ [ 'maths', 90 ], [ 'physics', 85 ], [ 'chemistry', 88 ] ]
true false
ఒక Object లోపల మరొక Object ని ఉంచవచ్చు. దీన్ని Nested Object అంటారు (ఉదాహరణకు ఒక యూజర్ ఆబ్జెక్ట్ లో address మరొక ఆబ్జెక్ట్ కావచ్చు).
const user = {
name: "ప్రియ",
address: {
city: "హైదరాబాద్",
pincode: 500081
}
};
// లోపలి ఆబ్జెక్ట్ విలువను యాక్సెస్ చేయడం:
console.log(user.address.city);
// లేని ప్రాపర్టీని సురక్షితంగా యాక్సెస్ చేయడం (Optional Chaining ?.)
console.log(user.contact?.phone);
హైదరాబాద్
undefined
ఒకవేళ మనం user.contact.phone అని ?. లేకుండా రాస్తే, user.contact అనేది undefined కాబట్టి జావాస్క్రిప్ట్ వెంటనే TypeError: Cannot read properties of undefined అని ప్రోగ్రామ్ ని క్రాష్ చేస్తుంది! కానీ user.contact?.phone అని రాస్తే (Optional Chaining), ఒకవేళ contact లేకపోతే అక్కడితో ఆగిపోయి సురక్షితంగా undefined ని ఇస్తుంది.
వెబ్ అప్లికేషన్లలో బ్రౌజర్ నుండి సర్వర్కి (లేదా సర్వర్ నుండి బ్రౌజర్కి) డేటాను పంపేటప్పుడు ఆబ్జెక్టులను డైరెక్ట్గా పంపలేం. వాటిని టెక్స్ట్ (String) రూపంలోకి మార్చాలి. ప్రపంచవ్యాప్తంగా సాఫ్ట్వేర్ రంగంలో డేటా మార్పిడి కోసం వాడే అత్యంత ప్రసిద్ధ టెక్స్ట్ ఫార్మాట్ JSON.
| ఫీచర్ | JavaScript Object | JSON (టెక్స్ట్ ఫార్మాట్) |
|---|---|---|
| రూపం | మెమరీలో ఉండే రియల్ డేటా స్ట్రక్చర్ | సాధారణ టెక్స్ట్ స్ట్రింగ్ (String) |
| కీలు (Keys) | కొటేషన్లు ఉండొచ్చు, లేకపోవచ్చు (name: "రవి") |
కీలకు తప్పనిసరిగా డబుల్ కొటేషన్లు ఉండాలి ("name": "రవి") |
| ఫంక్షన్స్ / Methods | ఉండవచ్చు | ఫంక్షన్స్ కి అనుమతి లేదు (కేవలం డేటా మాత్రమే) |
రెండు ముఖ్యమైన JSON మెథడ్స్:
JSON.stringify(object): JS Object ని JSON టెక్స్ట్ స్ట్రింగ్ గా మారుస్తుంది (సర్వర్కి పంపేటప్పుడు వాడతాం).JSON.parse(string): JSON టెక్స్ట్ స్ట్రింగ్ ని తిరిగి ఉపయోగపడే నిజమైన JS Object గా మారుస్తుంది (సర్వర్ నుండి డేటా వచ్చినప్పుడు వాడతాం).
const employee = {
id: 101,
name: "కిరణ్",
active: true
};
// 1. Object -> JSON String
const jsonString = JSON.stringify(employee);
console.log(jsonString);
console.log(typeof jsonString);
// 2. JSON String -> JS Object
const parsedObj = JSON.parse(jsonString);
console.log(parsedObj.name);
console.log(typeof parsedObj);
{"id":101,"name":"కిరణ్","active":true}
string
కిరణ్
object
-
వేరియబుల్స్ తో Dot Notation వాడటం:
const key = "name"; const user = { name: "రవి" }; console.log(user.key); // ❌ undefined! (user["key"] ని వెతుకుతుంది) console.log(user[key]); // ✅ "రవి" (వేరియబుల్స్ కి బ్రాకెట్ వాడాలి) -
Space ఉన్న ప్రాపర్టీలకు Dot Notation వాడటం:
user.first nameరాస్తేSyntaxError: Unexpected identifierవస్తుంది. స్పేస్ ఉన్నప్పుడుuser["first name"]మాత్రమే వాడాలి. -
లేని ప్రాపర్టీ లోపల సబ్-ప్రాపర్టీ ని చదవడం:
const user = {}; console.log(user.profile.pic); // ❌ TypeError: Cannot read properties of undefined (reading 'pic') console.log(user.profile?.pic); // ✅ undefined (Optional Chaining వాడండి) -
ఆబ్జెక్టులను
===తో పోల్చడం:
Arrays లాగానే Objects కూడా రిఫరెన్స్ టైప్స్. మెమరీలో వేర్వేరు అడ్రస్ లలో ఉంటాయి కాబట్టిconsole.log({ a: 1 } === { a: 1 }); // Output: falsefalseవస్తుంది. -
Object ని కాపీ చేశాననుకోవడం (కానీ ఒకే రిఫరెన్స్ ఉండటం):
నిజమైన కాపీ కావాలంటే స్ప్రెడ్ ఆపరేటర్const a = { score: 50 }; const b = a; // ❌ అసలు కాపీ కాదు! b.score = 100; console.log(a.score); // Output: 100 (a కూడా మారిపోయింది!)const b = { ...a };వాడాలి! -
Methods లో Arrow Function వాడి
thisపోగొట్టుకోవడం: Arrow functions కి స్వంతthisఉండదు. Methods కి ఎల్లప్పుడూsayHi() { return this.name; }లాంటి సాధారణ ఫంక్షన్లు వాడాలి.
ఈ క్రింది 8 ప్రాక్టీస్ ప్రశ్నలకు ముందుగా మీ సొంతంగా కోడ్ రాయడానికి ప్రయత్నించండి. ఆ తర్వాత సమాధానాలను పరిశీలించండి:
- ఒక పుస్తకం యొక్క శీర్షిక (title), రచయిత (author), ధర (price) వివరాలతో
bookobject ని తయారు చేయండి. - పై
bookobject లోకి కొత్తగాpages: 350ని చేర్చి,priceని 10% తగ్గించండి. student = { name: "రమ్య", marks: [80, 90, 70] }లోపల మార్కుల సగటును రిటర్న్ చేసేgetAverage()method ని రాయండి.- ఒక object లోని అన్ని ప్రాపర్టీల విలువలను
for...inలూప్ ద్వారా ప్రింట్ చేయండి. { a: 10, b: 20, c: 30 }object లోని అన్ని సంఖ్యల మొత్తం ఎంత? (Object.values()మరియుreduceవాడండి).userobject లోemailఉందో లేదోinఆపరేటర్ తో తనిఖీ చేయండి.- ఒక JS ఆబ్జెక్ట్ ని JSON string గా మార్చి, తిరిగి దాన్ని Object గా మార్చే కోడ్ రాయండి.
const original = { x: 5, y: 10 };ని మార్చకుండా ఉండేలా ఒక స్వతంత్ర కాపీని (shallow copy) తయారు చేయండి.
👉 8 ప్రశ్నల సమాధానాలు చూడండి (Answers with Code & Output)
1 & 2. Book Object creation, add & update:
const book = {
title: "JavaScript మార్గదర్శి",
author: "ఆనంద్",
price: 500
};
book.pages = 350;
book.price = book.price - (book.price * 10 / 100);
console.log(book);
// Output: { title: 'JavaScript మార్గదర్శి', author: 'ఆనంద్', price: 450, pages: 350 }
3. Student Average Method (this తో):
const student = {
name: "రమ్య",
marks: [80, 90, 70],
getAverage() {
const sum = this.marks.reduce((t, m) => t + m, 0);
return sum / this.marks.length;
}
};
console.log(student.getAverage());
// Output: 80
4. for...in లూప్:
const product = { name: "Laptop", brand: "Dell", ram: "16GB" };
for (const key in product) {
console.log(`${key} -> ${product[key]}`);
}
5. Object.values() తో మొత్తం లెక్కింపు:
const nums = { a: 10, b: 20, c: 30 };
const total = Object.values(nums).reduce((sum, n) => sum + n, 0);
console.log(total);
// Output: 60
6. in ఆపరేటర్ చెక్:
const user = { name: "లక్ష్మి", age: 22 };
console.log("email" in user);
// Output: false
7. JSON Stringify & Parse:
const profile = { user: "sita", status: "online" };
const str = JSON.stringify(profile);
console.log(str);
const obj = JSON.parse(str);
console.log(obj.user);
// Output: {"user":"sita","status":"online"} \n sita
8. Spread Operator తో సురక్షితమైన కాపీ:
const original = { x: 5, y: 10 };
const copy = { ...original };
copy.x = 999;
console.log(original.x, copy.x);
// Output: 5 999 (original సురక్షితంగా 5 గానే ఉంది!)
ఈ కోడ్ ను మన ఆన్లైన్ కంపైలర్ లో రన్ చేసి చూడండి. ఇది ఒక డిజిటల్ బ్యాంక్ అకౌంట్. డిపాజిట్, విత్డ్రా చేసి this కీవర్డ్ ద్వారా బ్యాలెన్స్ ఎలా అప్డేట్ అవుతుందో పరిశీలించండి:
const bankAccount = {
accountHolder: "సాయి తేజ",
balance: 5000,
deposit(amount) {
this.balance += amount;
return `₹${amount} జమ చేయబడింది. ప్రస్తుత బ్యాలెన్స్: ₹${this.balance}`;
},
withdraw(amount) {
if (amount > this.balance) {
return "విత్డ్రా విఫలమైంది: ఖాతాలో సరిపడా నిధులు లేవు!";
}
this.balance -= amount;
return `₹${amount} డ్రా చేయబడింది. మిగిలిన బ్యాలెన్స్: ₹${this.balance}`;
}
};
console.log(bankAccount.deposit(2000));
console.log(bankAccount.withdraw(3500));
console.log(bankAccount.withdraw(10000));
₹2000 జమ చేయబడింది. ప్రస్తుత బ్యాలెన్స్: ₹7000
₹3500 డ్రా చేయబడింది. మిగిలిన బ్యాలెన్స్: ₹3500
విత్డ్రా విఫలమైంది: ఖాతాలో సరిపడా నిధులు లేవు!
📌 సారాంశం (Quick Summary):
- Object అంటే: వివరాలను లేబుల్స్ తో దాచే Key-Value డేటా స్ట్రక్చర్:
const user = { name: "రవి", age: 25 }; - Access చేయడం:
user.name(Dot Notation) లేదాuser["name"](Bracket Notation). డైనమిక్ వేరియబుల్స్ కి బ్రాకెట్ నొటేషన్ వాడాలి. - Update, Add, Delete:
user.city = "HYD"(Add),user.age = 26(Update),delete user.city(Delete). constObject: లోపలి ప్రాపర్టీలను మార్చవచ్చు (Mutate), కానీ కొత్త ఆబ్జెక్ట్ ని reassignment చేయలేం.- Methods &
this: ఆబ్జెక్ట్ లోపల రాసే ఫంక్షన్లని Methods అంటారు.thisప్రస్తుతం ఆ method ని పిలిచిన ఆబ్జెక్ట్ను సూచిస్తుంది. Methods లో Arrow Functions వాడకూడదు. - లూపింగ్:
for...inకీలను ఇస్తుంది.Object.keys(),Object.values(),Object.entries()లతో arrays గా మార్చి లూప్ చేయవచ్చు. - Optional Chaining (
?.):user.address?.city— ప్రాపర్టీ లేకపోయినా ఎర్రర్ రాకుండా సురక్షితంగాundefinedని ఇస్తుంది. - JSON:
JSON.stringify(obj)తో ఆబ్జెక్ట్ ని టెక్స్ట్ గా,JSON.parse(str)తో టెక్స్ట్ ని ఆబ్జెక్ట్ గా మార్చవచ్చు. - Shallow Copy: నిజమైన కాపీ కోసం
const copy = { ...original };స్ప్రెడ్ ఆపరేటర్ వాడాలి.
👉 తర్వాతి పాఠం: Strings (Common Methods) →
ఇప్పటివరకు మనం Functions, Arrays మరియు Objects వంటి కాంప్లెక్స్ డేటా రకాలపై పూర్తి అవగాహన సాధించాం. తర్వాతి పాఠంలో వెబ్ డెవలప్మెంట్ లో అడుగడుగునా ఉపయోగపడే అక్షరమాలలు — Strings మరియు వాటి అత్యంత ముఖ్యమైన Methods (slice, replace, split, trim, toUpperCase) గురించి వివరంగా నేర్చుకుందాం!