Eski iş parçacığı, ama eşdeğer çalıştırmak için yeni yollar vardır isset()
.
ESNext (Aşama 4 Aralık 2019)
İki yeni sözdizimi, isset()
işlevsellik kullanımını büyük ölçüde basitleştirmemizi sağlar:
Lütfen dokümanları okuyun ve tarayıcı uyumluluğuna dikkat edin.
Önceki Cevap
Açıklama için aşağıya bakın. Not StandardJS sözdizimini kullanıyorum
Örnek Kullanım
// 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
Yanıtlama İşlevi
/**
* 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
}
}
açıklama
PHP
PHP'de herhangi bir değişkene herhangi bir derinlikte başvurabileceğinizi unutmayın - dizi olarak dizi olmayan bir diziye erişmeye çalışmak bile basit true
veya 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'te, bu özgürlüğe sahip değiliz, aynısını yaparsak her zaman bir hata alırız çünkü JS, işlevimize deeper
sarmadan önce değerine hemen erişmeye çalışıyor 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
Daha başarısız alternatifler:
// 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
Ve artık hızlı olabilecek bazı çalışma alternatifleri:
// 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
Sonuç
Diğer cevapların hepsi - çoğu uygulanabilir olsa da ...
- Yalnızca değişkenin tanımlanmamış olup olmadığını kontrol ettiğinizi varsayalım.
- Yalnızca üst düzey bir mülke erişmeye çalıştığınızı varsayalım.
- Sizi PHP'lere göre daha az ideal bir yaklaşım kullanmaya zorlar,
isset()
ör.isset(some, 'nested.deeper.value')
eval()
Hangisinin işe yaradığını kullanın ama şahsen kaçınıyorum
Sanırım birçoğunu ele aldım. Cevabımda değindiğim bazı hususlar var, çünkü konuyla ilgili olsalar da sorunun bir parçası değiller. Gerekirse, cevabımı talebe bağlı olarak daha teknik yönlerden bazılarıyla güncelleyebilirim.
Waaay bu kadar çok zaman geçirdim umarım insanlara yardımcı olur.
Okuduğunuz için teşekkürler!