JavaScript ตรวจสอบว่ามีตัวแปรอยู่ (ถูกกำหนด / เตรียมใช้งาน)


1763

วิธีใดในการตรวจสอบว่าตัวแปรถูกเริ่มต้นดีกว่า / ถูกต้อง (สมมติว่าตัวแปรสามารถเก็บอะไรได้ (สตริง, int, วัตถุ, ฟังก์ชั่น ฯลฯ ))

if (elem) { // or !elem

หรือ

if (typeof(elem) !== 'undefined') {

หรือ

if (elem != null) {

5
หากคุณต้องการทราบว่าfooมีการประกาศtypeof foo === 'undefined'หรือไม่typeof foo === typeof undefined

1
คำตอบ upvoted สูงไม่ทำงานสำหรับตัวแปรที่มีการประกาศ undefinedแต่มีค่า คำตอบที่ถูกต้องคือคำตอบนี้: stackoverflow.com/a/36432729/772035
Paul

@Paulpro รุ่นที่ใช้hasOwnProperty('bar')ไม่มีข้อบกพร่องเหมือนกับคนอื่น ๆ แต่จะต้องมีการปรับเปลี่ยนบางอย่างสำหรับโหนด (แทนที่windowด้วยglobal)
oligofren

@ พอลโปรแน่นอน แต่เมื่อฉันไตร่ตรองก่อนที่คุณจะตอบกลับฉันก็มาถึงข้อสรุปว่ามันไม่ใช่ปัญหาเชิงปฏิบัติจริงๆ เมื่อคุณจัดการกับตัวแปรบล็อกหรือฟังก์ชันที่กำหนดขอบเขตโดยปกติจะเป็นรหัสที่คุณเป็นเจ้าของหรือมีสิทธิ์ในการเขียนดังนั้นคุณจะมีข้อผิดพลาดรันไทม์ในกรณีใด ๆ ที่สามารถแก้ไขได้ ในขณะที่ปัญหาปกติของตัวแปรที่ไม่ได้ถูกกำหนดไว้ (ไม่มีอยู่) มักจะอยู่ในโค้ดที่อยู่นอกการควบคุมของคุณดังนั้นคุณต้องมีวิธีการตรวจสอบ ดังนั้นมันจึงเป็นทางออก 80/20
oligofren

คำตอบ:


3053

คุณต้องการผู้ประกอบการ โดยเฉพาะ:typeof

if (typeof variable !== 'undefined') {
    // the variable is defined
}

35
นี่เป็นวิธีแก้ปัญหาที่ดี แต่คุณช่วยอธิบายได้ไหมว่าทำไมสิ่งนี้ถึงได้ผล
Morgan Cheng

46
ที่จริงแล้วคุณควรตรวจสอบว่าวัตถุนั้นเป็นสิ่งที่คุณต้องการ เพื่อที่จะเป็น if (typeof คอนโซล == 'วัตถุ') {// ตัวแปรคือสิ่งที่ผมต้องการให้เป็น}
staticsan

59
@George iv: "เพียงแค่ทำ` ถ้า (ตัวแปร)" - อืมไม่มีที่ล้มเหลวสำหรับเท็จและ 0.
เจสัน S

17
'if (variable)' ล้มเหลวในการทดสอบการมีอยู่ของคุณสมบัติวัตถุ
scotts

54
@ geowa4 ที่จริงแล้วนั่นจะทำให้เกิดข้อผิดพลาดหากตัวแปรไม่ได้กำหนด
kevinji

856

typeofผู้ประกอบการจะตรวจสอบว่าตัวแปรจะไม่ได้กำหนดจริงๆ

if (typeof variable === 'undefined') {
    // variable is undefined
}

typeofผู้ประกอบการซึ่งแตกต่างจากผู้ประกอบการอื่น ๆ ที่ไม่ได้โยนReferenceErrorยกเว้นเมื่อใช้กับตัวแปรที่ไม่ได้ประกาศ

แต่ไม่ทราบว่าจะกลับมาtypeof null เราจะต้องระมัดระวังเพื่อหลีกเลี่ยงความผิดพลาดของการเริ่มต้นตัวแปรไป"object" nullเพื่อความปลอดภัยนี่คือสิ่งที่เราสามารถใช้แทน:

if (typeof variable === 'undefined' || variable === null) {
    // variable is undefined or null
}

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการใช้การเปรียบเทียบที่เข้มงวด===แทนที่จะใช้ความเท่าเทียมอย่างง่าย==โปรดดู:
ควรใช้ตัวดำเนินการใด (== vs ===) ในการเปรียบเทียบ JavaScript


2
if (! variable_here) {// รหัสของคุณที่นี่ }; ไม่สามารถบอกได้ว่าตัวแปรดังกล่าวเป็นเท็จหรือไม่ได้กำหนด
boh

5
if(! variable_here)จะแตกในหลายกรณี ถ้าตัวแปรเป็น 0 หรือเท็จมันจะล้มเหลว นั่นไม่ใช่สิ่งที่คุณต้องการ
คอรีแดเนียล

2
ไม่สามารถตัดสินใจได้ว่าจะลงคะแนนนี้หรือไม่ การพูดอย่างเคร่งครัดtypeof foo === "undefined"นั้นถูกต้องและดีกว่าคำตอบที่ได้รับการโหวตสูงสุด แต่หมายเหตุเพิ่มเติมเพียงแค่ทำให้คำตอบนี้ทำให้เกิดความสับสน
Alnitak

1
@StevenPenny ตรวจสอบระยะเวลา คำตอบที่ถูกรวมเข้าด้วยกันจากคำถามอื่นหลังจากคำตอบนี้ถูกโพสต์
Rob

1
คำตอบนี้ใช้งานไม่ได้ นี่เป็นคำตอบเดียวที่นี่: stackoverflow.com/a/36432729/772035
Paul

222

ในหลายกรณีการใช้:

if (elem) { // or !elem

จะทำงานให้คุณ! ... สิ่งนี้จะตรวจสอบกรณีเหล่านี้ด้านล่าง:

  1. ไม่ได้กำหนด : หากค่าไม่ได้ถูกกำหนดและเป็นundefined
  2. null : ถ้าเป็นโมฆะตัวอย่างเช่นถ้าไม่มีองค์ประกอบ DOM ...
  3. สตริงว่าง :''
  4. 0 : หมายเลขศูนย์
  5. NaN : ไม่ใช่ตัวเลข
  6. เท็จ

ดังนั้นมันจะครอบคลุมทุกกรณี แต่มีกรณีแปลก ๆ อยู่เสมอที่เราต้องการครอบคลุมเช่นสตริงที่มีช่องว่างเช่น' 'นี้จะถูกกำหนดใน javascript เนื่องจากมีช่องว่างภายในสตริง ... ตัวอย่างเช่นในกรณีนี้คุณเพิ่มการตรวจสอบอีกหนึ่งรายการโดยใช้ trim () เช่น:

if(elem) {

if(typeof elem === 'string' && elem.trim()) {
///

นอกจากนี้การตรวจสอบเหล่านี้ใช้สำหรับค่าเท่านั้นเนื่องจากวัตถุและอาร์เรย์ทำงานแตกต่างกันใน Javascript อาร์เรย์[]ว่างและวัตถุว่างเปล่า{}เป็นจริงเสมอจริง

ฉันสร้างภาพด้านล่างเพื่อแสดงคำตอบสั้น ๆ :

ไม่ได้กำหนดเป็นโมฆะ ฯลฯ


2
@Alireza ดี! คำตอบของคุณจะช่วยให้ผู้คนจำนวนมากออกไปที่นั่น ฉันจำค่าที่ผิดพลาดได้แล้วสิ่งเดียวที่ฉันไม่แน่ใจก็คือ []
Thiago Yoithi

13
ฉันได้รับ "ReferenceError: elem ไม่ได้กำหนด"
ropo

3
@ropo มันเป็นเพราะคุณยังไม่ได้กำหนด elem เพื่อตรวจสอบว่ามันคืออะไรถ้าเป็นกรณีของคุณคุณต้องตรวจสอบกับ typeof (elem) === "string" ซึ่งถูกกล่าวถึงแล้ว ...
Alireza

19
แล้วคำตอบนั้นจะทำให้เข้าใจผิดเมื่อมันบอกว่าif(elem)ตรวจสอบไม่ได้กำหนด (ในขณะที่มันกลับไม่ได้กำหนดข้อผิดพลาด) ใช่ไหม?
Fanky

1
ส่งกรณีใช้งานให้ฉันเพื่อตรวจสอบว่าตัวแปรไม่ได้กำหนดหรือไม่และถ้ากำหนดด้วยค่าที่ไม่ได้กำหนด พวกคุณบางคนกำลังจับฟางและพยายามที่จะดูยอดเยี่ยม แต่ถ้าคุณตั้งค่าเป็นไม่ได้กำหนดและตรวจสอบค่านั้นอย่างชัดเจนมันจะกลับเท็จหรือคุณต้องเปลี่ยนรหัสของคุณ smh .... คำตอบนี้ถูกต้อง !! !!!
almcaffee

210

ใน JavaScript สามารถกำหนดตัวแปรได้ แต่เก็บค่าundefinedไว้ดังนั้นคำตอบที่พบบ่อยที่สุดนั้นไม่ถูกต้องทางเทคนิคและดำเนินการดังนี้:

if (typeof v === "undefined") {
   // no variable "v" is defined in the current scope
   // *or* some variable v exists and has been assigned the value undefined
} else {
   // some variable (global or local) "v" is defined in the current scope
   // *and* it contains a value other than undefined
}

นั่นอาจเพียงพอสำหรับวัตถุประสงค์ของคุณ การทดสอบต่อไปนี้มีความหมายที่ง่ายกว่าซึ่งช่วยให้อธิบายพฤติกรรมของรหัสของคุณได้ง่ายขึ้นและเข้าใจด้วยตัวคุณเอง (หากคุณสนใจสิ่งต่าง ๆ ):

if ("v" in window) {
   // global variable v is defined
} else {
   // global variable v is not defined
}

แน่นอนว่าสิ่งนี้ถือว่าคุณกำลังทำงานในเบราว์เซอร์ (ซึ่งwindowเป็นชื่อสำหรับออบเจกต์ร่วม) แต่ถ้าคุณล้อเล่นรอบตัวแบบนี้คุณอาจอยู่ในเบราว์เซอร์ อัตนัยการใช้'name' in windowมีความสอดคล้องกับการใช้window.nameเพื่ออ้างถึง globals โวหาร การเข้าถึง globals เป็นคุณสมบัติของwindowแทนที่จะเป็นตัวแปรช่วยให้คุณลดจำนวนของตัวแปรที่ไม่ได้ประกาศซึ่งคุณอ้างอิงในโค้ดของคุณ (เพื่อประโยชน์ในการขุย) และหลีกเลี่ยงความเป็นไปได้ที่โลกของคุณจะถูกเงาโดยตัวแปรท้องถิ่น นอกจากนี้หากกลมกลืนทำให้ผิวของคุณคลานคุณอาจรู้สึกสะดวกสบายกว่าเมื่อสัมผัสกับแท่งที่ค่อนข้างยาว


7
สิ่งนี้จะตรวจสอบว่าตัวแปรถูกประกาศไปทั่วโลกหรือไม่ หากคุณกำลังเขียนโค้ดอย่างถูกต้องแสดงว่าคุณ จำกัด สิทธิ์ใช้งาน vars สากล มันจะรายงานเท็จสำหรับ vars ท้องถิ่น: (function () {var sdfsfs = 10; console.log ("sdfsfs" ในหน้าต่าง);}) () `
Eddie Monge Jr

2
นี่คือคำตอบที่ดีที่สุด f $ # ^% ผมอยู่ที่ปลายปัญญาของเกี่ยวกับเรื่องนี้พยายามที่จะคิดออกว่าจะบัญชีสำหรับว่ากรณีที่มุมนี้ สุกใส คุณไม่สามารถทำสิ่งนี้ได้
temporary_user_name

1
Heads-up: คำตอบของคุณถูกย้ายมาที่นี่จากstackoverflow.com/questions/519145/…
Shog9

สำหรับผู้ใช้เชิงมุม: น่าเสียดายที่ไม่อนุญาตให้ใช้ในคำสั่ง ng-if
qwertzguy

... พิมพ์เขียวที่สมบูรณ์แบบสำหรับการตรวจสอบตามขอบเขต มีตัวบ่งชี้ประสิทธิภาพใด ๆ หาก "ในหน้าต่าง" หรือ "(ตัวแปร typeof === 'undefined' || variable === null)" อันที่จริงฉันสนใจในการทดสอบข้อเท็จจริงอย่างหนักและไม่ได้มีเหตุผลที่เป็นไปได้ (ซึ่งฉันสามารถทำได้ด้วยตัวเอง: ประโยคที่สองมีการใช้งานมากกว่า -> ประสิทธิภาพแย่ลง)
เร็วกว่า

119

ในกรณีส่วนใหญ่คุณจะใช้:

elem != null

ซึ่งแตกต่างจากที่เรียบง่ายif (elem)จะช่วยให้0, false, NaNและ''แต่ปฏิเสธnullหรือundefinedทำให้มันเป็นที่ดีการทดสอบทั่วไปสำหรับการปรากฏตัวของการโต้แย้งหรือคุณสมบัติของวัตถุ


การตรวจสอบอื่น ๆ ไม่ถูกต้องเช่นกันพวกเขามีการใช้ที่แตกต่างกัน:

  • if (elem): สามารถนำมาใช้ในกรณีที่elemมีการประกันเพื่อเป็นวัตถุหรือถ้าfalse, 0ฯลฯ ได้รับการพิจารณาค่า "เริ่มต้น" (จึงเทียบเท่ากับundefinedหรือnull)

  • typeof elem == 'undefined'สามารถใช้ในกรณีที่มีการระบุnullมีความหมายที่แตกต่างกับตัวแปรหรือคุณสมบัติเริ่มต้น

    • นี่เป็นการตรวจสอบเพียงอย่างเดียวที่จะไม่เกิดข้อผิดพลาดหากelemไม่ได้รับการประกาศ (เช่นไม่มีvarคำสั่งไม่ใช่คุณสมบัติของwindowหรือไม่ใช่อาร์กิวเมนต์ของฟังก์ชัน) ในความคิดของฉันมันค่อนข้างอันตรายเพราะมันช่วยให้พิมพ์ผิดพลาดโดยไม่มีใครสังเกต เพื่อหลีกเลี่ยงปัญหานี้ให้ดูวิธีการด้านล่าง

ยังมีประโยชน์คือการเปรียบเทียบที่เข้มงวดกับundefined:

if (elem === undefined) ...

อย่างไรก็ตามเนื่องจากโกลบอลundefinedสามารถถูกแทนที่ด้วยค่าอื่นได้ดีที่สุดคือการประกาศตัวแปรundefinedในขอบเขตปัจจุบันก่อนที่จะใช้:

var undefined; // really undefined
if (elem === undefined) ...

หรือ:

(function (undefined) {
    if (elem === undefined) ...
})();

ข้อได้เปรียบที่สองของวิธีนี้คือundefinedตัวย่อJS สามารถลดตัวแปรให้เป็นอักขระเดียวช่วยให้คุณประหยัดได้ไม่กี่ไบต์ทุกครั้ง


17
undefinedฉันตกใจให้คุณสามารถแทนที่ ฉันไม่คิดว่ามันคุ้มค่าที่จะพูดถึงในคำตอบ อาจเป็นชื่อตัวแปรที่ยอมรับได้เดียวที่แย่ที่สุดใน Javascript ทั้งหมด
คอรีแดเนียล

2
สิ่งนี้ทำให้เกิดข้อยกเว้นและคุณต้องใช้window.ก่อนตัวแปรถ้าใช้ในบริบทโลก ... นี่ไม่ใช่วิธีที่ดีที่สุด
อเล็กซ์ W

4
เนื่องจากปัญหาเอาชนะนี้คุณควรใช้แทนvoid(0) undefined
Bartłomiej Zalewski

1 ตั้งแต่คำตอบนี้ชี้ให้เห็นว่าบางครั้งคุณอาจต้องการที่จะระบุfalse, 0ฯลฯ เป็นค่าที่ไม่ถูกต้อง
rinogo

77

windowตรวจสอบว่า hasOwnProperty( " varname" )

อีกทางเลือกหนึ่งของtypeofคำตอบมากมาย

ตัวแปรโกลบอลที่ประกาศพร้อมvar varname = value;คำสั่งในขอบเขตโกลบอล

สามารถเข้าถึงได้เป็นคุณสมบัติของวัตถุหน้าต่าง

เช่นhasOwnProperty()วิธีการซึ่ง

ส่งคืนบูลีนที่ระบุว่าวัตถุนั้นมีคุณสมบัติที่ระบุเป็นคุณสมบัติของตัวเองหรือไม่ (ซึ่งต่างจากการสืบทอด)

สามารถใช้เพื่อตรวจสอบว่า

varของ"varName"ได้รับการประกาศทั่วโลกเช่นwindowเป็นทรัพย์สินของที่

// Globally established, therefore, properties of window
var foo = "whatever", // string
    bar = false,      // bool
    baz;              // undefined
//  window.qux does not exist

console.log( [
    window.hasOwnProperty( "foo" ), // true
    window.hasOwnProperty( "bar" ), // true
    window.hasOwnProperty( "baz" ), // true
    window.hasOwnProperty( "qux" )  // false
] );

มีอะไรที่ยอดเยี่ยมเกี่ยวกับ hasOwnProperty()เรียกมันว่าเราไม่ได้ใช้ตัวแปรที่อาจยังไม่ได้ประกาศซึ่งแน่นอนว่าครึ่งหนึ่งของปัญหาในตอนแรก

แม้ว่าจะไม่ได้เสมอที่สมบูรณ์แบบหรือเหมาะแก้ปัญหาในบางสถานการณ์ก็แค่งาน!

หมายเหตุ

ด้านบนเป็นจริงเมื่อใช้varเพื่อกำหนดตัวแปรซึ่งตรงข้ามกับletที่:

ประกาศตัวแปรโลคัลขอบเขตบล็อกให้เลือกที่จะกำหนดค่าเป็นค่าเริ่มต้น

ไม่เหมือน varคำหลักซึ่งกำหนดตัวแปรทั่วโลกหรือภายในฟังก์ชันทั้งหมดโดยไม่คำนึงถึงขอบเขตบล็อก

ที่ระดับบนสุดของโปรแกรมและฟังก์ชั่นซึ่งletแตกต่างจากการvarสร้างคุณสมบัติบนวัตถุทั่วโลก

เพื่อความสมบูรณ์: constค่าคงที่คือโดยความหมายไม่ใช่ตัวแปรจริง (แม้ว่าเนื้อหาสามารถเป็นได้); มีความเกี่ยวข้องมากขึ้น:

ค่าคงที่ส่วนกลางไม่กลายเป็นคุณสมบัติของวัตถุหน้าต่างซึ่งแตกต่างจากvarตัวแปร ต้องมี initializer สำหรับค่าคงที่ นั่นคือคุณต้องระบุค่าในคำสั่งเดียวกับที่มีการประกาศ

ค่าของค่าคงที่ไม่สามารถเปลี่ยนแปลงได้ผ่านการกำหนดใหม่และไม่สามารถประกาศใหม่ได้

การประกาศ const สร้างการอ้างอิงแบบอ่านอย่างเดียวกับค่า ไม่ได้หมายความว่าค่าที่เก็บไว้นั้นไม่เปลี่ยนรูปเพียง แต่ตัวระบุตัวแปรไม่สามารถกำหนดใหม่ได้

เนื่องจากletตัวแปรหรือconstค่าคงที่ไม่เคยมีคุณสมบัติของวัตถุใด ๆ ที่มีการสืบทอดhasOwnProperty()วิธีการจึงไม่สามารถใช้เพื่อตรวจสอบการมีอยู่ของพวกเขา

เกี่ยวกับความพร้อมใช้งานและการใช้hasOwnProperty():

วัตถุทุกชนิดที่สืบทอดมาจากวัตถุสืบทอดhasOwnProperty()วิธีการ [... ] ไม่เหมือนกับตัวinดำเนินการวิธีนี้ไม่ได้ตรวจสอบโซ่ต้นแบบของวัตถุ


1
นี่เป็นทางเลือกที่ยอดเยี่ยมและควรอยู่ในอันดับต้น ๆ ของคำถามนี้ โปรดทำให้หัวข้อคำตอบง่ายขึ้นด้วยตัวอย่างการทำงานที่ส่งคืนtrue(เช่นwindow.hasOwnProperty('console')หรือvar hop = "p";window.hasOwnProperty('hop'))
CPHPython

2
ในที่สุดสิ่งที่ไม่ทำให้เกิดข้อผิดพลาดเนื่องจากการเข้าถึงสมาชิกที่ไม่มีอยู่…บางสิ่งบางอย่างtypeofคำตอบทั้งหมดก็มองข้ามไป
Zelphir Kaltstahl

1
คำตอบนี้ล้าสมัย - สำหรับ ECMAScript มาตรฐานคุณสามารถกำหนดตัวแปรletที่ไม่สามารถใช้ตัวแปรเหล่านี้เป็นคุณสมบัติของวัตถุwindow[หรืออื่น ๆ ที่มี] hasOwnPropertyการทดสอบการปรากฏตัวของคุณสมบัติletไม่ตัวแปรจึงไม่สามารถนำมาใช้ในการตรวจสอบตัวแปรที่กำหนดโดย
พฤศจิกายน

1
@amn คำตอบยังคงเป็นจริงเกี่ยวกับการใช้งานvarและเป็นเรื่องที่ไม่ล้าสมัย ฉันได้เพิ่ม แต่ทราบสรุปวิธีการใช้letและแตกต่างจากที่const varขอบคุณสำหรับแรงบันดาลใจของคุณ เราเพิ่มขึ้นด้วยกัน :)
Fred Gandt

1
@ ฉันได้เขียนคำตอบใหม่ (หวังว่าจะเป็นครั้งสุดท้าย) เพื่อให้ชัดเจนยิ่งขึ้นซึ่งhasOwnPropertyสามารถใช้ในลักษณะที่กำหนดเพื่อตรวจสอบการมีอยู่ของvarตัวแปร อ่านแล้วโอเคสำหรับฉัน
Fred Gandt

68

วิธีตรวจสอบว่ามีตัวแปรอยู่หรือไม่

นี่เป็นวิธีแก้ปัญหากระสุนที่ไม่ดีสำหรับการทดสอบว่ามีตัวแปรอยู่หรือไม่และได้รับการเริ่มต้น:

var setOrNot = typeof variable !== typeof undefined;

มันถูกใช้มากที่สุดร่วมกับผู้ประกอบการที่ประกอบไปด้วยกันเพื่อตั้งค่าเริ่มต้นในกรณีที่ตัวแปรบางอย่างยังไม่ได้เริ่มต้น:

var dark = typeof darkColor !== typeof undefined ? darkColor : "black";

มีปัญหากับการห่อหุ้ม

น่าเสียดายที่คุณไม่สามารถแค็ปซูลเช็คของคุณในฟังก์ชั่น

คุณอาจคิดถึงการทำสิ่งนี้:

function isset(variable) {
    return typeof variable !== typeof undefined;
}

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

Uncaught ReferenceError: foo ไม่ได้ถูกกำหนดไว้


การทดสอบว่าพารามิเตอร์ฟังก์ชั่นจะไม่ได้กำหนด

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

var a = '5';

var test = function(x, y) {
    console.log(isset(x));
    console.log(isset(y));
};

test(a);

// OUTPUT :
// ------------
// TRUE
// FALSE

แม้ว่าจะไม่มีค่าสำหรับการyส่งผ่านไปยังฟังก์ชันtestแต่ฟังก์ชันของเราissetทำงานได้อย่างสมบูรณ์ในบริบทนี้เพราะyเป็นที่รู้จักกันในฟังก์ชั่นtestเป็นundefinedค่า


41

มีวิธีสั้น ๆ อีกวิธีหนึ่งในการตรวจสอบเรื่องนี้เมื่อคุณทำการมอบหมายอย่างง่ายและการตรวจสอบที่เกี่ยวข้อง เพียงใช้โอเปอเรเตอร์ (Ternary) แบบมีเงื่อนไข

var values = typeof variable !== 'undefined' ? variable : '';

สิ่งนี้จะเป็นประโยชน์เมื่อคุณพยายามประกาศตัวแปร Global พร้อมการกำหนดอินสแตนซ์ของตัวแปรอ้างอิง

หากคุณต้องการที่จะตรวจสอบตัวแปรไม่ควรจะเป็นหรือundefined nullจากนั้นดำเนินการตรวจสอบด้านล่าง

เมื่อมีการประกาศตัวแปรและหากคุณต้องการตรวจสอบค่านี่จะเป็นแบบง่าย ๆ : และมันจะทำงานundefinedและnullตรวจสอบร่วมกัน

var values = variable ? variable : '';

คำตอบตามที่ถูกแบนออกผิด ตัวแปร typeof ส่งคืนสตริงเสมอซึ่งจะไม่เป็นเท็จ เช่นถ้าtypeof(booooo)เป็น"undefined"แล้วtypeof(typeof boooooo)เป็น"string"และอยู่เสมอtypeof boooooo && true trueคำตอบ @ John-Slegers นั้นเกี่ยวกับตัวย่อที่คุณสามารถหาได้จาก typeof
mpag

คำตอบที่ถูกต้องอย่างมัน นี่คือการทำงานซอ และฉันไม่รู้ว่าคุณกำลังพูดถึงสถานการณ์อะไร คำถามเกี่ยวกับการตรวจสอบการมีอยู่ของตัวแปร
RajeshKdev

@mpag อย่าบอกว่าผิดพลาด พิสูจน์มัน การค้นหาความผิดพลาดเป็นเรื่องง่ายจริง ๆ แต่คุณสามารถให้คำตอบที่ดีได้ที่นี่ !!! หากคำตอบนั้นผิดโปรแกรมเมอร์28 คนคงไม่โหวตถ้าไม่ตอบคำถาม เนื่องจากมีคำตอบที่โด่งดังมากมายที่นี่พวกเขาอาจได้รับการโหวตว่าไม่ใช่
RajeshKdev

ที่จริงแล้วรหัสที่สองคือไม่ต้องตรวจสอบสภาพเหมือนด้านบน ฉันคิดว่าผู้คนจะเข้าใจโดยบรรทัดนี้If you wanted to check variable shouldn't be undefined or null.โดยความคิดเห็นนี้มันชัดเจนระบุมันไม่ทำการตรวจสอบประกาศตัวแปร นั่นคือการตรวจสอบค่าตัวแปร
RajeshKdev

1
การตรวจสอบครั้งที่สองของคุณจะล้มเหลวด้วยค่า 0
Fareed Alnamrouti

32

วิธีสั้น ๆ ในการทดสอบตัวแปรไม่ได้ถูกประกาศ (ไม่ได้ไม่ได้กำหนด) คือ

if (typeof variable === "undefined") {
  ...
}

ฉันพบว่ามีประโยชน์สำหรับการตรวจจับสคริปต์ที่ทำงานนอกเบราว์เซอร์ (ไม่มีwindowตัวแปรที่ประกาศไว้)


นี่คือ "วิธีบัญญัติ" ซึ่งเป็นแบบพกพา?
Jason

3
นี่เป็นสิ่งที่ผิด window.bar=undefinedถูกกำหนดและตั้งเป็นค่า คำตอบของคุณล้มเหลวในการตรวจสอบความแตกต่างระหว่างสิ่งนี้และหากไม่มีตัวแปร ถ้าคุณทำthis.hasOwnProperty('bar')มันอาจจะได้ผล
oligofren

รหัสนี้ใช้งานไม่ได้และคุณสามารถตรวจสอบได้โดยใช้คอนโซลของเบราว์เซอร์
ha9u63ar

1
const x = 0; (() => console.log(x, this.hasOwnProperty('x')))();พิจารณา ตัวแปรxถูกกำหนด แต่ส่งคืน false ...
user2878850

29

มันขึ้นอยู่กับว่าคุณแค่สนใจว่าตัวแปรนั้นถูกกำหนดหรือถ้าคุณต้องการให้มันมีค่าที่มีความหมาย

การตรวจสอบว่าประเภทไม่ได้กำหนดจะตรวจสอบว่าตัวแปรได้รับการกำหนดหรือยัง

=== nullหรือ!== nullจะตรวจสอบว่าค่าของตัวแปรนั้นถูกต้องnullหรือไม่

== nullหรือ!= nullจะตรวจสอบว่ามีค่าเป็นหรือundefinednull

if(value)จะตรวจสอบว่าตัวแปรที่undefined, null, 0หรือสตริงที่ว่างเปล่า


12

คำตอบที่ถูกต้องที่สุดให้ใช้ typeof

อย่างไรก็ตามสิ่งที่ฉันต้องการชี้ให้เห็นคือใน JavaScript undefinedไม่แน่นอน (ด้วยเหตุผลบางอย่างที่ไม่ดี) ดังนั้นเพียงแค่ทำการตรวจสอบvarName !== undefinedมีความเป็นไปได้ที่จะไม่กลับมาตามที่คุณคาดหวังไว้เพราะ libs อื่นอาจมีการเปลี่ยนแปลงที่ไม่ได้กำหนด บางคำตอบ (@ หนึ่งของ skalee) ดูเหมือนจะไม่ต้องการใช้typeofและนั่นอาจทำให้เกิดปัญหา

วิธีที่ "เก่า" ในการจัดการนี้ได้รับการประกาศกำหนดเป็น var เพื่อชดเชยใด ๆ ที่มีศักยภาพการปิด / undefinedมากกว่าขี่ของ อย่างไรก็ตามวิธีที่ดีที่สุดยังคงใช้typeofเพราะจะไม่สนใจการแทนที่ของundefinedรหัสอื่น ๆ โดยเฉพาะอย่างยิ่งถ้าคุณกำลังเขียนโค้ดเพื่อใช้ในแบบไวด์สกรีนซึ่งใครจะรู้ว่ามีอะไรอีกที่สามารถทำงานบนหน้า ...


1
จุดคือ moot เพราะถ้า varName ไม่ได้กำหนดไว้ก็varName !== undefinedจะทำให้ ReferenceError ความแปรปรวนของundefinedจะไม่สำคัญ
Wutaz

Heads-up: คำตอบของคุณถูกย้ายมาที่นี่จากstackoverflow.com/questions/519145/…
Shog9

1
ในเวอร์ชัน Javascript ที่ใหม่กว่าundefinedเป็นคุณสมบัติอ่านอย่างเดียว typeof mvVar === typeof void 0แต่จะเป็นกระสุนที่คุณสามารถใช้ void 0ผลตอบแทนundefinedเสมอ
kwarnke

11
if (typeof console != "undefined") {    
   ...
}

หรือดีกว่า

if ((typeof console == "object") && (typeof console.profile == "function")) {    
   console.profile(f.constructor);    
}

ใช้งานได้ในเบราว์เซอร์ทั้งหมด


3
ทำไมความคิดของคุณถึงดีกว่า?
skalee

3
@skalee ฉันเห็นด้วยอย่างหลังดีกว่า นี่คือเหตุผลง่ายๆที่คุณตรวจสอบว่าประเภทเป็นประเภทที่คุณต้องการก่อนที่จะใช้หรือไม่
Broxzier

Heads-up: คำตอบของคุณถูกย้ายมาที่นี่จากstackoverflow.com/questions/519145/…
Shog9

9

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

if (typeof data !== "undefined" && typeof data.url === "undefined") {
    var message = 'Error receiving response';
    if (typeof data.error !== "undefined") {
        message = data.error;
    } else if (typeof data.message !== "undefined") {
        message = data.message;
    }
    alert(message); 
}

.. สามารถลดเป็น:

if (data && !data.url) {
  var message = data.error || data.message || 'Error receiving response';
  alert(message)
} 


นี่ไม่ใช่สิ่งที่ OP ถาม หาก data.url เท่ากับ''โซลูชันของคุณจะพิจารณาว่าไม่ได้กำหนดไว้เมื่อมีการกำหนดในความเป็นจริงว่ามีสตริงว่าง
Demonblack

ฉันเห็นด้วยไม่ใช่สิ่งที่ถูกถามและคุณพูดถูก: สตริงว่าง '' จะถูกพิจารณาว่าไม่ได้กำหนด แต่ฉันโพสต์สิ่งนี้เพราะฉันคิดว่ามันอาจมีประโยชน์ในการอภิปรายที่สร้างขึ้นในคำตอบที่ต่างกัน และในตัวอย่างรวมถึงในกรณีอื่น ๆ อีกมากมายคุณเพียงแค่ต้องการพิมพ์สตริงหากมีเนื้อหาจริงดังนั้นคุณสามารถใช้ประโยชน์จากข้อเท็จจริงที่ว่า javascript พิจารณาเท็จทั้งสตริงที่ว่างเปล่าและไม่ได้กำหนด
de3

8

เป็นการยากที่จะแยกแยะระหว่าง undefined และ null Nullเป็นค่าที่คุณสามารถกำหนดให้กับตัวแปรได้เมื่อคุณต้องการระบุว่าตัวแปรนั้นไม่มีค่าใดเป็นพิเศษ ไม่ได้กำหนด เป็นค่าพิเศษซึ่งจะเป็นค่าเริ่มต้นของตัวแปรที่ไม่ได้กำหนด


var _undefined;
var _null = null;

alert(_undefined); 
alert(_null); 
alert(_undefined == _null);
alert(_undefined === _null);


1
จะเป็นประโยชน์ในการแสดงอินไลน์เอาต์พุตของการแจ้งเตือนแต่ละรายการ
demisx

@demisx เห็นด้วย แต่แทนที่จะแนะนำการแก้ไขทำไมไม่ลองทำดูล่ะ? ตัวเลือกอยู่ที่นั่นด้วยเหตุผล บางคนอาจคิดว่ามันหยาบคาย ฉันคิดว่ามันมีประสิทธิภาพ - ดังนั้นแก้ไขคำตอบด้วยตัวเอง (รอการตรวจสอบ)
Fred Gandt

1
@ เฟรด - ฉันดูที่ประวัติการแก้ไขและสามารถเดาได้ว่าเหตุใดการแก้ไขของคุณจึงถูกปฏิเสธ ... แทนที่จะเพิ่มบรรทัดเพื่อแสดงว่าเอาต์พุตจะเป็นอย่างไรตามที่ demisx แนะนำคุณเปลี่ยนสิ่งที่ Jith โพสต์ไว้อย่างมีนัยสำคัญ
สตีเฟ่น P

8

Null เป็นค่าใน JavaScript และtypeof nullส่งคืน"object"

ดังนั้นคำตอบที่ได้รับการยอมรับจะไม่ทำงานหากคุณผ่านค่า Null หากคุณผ่านค่า Null คุณต้องเพิ่มการตรวจสอบพิเศษสำหรับค่า Null:

if ((typeof variable !== "undefined") && (variable !== null))  
{
   // the variable is defined and not null
}

7

ส่วนใหญ่ที่แข็งแกร่ง 'มันคือกำหนด' เช็คอินคือมีtypeof

if (typeof elem === 'undefined')

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

elem = elem || defaultElem;

บ่อยครั้งที่ใช้งานได้ดีโปรดดู: วิธีการตั้งค่าเริ่มต้นในจาวาสคริปต์

นอกจากนี้ยังมีซับในนี้ใช้คำหลักtypeof :

elem = (typeof elem === 'undefined') ? defaultElem : elem;

7

คุณสามารถใช้ typeofโอเปอเรเตอร์ได้

ตัวอย่างเช่น,

var dataSet;

alert("Variable dataSet is : " + typeof dataSet);

ข้อมูลโค้ดด้านบนจะส่งคืนผลลัพธ์เช่น

ชุดข้อมูลตัวแปรคือ: ไม่ได้กำหนด


1
Heads-up: คำตอบของคุณถูกย้ายมาที่นี่จากstackoverflow.com/questions/519145/…
Shog9

7

เพื่อตรวจสอบว่ามีการประกาศตัวแปร / ชุดฉันได้ทำเล่ห์เหลี่ยมสกปรก

evalผมยังไม่ได้พบวิธีที่จะดึงรหัสเพื่อฟังก์ชั่นที่แม้จะมี

"use strict";

// var someVar;

var declared;
try {
  someVar;
  declared = true;
} catch(e) {
  declared = false;
}

if (declared) {
  console.log("someVar is declared; now has the value: " + someVar);
} else {
  console.log("someVar is not declared");
}

คุณหมายถึงอะไรโดย "ดึงรหัสไปยังฟังก์ชั่น"?
Melab

7

คำตอบเหล่านี้ (นอกเหนือจากโซลูชัน Fred Gandt) นั้นไม่ถูกต้องหรือไม่สมบูรณ์

สมมติว่าฉันต้องการvariableName;ให้มีundefinedค่าและดังนั้นจึงได้รับการประกาศในลักษณะเช่นvar variableName;ซึ่งหมายความว่ามันเริ่มต้นแล้ว; - ฉันจะตรวจสอบว่ามันประกาศแล้ว?

หรือดียิ่งขึ้น - ฉันจะตรวจสอบทันทีว่า "Book1.chapter22.paragraph37" มีอยู่ด้วยการโทรครั้งเดียว แต่ไม่เกิดข้อผิดพลาดในการอ้างอิงหรือไม่

เราทำได้โดยใช้ตัวดำเนินการ JasvaScript ที่ทรงพลังที่สุดตัวดำเนินการin :

"[variable||property]" in [context||root] 
>> true||false

ในช่วงเวลาของความนิยมสูงสุดของ AJAX ฉันได้เขียนวิธีการ (ชื่อภายหลัง) isNS () ซึ่งสามารถพิจารณาได้ว่ามีเนมสเปซอยู่หรือไม่รวมถึงการทดสอบแบบลึกสำหรับชื่อคุณสมบัติเช่น "Book1.chapter22.paragraph37" และอีกมากมาย

แต่เนื่องจากมีการเผยแพร่ก่อนหน้านี้และเนื่องจากมีความสำคัญอย่างยิ่งจึงสมควรที่จะได้รับการเผยแพร่ในเธรดแยกต่างหากฉันจะไม่โพสต์ไว้ที่นี่ แต่จะให้คำหลัก ( javascript + isNS ) ซึ่งจะช่วยคุณค้นหาซอร์สโค้ด คำอธิบายที่จำเป็น


1
inผู้ประกอบการเพียงการทดสอบสำหรับการดำรงคุณสมบัติและตัวแปรไม่ได้ทั้งหมดเป็นทรัพย์สิน - constและletการประกาศไม่ได้ (และconstจะไม่ได้ดีตัวแปร )
พฤศจิกายน

1
constและletได้รับการรับรองมาตรฐานด้วย ECMAScript 2015 ซึ่งเผยแพร่มากกว่า 3 ปีที่ผ่านมาและตั้งแต่นั้นมาก็เห็นการยอมรับที่ดีโดยผู้ต้องสงสัยตามปกติและมีการใช้งานค่อนข้างแพร่หลายในวันนี้กล้าพูดว่า - มีมากกว่า 2 ล้านเหตุการณ์ ในแฟ้ม
พฤศจิกายน

ใช่ "ตัวแปร" - อย่างแน่นอน ซึ่งเป็นเหตุผลที่ผมแสดงความคิดเห็นในคำตอบของคุณชี้ให้เห็นว่าคุณไม่สามารถใช้inประกอบการโดยทั่วไปการทดสอบไม่ว่าจะเป็นตัวแปรที่มีอยู่เพราะ "const และปล่อยให้ไม่ได้ [คุณสมบัติ]" - ในขณะที่constแน่นอนสามารถกล่าวว่าจะแนะนำคงอ้างอิงเป็น ตรงกันข้ามกับการอ้างอิงตัวแปรletจริง ๆ แล้วแนะนำการอ้างอิงตัวแปรจริง ๆ แล้วมันคือในคำอื่น ๆ โดยวัดใด ๆ ตัวแปรและคำตอบของคุณไม่ถูกต้องในการแสดงว่าคุณสามารถทดสอบว่าตัวแปรที่กำหนดด้วยletอยู่ โดยใช้inโอเปอเรเตอร์ - คุณทำไม่ได้
พฤศจิกายน

ข้อมูลจำเพาะ ECMAScript 6กำหนดภาษา JavaScript ไม่ใช่คุณหรือเว็บเบราว์เซอร์ นั่นเป็นเหตุผลที่เรียกว่าข้อกำหนด - มันระบุภาษาได้อย่างชัดเจน คำตอบของคุณล้าสมัยที่สุดที่แย่ที่สุดก็จงตั้งใจละเว้นสิ่งที่คุณคิดว่าไม่เกี่ยวข้องในขณะที่มันเกี่ยวข้องมาก การอ้างถึงข้อกำหนดที่เชื่อมโยง "การประกาศ let และ const กำหนดตัวแปร" สิ่งก่อสร้างเหล่านี้ไม่สามารถเข้าถึงได้เนื่องจากคุณสมบัติของwindowวัตถุฉันไม่ทราบวิธีทำให้สิ่งนี้ชัดเจนยิ่งขึ้นสำหรับคุณ
พฤศจิกายน

คำตอบไม่ครอบคลุมทุกกรณีของตัวแปร โดยเฉพาะมันไม่ครอบคลุมตัวแปรที่กำหนดด้วยletคำหลัก นั่นคือทั้งหมดที่ฉันชี้ให้เห็น
พฤศจิกายน

6

ในสถานการณ์เฉพาะที่ระบุไว้ในคำถาม

typeof window.console === "undefined"

เหมือนกันกับ

window.console === undefined

ฉันชอบรุ่นหลังมากกว่าเพราะสั้นกว่า

โปรดทราบว่าเราค้นหาconsoleเฉพาะในขอบเขตทั่วโลก (ซึ่งเป็นwindowวัตถุในเบราว์เซอร์ทั้งหมด) ในสถานการณ์พิเศษนี้เป็นที่พึงปรารถนา เราไม่ต้องการให้consoleนิยามไว้ที่อื่น

@BrianKelley ในคำตอบที่ยอดเยี่ยมของเขาอธิบายรายละเอียดทางเทคนิค ฉันได้เพิ่มข้อสรุปที่ขาดไปเท่านั้นและแยกย่อยเป็นสิ่งที่อ่านง่ายขึ้น


Heads-up: คำตอบของคุณถูกย้ายมาที่นี่จากstackoverflow.com/questions/519145/…
Shog9

2
เท็จ หลังพ่นข้อยกเว้นในคอนโซลของฉัน
john ktejik

6

ฉันใช้สองวิธีที่แตกต่างกันขึ้นอยู่กับวัตถุ

if( !variable ){
  // variable is either
  // 1. '';
  // 2. 0;
  // 3. undefined;
  // 4. null;
  // 5. false;
}

บางครั้งฉันไม่ต้องการประเมินสตริงว่างเปล่าว่าเป็นเท็จดังนั้นฉันจึงใช้กรณีนี้

function invalid( item ){
  return (item === undefined || item === null);
}

if( invalid( variable )){
  // only here if null or undefined;
}

หากคุณต้องการสิ่งที่ตรงกันข้ามในครั้งแรก! ตัวแปรจะกลายเป็นตัวแปร !! และในฟังก์ชั่นที่ไม่ถูกต้อง === กลายเป็น! = และชื่อฟังก์ชั่นจะเปลี่ยนเป็นไม่ใช่ค่าไม่ถูกต้อง


5

typeof(elem) != 'undefined' && elem != nullการตั้งค่าของฉันคือ

อย่างไรก็ตามคุณเลือกให้ลองวางฟังก์ชั่นเช็คอินแบบนั้น

function existy (x) {
    return typeof (x) != 'undefined' && x != null;
}

หากคุณไม่ทราบว่ามีการประกาศตัวแปรให้ดำเนินการต่อ typeof (x) != 'undefined' && x != null;

เมื่อคุณทราบว่ามีการประกาศตัวแปร แต่อาจไม่มีอยู่จริงคุณสามารถใช้ได้

existy(elem) && doSomething(elem);

ตัวแปรที่คุณกำลังตรวจสอบอาจเป็นคุณสมบัติที่ซ้อนกันบางครั้ง คุณสามารถใช้ prop || {} เพื่อลงบรรทัดการตรวจสอบที่อยู่ของคุณสมบัติที่มีปัญหา:

var exists = ((((existy(myObj).prop1||{}).prop2||{}).prop3||{})[1]||{}).prop4;

หลังจากใช้คุณสมบัติแต่ละรายการ (... '|| {}') nextProp เพื่อให้คุณสมบัติที่ขาดหายไปจะไม่เกิดข้อผิดพลาด

หรือคุณสามารถใช้ชีวิตเช่น existy(o) && existy(o.p) && existy(o.p.q) && doSomething(o.p.q)


หากคุณใส่ไว้ในฟังก์ชั่นมันซ้ำซ้อน typeof (x) != 'undefined' && x != nullเทียบเท่ากับx != nullเมื่อxมีการประกาศ
Ry-

3

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

if (typeof(jQuery) != "undefined")

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

function sayHello(name) {
    if (name) return "Hello, " + name;
    else return "Hello unknown person";
}
sayHello(); // => "Hello unknown person"

3

ลองจับ

หากตัวแปรไม่ได้ถูกกำหนดไว้ทั้งหมดคุณสามารถตรวจสอบได้โดยไม่ต้องดำเนินการกับรหัสทำลายโดยใช้ try-catch block ดังต่อไปนี้ (คุณไม่จำเป็นต้องuse strictโหมด)

โบนัส: (หมายถึงคำตอบอื่น ๆ ) เหตุใดจึง===ชัดเจนกว่า==( แหล่งที่มา )

ถ้า (a == b)

ป้อนคำอธิบายภาพที่นี่

ถ้า (a === b)

ป้อนคำอธิบายภาพที่นี่


1
FYI, (a == b) ที่วางไว้บนกริดเกมแห่งชีวิตไม่ใช่สิ่งที่น่าตื่นเต้น
johnsnails

0

ฉันประหลาดใจที่ยังไม่ได้กล่าวถึง ...

นี่คือรูปแบบเพิ่มเติมสองสามแบบที่ใช้ this['var_name']

ประโยชน์ของการใช้วิธีนี้ที่สามารถใช้ได้ก่อนที่จะมีการกำหนดตัวแปร

if (this['elem']) {...}; // less safe than the res but works as long as you're note expecting a falsy value
if (this['elem'] !== undefined) {...}; // check if it's been declared
if (this['elem'] !== undefined && elem !== null) {...}; // check if it's not null, you can use just elem for the second part

// these will work even if you have an improper variable definition declared here
elem = null; // <-- no var here!! BAD!

นี่เป็นสิ่งที่ผิด window.bar=undefinedถูกกำหนดและตั้งเป็นค่า คำตอบของคุณล้มเหลวในการตรวจสอบความแตกต่างระหว่างสิ่งนี้และหากไม่มีตัวแปร ถ้าคุณทำthis.hasOwnProperty('bar')มันอาจจะได้ผล
oligofren

0

คุณสามารถใช้ลอง ... catch block ดังต่อไปนี้:

ข้อเสียคือคุณไม่สามารถใส่มันในฟังก์ชั่นที่มันจะโยน ReferenceError

function variableExists(x) {
  var status = true
  try {
	  x
  } catch (ReferenceError) {
	  status = false
  }
  
  return status
}

console.log(variableExists(x))

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