PHP에서는 할 수 있습니다 if(isset($array['foo'])) { ... }
. JavaScript에서는 종종 if(array.foo) { ... }
같은 작업을 수행하지만, 정확히 같은 문장은 아닙니다. 조건은 다음과 같은 경우에도 거짓으로 평가됩니다.array.foo
존재하지만 false
또는0
(그리고 아마도 다른 값들도) 입니다.
PHP와 완벽하게 동등한 것은 무엇입니까? isset
JavaScript에서 ?
넓은 의미에서, 존재하지 않는 변수, 값이없는 변수 등에 대한 JavaScript의 처리에 대한 일반적이고 완전한 가이드는 편리합니다.
답변
나는 일반적으로 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
이 메소드는 obj
form을 상속 하기 때문에 프로토 타입 체인에 정의됩니다 Object.prototype
.
답변
오래된 스레드이지만 이에 상응하는 새로운 방법이 있습니다. isset()
.
ESNext (2019 년 12 월 4 일)
두 가지 새로운 구문을 통해 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에서는 어떤 깊이에서든 변수를 참조 할 수 있습니다. 배열로 배열이 아닌 항목에 액세스하려고해도 단순 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
결론
다른 모든 답변-대부분 실행 가능하지만 …
- 변수가 정의되지 않았는지 확인하고 일부 사용 사례에는 적합하지만 여전히 오류가 발생할 수 있다고 확인한다고 가정하십시오.
- 최상위 속성에만 액세스하려고한다고 가정 해 봅시다.
isset()
예를 들어 PHP에 비해 덜 이상적인 접근 방식을 사용하도록하십시오.isset(some, 'nested.deeper.value')
eval()
어떤 작품을 사용 하지만 개인적으로 피하십시오
나는 그것을 많이 덮었다 고 생각합니다. 내 대답에는 내가 관련이 있지만 질문의 일부가 아니기 때문에 다루지 않는 몇 가지 사항이 있습니다. 그러나 필요한 경우 수요에 따라보다 기술적 측면에 대한 링크로 답변을 업데이트 할 수 있습니다.
나는 이것에 많은 시간을 보냈으므로 사람들이 도움이되기를 바랍니다.
읽어 주셔서 감사합니다!
답변
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
답변
if (!('foo' in obj)) {
// not set.
}
답변
//
// 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;
}
//
//
답변
이 간단한 솔루션은 작동하지만 심도있는 오브젝트 검사에는 적합하지 않습니다.
function isset(str) {
return window[str] !== undefined;
}
답변
필자는 항상이 일반 함수를 사용하여 기본 변수와 배열 및 객체에서 errrors를 방지합니다.
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