isset JavaScript () ที่เทียบเท่า


553

ใน PHP if(isset($array['foo'])) { ... }ที่คุณสามารถทำได้ ใน JavaScript คุณมักใช้if(array.foo) { ... }ทำสิ่งเดียวกัน แต่นี่ไม่ใช่คำสั่งเดียวกันทั้งหมด เงื่อนไขจะประเมินเป็นเท็จหากarray.fooมีอยู่ แต่เป็นfalseหรือ0(และอาจเป็นค่าอื่นเช่นกัน)

อะไรคือความสมบูรณ์แบบของ PHP issetใน JavaScript?

โดยทั่วไปแล้วคู่มือที่สมบูรณ์เกี่ยวกับการจัดการตัวแปรที่ไม่มีอยู่ของ JavaScript ตัวแปรที่ไม่มีค่า ฯลฯ จะสะดวก


1
ฉันเขียนฟังก์ชันที่จะทดสอบการมีอยู่ของคุณสมบัติวัตถุโดยไม่คำนึงถึงความลึก: stackoverflow.com/a/12681101/1268003การใช้รหัสของฉันรวมกับความรู้ที่แบ่งปันโดย @CMS ในหัวข้อนี้คุณสามารถเขียนทั่วโลกได้อย่างง่ายดาย ฟังก์ชั่นที่ใช้งานได้ดีเช่น PHP: s isset
Martin Andersson

3
หากคุณใช้Underscore.jsลอง_.isUndefined(arr.foo)
Vitalii Fedorenko

การผูกมัดเสริมอาจเป็นสิ่งที่คนส่วนใหญ่มองหาstackoverflow.com/a/60845999/2100372
zoran404

คำตอบ:


938

โดยทั่วไปฉันใช้typeofโอเปอเรเตอร์:

if (typeof obj.foo !== 'undefined') {
  // your code here
}

มันจะกลับมาอย่างใดอย่างหนึ่งถ้าคุณสมบัติไม่อยู่หรือมูลค่าของมันคือ"undefined"undefined

(ดูเพิ่มเติมที่: ความแตกต่างระหว่างundefinedและไม่ได้ถูกกำหนด )

มีวิธีอื่นในการคิดว่าทรัพย์สินมีอยู่บนวัตถุหรือไม่เช่นเดียวกับhasOwnPropertyวิธีการ:

if (obj.hasOwnProperty('foo')) {
  // your code here
}

และinผู้ประกอบการ:

if ('foo' in obj) {
  // your code here
}

ความแตกต่างระหว่างสองคนสุดท้ายก็คือว่าhasOwnPropertyวิธีการจะตรวจสอบว่าทรัพย์สินที่อยู่ทางกายภาพบนวัตถุ (ทรัพย์สินที่ไม่ได้รับมรดก)

inผู้ประกอบการจะตรวจสอบเกี่ยวกับคุณสมบัติทั้งหมดที่สามารถเข้าถึงได้ขึ้นในห่วงโซ่ต้นแบบเช่น:

var obj = { foo: 'bar'};

obj.hasOwnProperty('foo'); // true
obj.hasOwnProperty('toString'); // false
'toString' in obj; // true

ในขณะที่คุณสามารถดูhasOwnPropertyผลตอบแทนfalseและinผลตอบแทนที่ผู้ประกอบการtrueเมื่อการตรวจสอบtoStringวิธีการวิธีการนี้ถูกกำหนดขึ้นในห่วงโซ่ต้นแบบเพราะแบบฟอร์มการสืบทอดobjObject.prototype


23
ทำไมต้องใช้typeofมากกว่าif( obj.foo !== undefined )?
Matt Ball

7
อา. วันหนึ่งฉันจะเขียน Javascript ข้ามเบราว์เซอร์อย่างแท้จริง ก่อนหน้านั้น ...
แมตต์บอล

37
ปัญหานี้คือคุณได้รับข้อผิดพลาดเมื่อคุณพยายามตรวจสอบคุณสมบัติที่ลึกกว่าเช่น obj.thisdoesntexist.foo! == undefined ใน PHP คุณสามารถใช้ isset หรือเปล่าและปลอดภัยในทุกระดับ
เอ็นริเก

6
IE8 ไม่มี "hasOwnPropery"
max4ever

12
แน่นอนว่า PHP อนุญาตisset($abc->def->ghi->jkl)โดยไม่เพิ่มข้อยกเว้นและหยุดสคริปต์ซึ่งแตกต่างจากtypeofตัวดำเนินการของ JavaScript คุณต้องใช้สิ่งที่ต้องการ try{ abc.def.ghi.jkl; isset=true } catch(e){ isset=false }
Steven Pribilinskiy

43

อายุด้ายเก่า แต่มีวิธีการใหม่ ๆ isset()ในการทำงานเทียบเท่า

ESNext (ด่าน 4 ธันวาคม 2562)

ไวยากรณ์ใหม่สองแบบช่วยให้เราสามารถใช้งานได้ง่ายขึ้นอย่างมากมายisset():

โปรดอ่านเอกสารและคำนึงถึงความเข้ากันได้ของเบราว์เซอร์

คำตอบก่อนหน้า

ดูคำอธิบายด้านล่าง หมายเหตุฉันใช้ไวยากรณ์ StandardJS

ตัวอย่างการใช้งาน

// IMPORTANT pass a function to our isset() that returns the value we're
// trying to test(ES6 arrow function)
isset(() => some) // false

// Defining objects
let some = { nested: { value: 'hello' } }

// More tests that never throw an error
isset(() => some) // true
isset(() => some.nested) // true
isset(() => some.nested.value) // true
isset(() => some.nested.deeper.value) // false

// Less compact but still viable except when trying to use `this` context
isset(function () { return some.nested.deeper.value }) // false

ฟังก์ชั่นคำตอบ

/**
 * Checks to see if a value is set.
 *
 * @param {Function} accessor Function that returns our value
 */
function isset (accessor) {
  try {
    // Note we're seeing if the returned value of our function is not
    // undefined
    return typeof accessor() !== 'undefined'
  } catch (e) {
    // And we're able to catch the Error it would normally throw for
    // referencing a property of undefined
    return false
  }
}

คำอธิบาย

PHP

โปรดทราบว่าใน PHP คุณสามารถอ้างอิงตัวแปรใด ๆ ที่ระดับความลึกใด ๆ - แม้จะพยายามเข้าถึง non-array เนื่องจาก array จะคืนค่าแบบง่าย ๆtrueหรือfalse:

// Referencing an undeclared variable
isset($some); // false

$some = 'hello';

// Declared but has no depth(not an array)
isset($some); // true
isset($some['nested']); // false

$some = ['nested' => 'hello'];

// Declared as an array but not with the depth we're testing for
isset($some['nested']); // true
isset($some['nested']['deeper']); // false

JS

ใน JavaScript เราไม่มีอิสระเราจะได้รับข้อผิดพลาดเสมอหากเราทำเช่นเดียวกันเพราะ JS พยายามเข้าถึงคุณค่าdeeper ก่อนที่เราจะสามารถห่อในisset()ฟังก์ชันของเราดังนั้น ...

// Common pitfall answer(ES6 arrow function)
const isset = (ref) => typeof ref !== 'undefined'

// Same as above
function isset (ref) { return typeof ref !== 'undefined' }

// Referencing an undeclared variable will throw an error, so no luck here
isset(some) // Error: some is not defined

// Defining a simple object with no properties - so we aren't defining
// the property `nested`
let some = {}

// Simple checking if we have a declared variable
isset(some) // true

// Now trying to see if we have a top level property, still valid
isset(some.nested) // false

// But here is where things fall apart: trying to access a deep property
// of a complex object; it will throw an error
isset(some.nested.deeper) // Error: Cannot read property 'deeper' of undefined
//         ^^^^^^ undefined

ทางเลือกที่ล้มเหลวเพิ่มเติม:

// Any way we attempt to access the `deeper` property of `nested` will
// throw an error
some.nested.deeper.hasOwnProperty('value') // Error
//   ^^^^^^ undefined

Object.hasOwnProperty('value', some.nested.deeper) // Error
//                                  ^^^^^^ undefined

// Same goes for typeof
typeof some.nested.deeper !== 'undefined' // Error
//          ^^^^^^ undefined

และทางเลือกการทำงานบางอย่างที่สามารถซ้ำซ้อนได้อย่างรวดเร็ว:

// Wrap everything in try...catch
try { isset(some.nested.deeper) } catch (e) {}
try { typeof some.nested.deeper !== 'undefined' } catch (e) {}

// Or by chaining all of the isset which can get long
isset(some) && isset(some.nested) && isset(some.nested.deeper) // false
//                        ^^^^^^ returns false so the next isset() is never run

ข้อสรุป

ทั้งหมดของคำตอบอื่น ๆ - แต่ส่วนใหญ่ทำงานได้ ...

  1. สมมติว่าคุณกำลังตรวจสอบเพื่อดูว่าตัวแปรไม่ได้ไม่ได้กำหนดซึ่งใช้ได้กับบางกรณี แต่ยังสามารถโยนข้อผิดพลาดได้
  2. สมมติว่าคุณกำลังพยายามเข้าถึงคุณสมบัติระดับบนสุดเท่านั้นซึ่งบางครั้งก็ใช้ได้สำหรับบางกรณี
  3. บังคับให้คุณใช้วิธีการที่เหมาะสมน้อยกว่าสัมพันธ์กับ PHP isset()
    เช่นisset(some, 'nested.deeper.value')
  4. ใช้eval()งานได้ แต่ฉันหลีกเลี่ยงเป็นการส่วนตัว

ฉันคิดว่าฉันครอบคลุมมาก มีบางประเด็นที่ฉันทำในคำตอบของฉันที่ฉันไม่ได้สัมผัสเพราะพวกเขา - แม้ว่าที่เกี่ยวข้อง - ไม่ใช่ส่วนหนึ่งของคำถาม แต่ถ้าจำเป็นฉันสามารถอัปเดตคำตอบของฉันพร้อมลิงก์ไปยังด้านเทคนิคเพิ่มเติมตามความต้องการ

ฉันใช้เวลากับ waaay มากเวลานี้หวังว่ามันจะช่วยให้ผู้คนออก

ขอบคุณสำหรับการอ่าน!


25

อ้างอิงถึง SOURCE

    module.exports = function isset () {
  //  discuss at: http://locutus.io/php/isset/
  // original by: Kevin van Zonneveld (http://kvz.io)
  // improved by: FremyCompany
  // improved by: Onno Marsman (https://twitter.com/onnomarsman)
  // improved by: Rafał Kukawski (http://blog.kukawski.pl)
  //   example 1: isset( undefined, true)
  //   returns 1: false
  //   example 2: isset( 'Kevin van Zonneveld' )
  //   returns 2: true

  var a = arguments
  var l = a.length
  var i = 0
  var undef

  if (l === 0) {
    throw new Error('Empty isset')
  }

  while (i !== l) {
    if (a[i] === undef || a[i] === null) {
      return false
    }
    i++
  }

  return true
}

phpjs.org ส่วนใหญ่จะเกษียณในความโปรดปรานของ locutus นี่คือลิงค์ใหม่http://locutus.io/php/var/isset


6
สิ่งนี้จะเพิ่มข้อยกเว้นเมื่อมีการโทรisset(abc.def.ghi)ในกรณีที่abc.defไม่ได้กำหนดไว้ อย่างไรก็ตามด้วยการรวมโซลูชันนี้เข้ากับที่ยอมรับชื่อตัวแปรในรูปแบบของสตริงมันจะเหมือนกับเวอร์ชั่น PHP
Steven Pribilinskiy


8
//
//  tring to reference non-existing variable throws ReferenceError 
//  before test function is even executed
//
//  example, if you do:
//    
//     if ( isset( someVar ) ) 
//        doStuff( someVar );
//   
//  you get a ReferenceError ( if there is no someVar... ) 
//  and isset fn doesn't get executed.
//
//  if you pass variable name as string, ex. isset( 'novar' );, 
//  this might work:
//
function isset ( strVariableName ) { 

    try { 
        eval( strVariableName );
    } catch( err ) { 
        if ( err instanceof ReferenceError ) 
           return false;
    }

    return true;

 } 
//
//

8

วิธีแก้ไขปัญหานี้ใช้งานได้ แต่ไม่ใช่สำหรับการตรวจสอบวัตถุที่ลึก

function isset(str) {
    return window[str] !== undefined;
}

6

ฉันมักจะใช้ฟังก์ชั่นทั่วไปนี้เพื่อป้องกันความผิดพลาดในตัวแปรดั้งเดิมรวมถึงอาร์เรย์และวัตถุ

isset = function(obj) {
  var i, max_i;
  if(obj === undefined) return false;
  for (i = 1, max_i = arguments.length; i < max_i; i++) {
    if (obj[arguments[i]] === undefined) {
        return false;
    }
    obj = obj[arguments[i]];
  }
  return true;
};

console.log(isset(obj));                   // returns false
var obj = 'huhu';
console.log(isset(obj));                   // returns true
obj = {hallo:{hoi:'hoi'}};
console.log(isset(obj, 'niet'));           // returns false
console.log(isset(obj, 'hallo'));          // returns true
console.log(isset(obj, 'hallo', 'hallo')); // returns false
console.log(isset(obj, 'hallo', 'hoi'));   // returns true


4

นี่เป็นวิธีแก้ปัญหากระสุนที่ค่อนข้างสวยสำหรับการทดสอบถ้ามีตัวแปรอยู่

var setOrNot = typeof variable !== typeof undefined ? true : false;

น่าเสียดายที่คุณไม่สามารถสรุปได้ในฟังก์ชั่น

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

function isset(variable) {
    return typeof variable !== typeof undefined ? true : false;
}

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

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

ในทางตรงกันข้ามมันจะช่วยให้คุณทดสอบว่าพารามิเตอร์ฟังก์ชั่นจะไม่ได้กำหนด:

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ค่า


ผู้เยาว์เล็กน้อย: ` จริง: เท็จ `เป็นฟุ่มเฟือย ผลลัพธ์ของการ!==เป็นบูลีนอยู่แล้ว
ToolmakerSteve

4
(typeof SOMETHING) !== 'undefined'

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

function isdef($var) {
    return (typeof $var) !== 'undefined';
}

isdef(SOMETHING); ///// thrown error: SOMETHING is not defined

ดังนั้นฉันจึงหาวิธี:

function isdef($type) {
    return $type !== 'undefined';
}

isdef(typeof SOMETHING);

มันสามารถทำงานได้ทั้งกับตัวแปรแต่ละตัว (ตัวแปรที่ไม่มีอยู่ทั้งหมด) หรือคุณสมบัติของวัตถุ (คุณสมบัติที่ไม่มีอยู่) และมีเพียง 7 ตัวอักษรมากกว่า issetPHP


สิ่งนี้ใช้งานได้สำหรับฉันใช้เพื่อตรวจสอบว่ามีคำตอบ json อยู่หรือไม่
Julius

3

วิธีนี้ใช้ได้ผลสำหรับฉัน

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

5
กล่าวอ้างisset(var)โดยไม่varล้าง:ReferenceError: var is not defined
Gui Imamura

3
function isset(variable) {
    try {
        return typeof eval(variable) !== 'undefined';
    } catch (err) {
        return false;
    }
}

4
เพิ่มคำอธิบายบางอย่างด้วย
ศรีกฤษณะ

ดังที่ได้กล่าวไว้ก่อนหน้านี้หลายคำตอบสิ่งนี้จะส่ง ReferenceError ถ้าถูกเรียกพร้อมกับตัวแปรที่ไม่เคยถูกประกาศ เช่นisset(someVar)ที่someVarไม่เคยมีการประกาศ อย่างไรก็ตามเมื่อคุณทำเช่นevalนั้นคุณอาจต้องการส่งผ่านสตริงแสดงการใช้งาน คุณตั้งใจจะใช้isset('someVar')หรือไม่? ถ้าเป็นเช่นนี้มันคล้ายกับคำตอบก่อนหน้านี้ - แล้วคำตอบของคุณคืออะไร?
ToolmakerSteve

3
window.isset = function(v_var) {
    if(typeof(v_var) == 'number'){ if(isNaN(v_var)){ return false; }}
    if(typeof(v_var) == 'undefined' || v_var === null){ return false;   } else { return true; }
};

บวกการทดสอบ:

https://gist.github.com/daylik/24acc318b6abdcdd63b46607513ae073


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

3

ในการตรวจสอบว่ามีบล็อก hether wether อยู่หรือไม่ฉันใช้รหัสนี้

if (typeof($('selector').html()) != 'undefined') {
    // $('selector') is existing
    // your code here
}

2

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

หากคุณกำลังเข้ารหัสในสภาพแวดล้อม ES6 ให้ดูที่Ques สแต็คโฟลว์โฟลนี้

var a;

a = {
    b: {
        c: 'e'
    }
};

function isset (obj, path) {
    var stone;

    path = path || '';

    if (path.indexOf('[') !== -1) {
        throw new Error('Unsupported object path notation.');
    }

    
    path = path.split('.');
    
    do {
        if (obj === undefined) {
            return false;
        }

        stone = path.shift();
        
        if (!obj.hasOwnProperty(stone)) {
            return false;
        }
        
        obj = obj[stone];
        
    } while (path.length);

    return true;
}

console.log(
    isset(a, 'b') == true,
    isset(a, 'b.c') == true,
    isset(a, 'b.c.d') == false,
    isset(a, 'b.c.d.e') == false,
    isset(a, 'b.c.d.e.f') == false
);


2

ฉันใช้ฟังก์ชั่นที่สามารถตรวจสอบตัวแปรและวัตถุ สะดวกในการทำงานกับ jQuery

    function _isset (variable) {
        if(typeof(variable) == "undefined" || variable == null)
            return false;
        else
            if(typeof(variable) == "object" && !variable.length) 
                return false;
            else
                return true;
    };

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

1

มันเป็นปัญหาสำหรับฉันจริง ๆ เมื่อฉันเข้าถึงคุณสมบัติที่ลึกกว่าของวัตถุดังนั้นฉันจึงสร้างฟังก์ชันซึ่งจะคืนค่าคุณสมบัติถ้ามีอยู่มิฉะนั้นจะส่งคืนค่าเท็จ คุณสามารถใช้มันเพื่อประหยัดเวลาของคุณ

//Object on which we want to test
var foo = {
    bar: {
        bik: {
            baz: 'Hello world'
        }
    }
};


/*
USE: To get value from the object using it properties supplied (Deeper),
    if found it will return the property value if not found then will return false

You can use this function in two ways
WAY - 1:
Passing an object as parameter 1 and array of the properties as parameter 2
EG: getValueFromObject(foo, ['bar', 'bik', 'baz']);
WAY - 2: (This will work only if, your object available in window object)
Passing an STRING as parameter 1(Just similarly how we retrieve value form object using it's properties - difference is only the quote)
EG: getValueFromObject('foo.bar.bik.baz');
*/
function getValueFromObject(object, properties) {
    if(typeof(object) == 'string') {            //Here we extract our object and it's properties from the string
        properties = object.split('.');
        object = window[properties[0]];
        if(typeof(object) == 'undefined') {
            return false;
        }
        properties.shift();
    }
    var property = properties[0];
    properties.shift();
    if(object != null && typeof(object[property]) != 'undefined') {
        if(typeof(object[property]) == 'object') {
            if(properties.length != 0) {
                return getValueFromObject(object[property], properties);    //Recursive call to the function
            } else {
                return object[property];
            }
        } else {
            return object[property];
        }
    } else {
        return false;
    }
}
console.log(getValueFromObject('fooo.bar.bik.baz'));        //false
console.log(getValueFromObject('foo.bar.bik.baz'));         //Hello world
console.log(getValueFromObject('foo'));                     //false
console.log(getValueFromObject('foo.bar.bik'));             //returns an object { baz: 'Hello World' }
console.log(getValueFromObject(foo, ['bar', 'bik']));       //returns an object { baz: 'Hello World' }
console.log(getValueFromObject(foo, ['bar', 'bik', 'baz']));//Hello world

1

หากคุณต้องการตรวจสอบว่ามีองค์ประกอบอยู่หรือไม่ให้ใช้รหัสต่อไปนี้:

if (object) {
  //if isset, return true
} else {
  //else return false
}

นี่คือตัวอย่าง:

function switchDiv() {
    if (document.querySelector("#divId")) {
        document.querySelector("#divId").remove();
    } else {
        var newDiv = document.createElement("div");
        newDiv.id = "divId";
        document.querySelector("body").appendChild(newDiv);
    }
}

document.querySelector("#btn").addEventListener("click", switchDiv);
#divId {
    background: red;
    height: 100px;
    width: 100px;
    position: relative;
    
}
<body>
  <button id="btn">Let's Diiiv!</button>
</body>



0

คู่มือ PHP บอกว่า:

isset - ตรวจสอบว่าตัวแปรถูกตั้งค่าและไม่ใช่ NULL

และอินเทอร์เฟซแบบนี้:

bool isset ( mixed $var [, mixed $... ] )

พารามิเตอร์$varคือตัวแปรที่ต้องตรวจสอบ มันสามารถมีพารามิเตอร์จำนวนเท่าใดก็ได้

isset () ผลตอบแทนTRUEถ้า var NULLมีอยู่และมีค่าอื่นที่ไม่ใช่ FALSEมิฉะนั้น.

ตัวอย่างบางส่วน:

$foo = 'bar';
var_dump(isset($foo));        -> true

$baz = null;
var_dump(isset($baz));        -> false

var_dump(isset($undefined));  -> false

อย่างที่ทราบกันดีว่ามันเป็นไปไม่ได้ที่จะเขียนisset()ฟังก์ชันphp ที่เทียบเท่า ตัวอย่างเช่นเมื่อเราเรียกสิ่งนี้:

if (isset(some_var)) {

}

function issset() {
    // function definition
}

Uncaught ReferenceError: some_var is not defined at (file_name):line_numberทริกเกอร์ Javascript สิ่งที่สำคัญและน่าทึ่งเกี่ยวกับพฤติกรรมนี้คือเมื่อพยายามส่งผ่านตัวแปรที่ไม่มีอยู่ไปยังฟังก์ชั่นปกติจะเกิดข้อผิดพลาดขึ้น

แต่ใน PHP isset()นั้นไม่ใช่ฟังก์ชั่นปกติ แต่เป็นภาษาที่สร้างขึ้น นั่นหมายความว่าพวกเขาเป็นส่วนหนึ่งของภาษา PHP เองอย่าเล่นตามกฎของฟังก์ชั่นปกติและสามารถหลีกเลี่ยงข้อผิดพลาดสำหรับตัวแปรที่ไม่มีอยู่ได้ สิ่งนี้มีความสำคัญเมื่อพยายามคิดว่ามีตัวแปรอยู่หรือไม่ แต่ใน javscript มันก่อให้เกิดข้อผิดพลาดในสถานที่แรกพูดเรียกฟังก์ชั่นที่มีตัวแปรที่ไม่มีอยู่

ประเด็นของฉันคือเราไม่สามารถเขียนมันเป็นฟังก์ชั่น javscript ที่ให้ความสมดุล แต่เราสามารถทำสิ่งนี้ได้

if (typeof some_var !== 'undefined') {
   // your code here
}

ถ้าคุณต้องการผลเหมือนกันแน่นอน PHP ยังตรวจสอบได้ไม่แตกต่างกัน NULL

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

$baz = null;
var_dump(isset($baz));        -> false

ดังนั้นเราสามารถรวมสิ่งนี้ลงในจาวาสคริปต์แล้วมันมีลักษณะดังนี้:

if (typeof some_var !== 'undefined' && some_var !== null) {
   // your code here
}


0

โปรดใช้ความระมัดระวังใน ES6โซลูชันก่อนหน้านี้ทั้งหมดจะไม่ทำงานหากคุณต้องการตรวจสอบการประกาศของตัวแปร letและประกาศถ้าไม่ใช่

ตัวอย่าง

let myTest = 'text';

if(typeof myTest === "undefined") {
    var myTest = 'new text'; // can't be a let because let declare in a scope
}

คุณจะเห็นข้อผิดพลาด

Uncaught SyntaxError: ตัวระบุ 'myTest' ได้ถูกประกาศแล้ว

ทางออกคือการเปลี่ยนโดย var

var myTest = 'text'; // I replace let by a var

if(typeof myTest === "undefined") {
    var myTest = 'new text';
}

วิธีแก้ไขปัญหาอื่นหากคุณสามารถเปลี่ยนอนุญาตโดย var คุณต้องลบvarของคุณ

let myTest = 'text';

if(typeof myTest === "undefined") {
    myTest = 'new text'; // I remove the var declaration
}

-1
    isset('user.permissions.saveProject', args);

    function isset(string, context) {
        try {
            var arr = string.split('.');
            var checkObj = context || window;

            for (var i in arr) {
                if (checkObj[arr[i]] === undefined) return false;
                checkObj = checkObj[arr[i]];
            }

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