జావాస్క్రిప్ట్ సాధారణ ఎరర్స్
本章指出一些常见的 JavaScript 错误。
意外使用赋值运算符
如果程序员在 if
语句中意外使用赋值运算符(=
)而不是比较运算符(===
),JavaScript 程序可能会产生一些无法预料的结果。
这条 if
语句返回 false
(正如预期),因为 x 不等于 10:
var x = 0; if (x == 10)
这条 if
语句返回 true
(也许不像预期),因为 10 为 true:
var x = 0; if (x = 10)
这条 if
语句返回 false
(也许不像预期),因为 0 为 false:
var x = 0; if (x = 0)
赋值总是返回赋值的值。
期望松散的比较
在常规比较中,数据类型不重要。这条 if
语句返回 true
:
var x = 10; var y = "10"; if (x == y)
在严格比较中,数据类型确实重要。这条 if
语句返回 false
:
var x = 10; var y = "10"; if (x === y)
有一个常见的错误是忘记在 switch
语句中使用严格比较:
这条 switch
语句会显示提示框:
var x = 10; switch(x) { case 10: alert("Hello"); }
这条 switch
语句不会显示提示框:
var x = 10; switch(x) { case "10": alert("Hello"); }
ఆశ్చర్యకరమైన జోడించడం మరియు క్యాచ్ క్యాన్షనేషన్
జోడించడంజోడించడానికి ఉపయోగిస్తారునమూనా。
క్యాచ్ క్యాన్షనేషన్జోడించడానికి ఉపయోగిస్తారుస్ట్రింగ్。
జావాస్క్రిప్ట్లో, ఈ రెండు ఆపరేషన్లు కూడా ఒకే ఆపరేటర్ను ఉపయోగిస్తాయి +
ఆపరేటర్స్
ఈ కారణంగా, సంఖ్యలను సంఖ్యల వలె జోడించడం మరియు సంఖ్యలను స్ట్రింగ్ ల వలె జోడించడం వలన, వేర్వేరు ఫలితాలు ఉంటాయి:
var x = 10 + 5; // x లో ఫలితం 15 var x = 10 + "5"; // x లో ఫలితం "105"
రెండు వేర్వేరు వేరుశబ్దాలు జోడించినప్పుడు, ఫలితం అంచనా కనుగొనడం చాలా కష్టం
var x = 10; var y = 5; var z = x + y; // z లో ఫలితం 15 var x = 10; var y = "5"; var z = x + y; // z లో ఫలితం "105"
ఆశ్చర్యకరమైన ఫ్లోటింగ్ పాయింట్స్
జావాస్క్రిప్ట్లో సంఖ్యలు అన్నింటికీ 64 బిట్స్ గా నిర్వహించబడతాయి浮点数(Floats)。
అన్ని ప్రోగ్రామింగ్ భాషలు, జావాస్క్రిప్ట్ కూడా, ఫ్లోటింగ్ విలువలను నిర్వహించడానికి కష్టం ఉంటుంది:
var x = 0.1; var y = 0.2; var z = x + y // z లో ఫలితం 0.3 కాదు
ముందస్తు సమస్యను పరిష్కరించడానికి గణాంకాలను ఉపయోగించండి:
实例
var z = (x * 10 + y * 10) / 10; // z లో ఫలితం 0.3 ఉంటుంది
జావాస్క్రిప్ట్ స్ట్రింగ్ లో పరివర్తించండి
JavaScript ఒక పద్యాన్ని రెండు వరుసలుగా పరివర్తించడానికి అనుమతిస్తుంది:
ఉదాహరణ 1
var x = "Hello World!";
కానీ పద్యం మధ్యలో పరివర్తించడం తప్పు ఉంది:
ఉదాహరణ 2
var x = "Hello World!";
కానీ పద్యంలో పరివర్తించడానికి మింగిల్ చిహ్నాన్ని ఉపయోగించాలి:
ఉదాహరణ 3
var x = "Hello ", World!";
తప్పు సెకండ్
ఒక తప్పు సెకండ్ కారణంగా, ఈ కోడ్ బ్లాక్ x యొక్క విలువకు అన్ని విధాలుగా పని చేస్తుంది:
if (x == 19); { // కోడ్ బ్లాక్ }
return పద్యాన్ని పరివర్తించండి
ఒక వరుస చివరివద్ద స్వయంచాలకంగా పద్యాన్ని మూసివేయేది జావాస్క్రిప్ట్ యొక్క డిఫాల్ట్ ప్రవర్తన
ఈ కారణంగా, ఈ రెండు ఉదాహరణలు అదే ఫలితాన్ని తిరిగి చేస్తుంది:
ఉదాహరణ 1
function myFunction(a) { var power = 10 return a * power }
ఉదాహరణ 2
function myFunction(a) { var power = 10; return a * power; }
JavaScript ఒక పద్యాన్ని రెండు వరుసలుగా పరివర్తించడానికి అనుమతిస్తుంది:
ఈ కారణంగా, ఉదాహరణ 3 కూడా అదే ఫలితాన్ని తిరిగి చేస్తుంది:
ఉదాహరణ 3
function myFunction(a) { var power = 10; return a * power; }
కానీ ఈ విధంగా చేసినప్పుడు: return
పద్యాన్ని రెండు వరుసలుగా పరివర్తించి ఏం జరుగుతుంది:
ఉదాహరణ 4
function myFunction(a) { var power = 10; return a * power; }
ఈ ఫంక్షన్ ఈ విధంగా తిరిగి చేస్తుంది: undefined
!
ఎందుకు? అనగా JavaScript మీ అర్థాన్ని అంగీకరిస్తుంది:
ఉదాహరణ 5
function myFunction(a) { var power = 10; return; a * power; }
వివరణ
ఏదైనా పద్యం అనిపించదు ఉంటే:
var
JavaScript వాక్యాన్ని ముగింపు చేయడానికి తదుపరి వరుసను చదువుతుంది:
power = 10;
కానీ ఈ పద్యం పూర్తి ఉంది:
return
JavaScript ఆపాదించిన పద్యాన్ని స్వయంచాలకంగా మూసుతుంది:
return;
ఈ పరిస్థితి జరిగే కారణం ఇది జావాస్క్రిప్ట్ లో పద్యాన్ని మూసివేయడానికి సెకండ్ అనేది ఆప్టియనల్ ఉంటుంది
JavaScript వాక్యం చివరి వద్ద మూసుతుంది return
పద్యం అది ఒక పూర్తి పద్యం కావాలి
కాబట్టి మనిషిగా కాదు return
పద్యాన్ని పరివర్తించండి
పేరు సూచిక ద్వారా అర్రె ను ప్రాప్తించండి
అనేక ప్రోగ్రామింగ్ భాషలు నామక సంకేతాలు కలిగిన ప్రక్రియను మద్దతు ఇస్తాయి.
నామక సంకేతాలు కలిగిన ప్రక్రియను అనుసరించబడుతుంది లేదా హుమ్మతలు (లేదా హాష్ టేబుల్).
JavaScript మద్దతు లేదునామక సంకేతాలు కలిగిన ప్రక్రియా
జావాస్క్రిప్టులోప్రక్రియాఉపయోగించండిసంఖ్యా సంకేతాలు:
实例
var person = []; person[0] = "Bill"; person[1] = "Gates"; person[2] = 46; var x = person.length; // person.length 3 ఉంటుంది var y = person[0]; // person[0] "Bill" ఉంటుంది
జావాస్క్రిప్టులోపరికల్పనఉపయోగించండినామక సంకేతాలు。
మీరు నామక సంకేతాలను ఉపయోగించినట్లయితే, ప్రక్రియాను సంకేతాలకు మార్చడం జరుగుతుంది అని జావాస్క్రిప్టు చేస్తుంది.
స్వయంచాలక పునర్నిర్వచన తర్వాత, ప్రక్రియా పద్ధతులు లేదా అంశాలు అనిర్దిష్టం లేదా అసమానమైన ఫలితాలను ఇవ్వవచ్చు:
实例
var person = []; person["firstName"] = "Bill"; person["lastName"] = "Gates"; person["age"] = 46; var x = person.length; // person.length అనిర్దిష్టం ఉంటుంది var y = person[0]; // person[0] అనిర్దిష్టం ఉంటుంది
పద్ధతి నిర్వచనానికి కాండి కాండి కాండి ఉపయోగించండి
పరికల్పన మరియు ప్రక్రియా నిర్వచనాలలో తలిపు కాండి పద్ధతి ECMAScript 5 లో అనుమతించబడుతుంది.
పరికల్పన ప్రతిరూపం:
person = {firstName:"Bill", lastName:"Gates", age:62,};
ప్రక్రియా ప్రతిరూపం:
points = [35, 450, 2, 7, 30, 16,];
హెచ్చరిక: !!
ఇంటర్నెట్ ఎక్స్ప్లోరర్ 8 పరిణామం కావచ్చు.
JSON తలిపు కాండి కాదు.
JSON:
person = {firstName:"Bill", lastName:"Gates", age:62};
JSON:
points = [35, 450, 2, 7, 30, 16];
అనిర్దిష్టం నల్లటి కాదు
జావాస్క్రిప్టు పరికల్పన, వేరియబుల్, అంశాలు మరియు పద్ధతులు అనిర్దిష్టం ఉండవచ్చు.
ఇంటర్నెట్ ఎక్స్ప్లోరర్ 8 పరిణామం కావచ్చు. null
。
ఇది పరీక్షించబడే పరికల్పన పొందికను కష్టంగా చేయవచ్చు.
మీరు పరీక్షించవచ్చు రకం అని కాకపోతే: undefined
ఈ పరికల్పనను పరీక్షించండి అని పరీక్షించండి ఉన్నది లేదు:
实例
if (typeof myObj === "undefined")
但是您无法测试对象是否为 null
,因为如果对象未定义,将抛出错误:
不正确的:
if (myObj === null)
要解决此问题,必须测试对象是否为 null
,而不是未定义。
但这仍然会引发错误:
不正确的:
if (myObj !== null && typeof myObj !== "undefined")
因此,在测试非 null 之前,必须先测试未定义:
正确的:
if (typeof myObj !== "undefined" && myObj !== null)
期望块级范围
JavaScript 不会为每个代码块创建新的作用域。
很多编程语言都是如此,但是 JavaScript 并非如此。
认为这段代码会返回 undefined
,是新的 JavaScript 开发者的常见错误:
实例
for (var i = 0; i < 10; i++) { // 代码块 } return i;