JavaScript isset () 해당
PHP에서는 할 수 있습니다 if(isset($array['foo'])) { ... }
. JavaScript에서는 종종 if(array.foo) { ... }
같은 작업을 수행하지만 이것은 정확히 같은 문장이 아닙니다. 이 조건은 array.foo
존재하지만 false
또는 0
(그리고 아마도 다른 값들도) 존재 한다면 거짓으로 평가 될 것 입니다.
isset
JavaScript에서 PHP와 완전히 동등한 것은 무엇입니까 ?
넓은 의미에서, 존재하지 않는 변수, 값이없는 변수 등에 대한 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
연산자가 리턴합니다 .이 메소드는 form을 상속 하기 때문에 프로토 타입 체인에 정의됩니다 .true
toString
obj
Object.prototype
오래된 스레드이지만 여기에 동등한를 실행하는 새로운 방법이 있습니다 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
underscorejs 를 사용하는 경우 항상 사용합니다
if (!_.isUndefined(data) && !_.isNull(data)) {
//your stuff
}
이 솔루션은 저에게 효과적이었습니다.
function isset(object){
return (typeof object !=='undefined');
}
이것은 변수가 존재하는지 테스트하기위한 방탄 솔루션입니다.
var setOrNot = typeof variable !== typeof undefined ? true : false;
불행히도 단순히 함수로 캡슐화 할 수는 없습니다.
다음과 같은 일을 생각할 수 있습니다.
function isset(variable) {
return typeof variable !== typeof undefined ? true : false;
}
그러나 변수 variable
가 정의되지 않은 경우 존재하지 않는 변수를 함수에 전달할 수 없으므로 참조 오류가 발생 합니다.
잡히지 않은 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
int로서 undefined
값.
function isset(variable) {
try {
return typeof eval(variable) !== 'undefined';
} catch (err) {
return false;
}
}
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
html 블록이 존재하는지 여부를 확인하려면이 코드를 사용하고 있습니다.
if (typeof($('selector').html()) != 'undefined') {
// $('selector') is existing
// your code here
}
(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);
개별 변수 (모두 존재하지 않는 변수) 또는 객체 속성 (존재하지 않는 속성)과 함께 작동 할 수 있습니다. 그리고 PHP보다 7 문자 만 더 isset
있습니다.
객체 경로를 문자열로 제공하면이 문자열을 경로 hasOwnProperty
로 나누고 각 반복마다 객체 자체를 덮어 쓰면서 각 단계에서 확인할 수 있습니다 .
ES6 환경에서 코딩하는 경우이 stackoverflow 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
);
if (var) {
// This is the most concise equivalent of Php's isset().
}
변수와 객체를 확인할 수있는 함수를 사용합니다. jQuery로 작업하기 매우 편리
function _isset (variable) {
if(typeof(variable) == "undefined" || variable == null)
return false;
else
if(typeof(variable) == "object" && !variable.length)
return false;
else
return true;
};
객체의 더 깊은 속성에 액세스 할 때 실제로 문제가되었으므로 존재하는 경우 속성 값을 반환하는 함수를 만들었습니다. 그렇지 않으면 false를 반환합니다. 시간을 절약하기 위해 사용할 수 있습니다.
//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
요소가 존재하는지 확인하려면 다음 코드를 사용하십시오.
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>
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
이것을 염두에두고, 분명히 PHP isset()
기능 과 똑같은 것을 쓸 수는 없습니다 . 예를 들어 다음과 같이 호출하면
if (isset(some_var)) {
}
function issset() {
// function definition
}
자바 스크립트 트리거 Uncaught ReferenceError: some_var is not defined at (file_name):line_number
. 이 동작에서 중요하고 주목할만한 점은 존재하지 않는 변수를 일반 함수에 전달하려고하면 오류가 발생한다는 것입니다.
그러나 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
}
참고 URL : https://stackoverflow.com/questions/2281633/javascript-isset-equivalent
'Programing' 카테고리의 다른 글
JSON이란 무엇이며 왜 사용해야합니까? (0) | 2020.02.11 |
---|---|
Java에 .NET의 NotImplementedException과 같은 것이 있습니까? (0) | 2020.02.11 |
jQuery-텍스트 설명을 통해 선택 컨트롤의 선택된 값 설정 (0) | 2020.02.11 |
단위 테스트 명명 모범 사례 (0) | 2020.02.11 |
Git에서 처음 두 커밋을 스쿼시 하시겠습니까? (0) | 2020.02.11 |