답변:
delete
연산자는 객체 속성을 제거한다. 변수를 제거 할 수 없습니다. 따라서 질문에 대한 답변은 전역 변수 또는 속성이 어떻게 정의되는지에 달려 있습니다.
(1)로 만든 경우 var
삭제할 수 없습니다.
예를 들면 다음과 같습니다.
var g_a = 1; //create with var, g_a is a variable
delete g_a; //return false
console.log(g_a); //g_a is still 1
(2)없이 생성 var
하면 삭제할 수 있습니다.
g_b = 1; //create without var, g_b is a property
delete g_b; //return true
console.log(g_b); //error, g_b is not defined
var
이 경우 g_a
ECMAScript 사양 이 현재 범위에 첨부 된 " VariableEnvironment "라고 부르는 참조 에 생성됩니다 . 이는 함수 var
내부 를 사용하는 경우 함수 실행 컨텍스트 일 수 있습니다 (좀 더 복잡 할 수 있음) 당신이 고려할 때 let
) 또는 "글로벌"코드의 경우에 VariableEnvironment는 전역 객체 (종종 부착 window
).
VariableEnvironment 에 대한 참조는 일반적으로 삭제할 수 없습니다. ECMAScript 10.5 에 자세히 설명 된 프로세스 는이를 자세히 설명하지만 코드가 eval
컨텍스트 (대부분의 브라우저 기반 개발 콘솔에서 사용)에서 실행 var
되지 않으면 선언 된 변수는 사용할 수 없다고 말할 수 있습니다. 삭제하십시오.
var
var
키워드 를 사용하지 않고 이름에 값을 할당하려고 할 때 Javascript는 ECMAScript 사양에서 " LexicalEnvironment "라고 부르는 이름으로 지정된 참조를 찾으려고합니다 . 주요 차이점은 LexicalEvironment 가 중첩되어 있다는 것입니다. 즉 LexicalEnvironment 는 상위가 있습니다 ( 무엇 인 ECMAScript 사양 통화 "외부 환경 참조")와에 javscript가에 대한 참조를 찾는 데 실패하면 LexicalEenvironment , 그것은 부모에 보이는 LexicalEnvironment 에 설명 된대로 ( 10.3.1 및 10.2.2.1 ). 최고 수준의 LexicalEnvironment 는 " 글로벌 환경입니다."은 참조가 전역 객체의 속성이라는 점에서 전역 객체에 바인딩됩니다. 따라서 var
현재 범위 나 외부 범위에서 키워드를 사용하여 선언되지 않은 이름에 액세스하려고하면 Javascript는 결국 속성을 가져옵니다. 의 window
객체가 참조 역할을합니다. 우리가 전에 배운대로, 개체의 속성은 삭제 될 수 있습니다.
var
선언은 "호이 스팅" 되었다는 것을 기억하는 것이 중요합니다. 즉, var
선언문 에서 수행 될 수있는 값 초기화가 아닌-선언문이있는 영역의 시작 부분에서 항상 발생한 것으로 간주됩니다. . 따라서 다음 코드 a
에서 VariableEnvironment 의 참조 이며 window
속성이 아니며 그 값은 10
코드의 끝에 있습니다.
function test() { a = 5; var a = 10; }
위의 설명은 "엄격 모드"가 활성화되지 않은 경우입니다. "엄격 모드"를 사용하는 경우 조회 규칙이 약간 다르며 "엄격 모드"없이 창 속성으로 해결 된 어휘 참조는 "엄격 모드"에서 "선언되지 않은 변수"오류를 발생시킵니다. 나는 이것이 어디에 지정되어 있는지 이해하지 못했지만 브라우저의 작동 방식.
var a = 1; delete window.a; console.log(a);
는 1을 표시합니다.
1
가 모든 브라우저에서 올바르게 출력 됩니다. 실제 문서에서 실행하면 코드 예제가 정확합니다. 답변을 올바른 것으로 선택했지만 설명 window.a = 1; delete window.a;
및 메커니즘 을 포함하도록 답변을 편집 할 수 있으면 감사하겠습니다 . 당신이 신경 쓰지 않으면 나는 그렇게 할 수 있습니다.
@ scunlife의 답변은 효과가 있지만 기술적으로는
delete window.some_var;
대상이 객체 속성이 아닌 경우 delete는 작동하지 않는 것으로 간주됩니다. 예를 들어
(function() {
var foo = 123;
delete foo; // wont do anything, foo is still 123
var bar = { foo: 123 };
delete bar.foo; // foo is gone
}());
그러나 전역 변수는 실제로 창 개체의 멤버이므로 작동합니다.
프로토 타입 체인이 관련된 경우 delete를 사용하면 프로토 타입이 아닌 대상 객체에서 속성 만 제거되므로 더 복잡해집니다. 예를 들어
function Foo() {}
Foo.prototype = { bar: 123 };
var foo = new Foo();
// foo.bar is 123
foo.bar = 456;
// foo.bar is now 456
delete foo.bar;
// foo.bar is 123 again.
그러므로 조심 해주시길 바랍니다.
편집 : 내 대답은 다소 정확하지 않습니다 (끝의 "오해"참조). 링크는 모든 세부 사항을 설명하지만 요약은 브라우저와 삭제하는 객체에 따라 큰 차이가있을 수 있습니다. delete object.someProp
일반적으로 안전해야합니다 object !== window
. var
올바른 환경에서 할 수 는 있지만 선언 된 변수를 삭제하는 데 여전히 사용하지 않습니다 .
var
은 변수가로 선언 된 경우입니다 eval
.
없이 변수를 암시 적으로 선언하는 var
경우 올바른 방법을 사용하는 것 delete foo
입니다.
그러나 삭제 한 후에 추가와 같은 작업에서 이것을 사용하려고 ReferenceError
하면 선언되지 않은 정의되지 않은 식별자에 문자열을 추가 할 수 없으므로 a 가 발생합니다. 예:
x = 5;
delete x
alert('foo' + x )
// ReferenceError: x is not defined
일부 상황에서는 false, null 또는 undefined로 지정하여 선언되어 이러한 유형의 오류가 발생하지 않도록하는 것이 더 안전 할 수 있습니다.
foo = false
참고 인 ECMAScript에서 그 null
, false
, undefined
, 0
, NaN
, 또는 ''
모두가 평가하는 것입니다 false
. 그냥 확실히 당신이 사용 해달라고 할 !==
연산자를 대신 !=
형식 논리 값에 대한 검사 및 그렇지 신원 확인을 할 때 (그래서 null
것 == false
와 false == undefined
).
또한 delete
참조를 "삭제"하는 것이 아니라 객체의 속성 만 직접 참조하십시오.
bah = {}, foo = {}; bah.ref = foo;
delete bah.ref;
alert( [bah.ref, foo ] )
// ,[object Object] (it deleted the property but not the reference to the other object)
변수를 선언 한 경우 var
삭제할 수 없습니다.
(function() {
var x = 5;
alert(delete x)
// false
})();
코뿔소에서 :
js> var x
js> delete x
false
다음과 같은 미리 정의 된 속성을 삭제할 수도 없습니다 Math.PI
.
js> delete Math.PI
false
delete
당신이 충분히 관심이 있다면 읽어야 할 언어와 마찬가지로 이상한 예외가 있습니다.
some_var = null;
//or remove it..
delete some_var;
delete
.
delete
속성에 대해서만 작동합니다. null
변수를 설정하면 여전히 존재합니다.
TLDR는 (없이 간단한 변수를 정의 var
, let
, const
)와 함께 삭제 될 수 있습니다 delete
. , - 를 사용 var
하면 -와 함께 또는 함께 삭제할 수 없습니다 .let
const
delete
Reflect.deleteProperty
크롬 55 :
simpleVar = "1";
"1"
delete simpleVar;
true
simpleVar;
VM439:1 Uncaught ReferenceError: simpleVar is not defined
at <anonymous>:1:1
(anonymous) @ VM439:1
var varVar = "1";
undefined
delete varVar;
false
varVar;
"1"
let letVar = "1";
undefined
delete letVar;
true
letVar;
"1"
const constVar="1";
undefined
delete constVar;
true
constVar;
"1"
Reflect.deleteProperty (window, "constVar");
true
constVar;
"1"
Reflect.deleteProperty (window, "varVar");
false
varVar;
"1"
Reflect.deleteProperty (window, "letVar");
true
letVar;
"1"
FF Nightly 53.0a1은 동일한 동작을 보여줍니다.
var
사례 만 언급했습니다 . 나에 관해서는 테스트하고 공유 let
하고 const
사례도 흥미로 웠습니다 . 그러나 참고해 주셔서 감사합니다. 다음에 더 구체적으로 노력할 것입니다.
ECMAScript 2015는 Reflect API를 제공합니다. Reflect.deleteProperty () 사용 하여 객체 속성을 삭제할 수 있습니다 .
Reflect.deleteProperty(myObject, 'myProp');
// it is equivalent to:
delete myObject.myProp;
delete myObject['myProp'];
전역 window
객체의 속성을 삭제하려면
Reflect.deleteProperty(window, 'some_var');
경우에 따라 속성을 구성 할 수없는 경우 속성을 삭제할 수 없으며이 함수는 delete 연산자false
와 함께 반환 됩니다 . 다른 경우에는 다음을 반환합니다 .true
Object.defineProperty(window, 'some_var', {
configurable: false,
writable: true,
enumerable: true,
value: 'some_val'
});
var frozen = Object.freeze({ myProperty: 'myValue' });
var regular = { myProperty: 'myValue' };
var blank = {};
console.log(Reflect.deleteProperty(window, 'some_var')); // false
console.log(window.some_var); // some_var
console.log(Reflect.deleteProperty(frozen, 'myProperty')); // false
console.log(frozen.myProperty); // myValue
console.log(Reflect.deleteProperty(regular, 'myProperty')); // true
console.log(regular.myProperty); // undefined
console.log(Reflect.deleteProperty(blank, 'notExistingProperty')); // true
console.log(blank.notExistingProperty); // undefined
엄격 모드에서 실행될 때 deleteProperty
기능과 delete
연산자 에는 차이가 있습니다 .
'use strict'
var frozen = Object.freeze({ myProperty: 'myValue' });
Reflect.deleteProperty(frozen, 'myProperty'); // false
delete frozen.myProperty;
// TypeError: property "myProperty" is non-configurable and can't be deleted
변수는 단순한 속성과 달리 속성 [[Configurable]] 을 가지므로 delete 연산자 를 통해 변수를 제거 할 수 없습니다 . 그러나이 규칙에 영향을 미치지 않는 하나의 실행 컨텍스트가 있습니다. 그것은 인 평가의 컨텍스트 :이 [구성] 속성이 변수에 대해 설정되지 않는다.
delete 연산자는 객체에서 속성을 제거합니다.
delete object.property
delete object['property']
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/delete
질문에 따르면 다음 중 하나가 필요합니다.
delete some_var;
delete window.some_var;
delete window['some_var'];
모든 사람이 작성한 것 외에도 delete
부울 을 반환 한다는 점에 유의하십시오 . 삭제 성공 여부를 알려줍니다.
Chrome에서 테스트 한 결과를 제외하고 모든 let
것이 삭제되었습니다. delete
반환 되면 true
실제로 제거했습니다.
implicit_global = 1;
window.explicit_global = 1;
function_set = function() {};
function function_dec() { };
var declared_variable = 1;
let let_variable = 1;
delete delete implicit_global; // true, tested on Chrome 52
delete window.explicit_global; // true, tested on Chrome 52
delete function_set; // true, tested on Chrome 52
delete function_dec; // true, tested on Chrome 52
delete declared_variable; // true, tested on Chrome 52
delete let_variable; // false, tested on Chrome 78
let
바르하고 const
이 변수가 삭제하지만, 그렇지 않은 수단해야한다는 것을 사실 반환 바르. Chrome과 FF에서 모두 확인할 수 있습니다. Chrome이 아닌 동안 FF가 올바른 값을 반환하는 것 같습니다. 따라서 실제로 신뢰할 수 있는지 확신하지 마십시오. let letVar = "1"; undefined delete letVar; true letVar "1" typeof letVar; "string" const constVar="1"; undefined delete constVar; true constVar; "1" typeof constVar; "string"
delete
운영자의 작동 방식 과 이유를 설명 합니다. 그러나 왜 문자 그대로 상황을 함수로 묶는 지 설명하지 않습니다. 안타깝게도 그러나 변수와 관련하여 상황이 훨씬 명확 해지기 시작합니다.
변수를 처음 사용할 때 변수를 선언 한 경우 (var x;로) 삭제할 수 없습니다. 그러나 변수 x가 선언없이 스크립트에 처음 나타난 경우 delete 연산자 (delete x;)를 사용하면 배열의 요소를 삭제하거나 객체의 속성을 삭제하는 것과 매우 유사한 변수가 삭제됩니다. .
조금 혼란 스러워요. 변수 값이 다른 스크립트로 전달되지 않는 것이라면 범위에서 변수를 삭제할 필요가 없습니다. 변수를 무효화 한 다음 null인지 아닌지 명시 적으로 확인하십시오. 범위에서 변수를 삭제하는 데 어려움이있는 이유는 무엇입니까? 이 서버는 무효화 할 수없는 목적이 무엇입니까?
foo = null;
if(foo === null) or if(foo !== null)
null
트리거하지 않으려 는 값에 대한 동작 이 있습니다.
<?php if(isset($_POST['somevariable']) unset($_POST['somevariable']); if(isset($_GET['somevariable']) unset($_GET['somevariable']); ?>
var
함수 외부 사용 )는 웹 브라우저에서 "글로벌 객체"의 속성입니다window
. 따라서-var a = 1; delete window.a; console.log(a);
변수를 성공적으로 삭제하고 마지막 줄에서 참조 오류가 발생합니다.