等同于JavaScript isset()

在PHP中可以做到if(isset($array['foo'])) { ... }。在JavaScript中,您通常会使用if(array.foo) { ... }相同的方法,但这并非完全相同。如果array.foo确实存在但为falseor 0(或可能还有其他值),则条件还将评估为false 。


issetJavaScript 与PHP的完美等同是什么?


从更广泛的意义上讲,有关JavaScript处理不存在的变量,没有值的变量等的通用完整指南将很方便。


茅侃侃
浏览 402回答 3
3回答

海绵宝宝撒

使用旧线程,但这是运行等效线程的新方法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 objectslet some = { nested: { value: 'hello' } }// More tests that never throw an errorisset(() => some) // trueisset(() => some.nested) // trueisset(() => some.nested.value) // trueisset(() => some.nested.deeper.value) // false// Less compact but still viable except when trying to use `this` contextisset(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中,您可以引用任何深度的任何变量-甚至尝试访问非数组,因为数组将返回简单true或false:// Referencing an undeclared variableisset($some); // false$some = 'hello';// Declared but has no depth(not an array)isset($some); // trueisset($some['nested']); // false$some = ['nested' => 'hello'];// Declared as an array but not with the depth we're testing forisset($some['nested']); // trueisset($some['nested']['deeper']); // falseJS在JavaScript中,我们没有那种自由度,如果这样做,我们总是会报错,因为JS deeper 在将其包装到isset()函数中之前立即尝试访问它的值,因此...// Common pitfall answer(ES6 arrow function)const isset = (ref) => typeof ref !== 'undefined'// Same as abovefunction isset (ref) { return typeof ref !== 'undefined' }// Referencing an undeclared variable will throw an error, so no luck hereisset(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 variableisset(some) // true// Now trying to see if we have a top level property, still validisset(some.nested) // false// But here is where things fall apart: trying to access a deep property// of a complex object; it will throw an errorisset(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 errorsome.nested.deeper.hasOwnProperty('value') // Error//   ^^^^^^ undefinedObject.hasOwnProperty('value', some.nested.deeper) // Error//                                  ^^^^^^ undefined// Same goes for typeoftypeof some.nested.deeper !== 'undefined' // Error//          ^^^^^^ undefined还有一些可以快速获得冗余的可行替代方案:// Wrap everything in try...catchtry { isset(some.nested.deeper) } catch (e) {}try { typeof some.nested.deeper !== 'undefined' } catch (e) {}// Or by chaining all of the isset which can get longisset(some) && isset(some.nested) && isset(some.nested.deeper) // false//                        ^^^^^^ returns false so the next isset() is never run结论所有其他答案-尽管大多数答案都是可行的...假设您仅检查变量是否未定义,这在某些用例中可以使用,但仍然会引发错误假设您仅尝试访问顶级属性,这对于某些用例来说也很好强迫您使用相对于PHP而言不太理想的方法,isset()例如isset(some, 'nested.deeper.value')使用eval()哪种有效,但我个人避免使用我想我涵盖了很多。我在回答中提出了一些要点,但我没有涉及,因为它们虽然相关,但不是问题的一部分。不过,如果需要的话,我可以根据需要通过指向一些更多技术方面的链接来更新我的答案。我花了很多时间在此上,所以希望它可以帮助人们。谢谢您的阅读!
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript