각 속성에는 0개 이상의 내부 속성(*ReadOnly, DontEnum, DontDelete 및 Internal**)이 있습니다. 태그로 생각할 수 있습니다. 속성에는 특별한 내부 속성이 있을 수도 있고 없을 수도 있습니다. 오늘 토론에서는 DontDelete에 관심이 있습니다.
변수와 함수가 선언되면 변수 개체(함수 코드의 활성화 개체 또는 전역 코드의) 전역 개체의 속성이 됩니다. 이러한 속성은 내부 속성 DontDelete가 생성됩니다. . 그러나 명시적/암시적으로 할당된 속성은 DontDelete를 생성하지 않습니다. 이것이 본질적으로 일부 속성은 삭제할 수 있지만 다른 속성은 삭제할 수 없는 이유입니다.
var GLOBAL_OBJECT = this;
/* 'foo'는 전역 개체의 속성이며 변수 선언에 의해 생성되므로 내부 속성이 DontDelete
따라서 삭제할 수 없습니다*/
var foo = 1; delete foo; // false typeof foo; // "number" /* 'bar
'는 전역 개체의 속성이고 변수 선언을 통해 생성되므로 DontDelete 하위
가 있으므로 삭제할 수 없습니다*/
function bar() {}; delete bar; // false typeof bar; // "function"
/* 'baz'도 속성입니다. 전역 개체의
그러나 속성 할당에 의해 생성되므로 DontDelete가 없습니다.
이것이 삭제될 수 있는 이유입니다. 이 모든 일이 발생하는 이유는 다음과 같습니다. 속성의 특별한 내부 속성은 속성의 여부를 제어합니다. 삭제될 수 있습니다. 참고: 내장 개체의 일부 속성에는 내부 속성 DontDelete가 있으므로 삭제할 수 없습니다. 특수 인수 변수(우리가 알고 있듯이 활성화된 개체의 속성)에는 모든 함수 인스턴스의 길이(반환 매개 변수 길이) 속성도 있습니다. DontDelete:
GLOBAL_OBJECT.baz = "baz"; delete GLOBAL_OBJECT.baz; // true typeof GLOBAL_OBJECT.baz; // "undefined"
(function() { //不能删除'arguments',因为有DontDelete delete arguments; // false; typeof arguments; // "object" //也不能删除函数的length,因为有DontDelete function f() {}; delete f.length; // false; typeof f.length; // "number" }) ();
(function(foo,bar) { delete foo; // false foo; // 1 delete bar; // false bar; // "bah" }) (1,"bah");
참고: 내부 속성은 속성이 생성될 때 결정되며 후속 할당 프로세스에서는 기존 속성의 내부 속성을 변경하지 않습니다. 이 차이점을 이해하는 것이 중요합니다.
var GLOBAL_OBJECT = this; /* 通过变量声明生成全局对象的属性,拥有DontDelete */ var foo = 1; /* 通过未声明的变量赋值生成全局对象的属性,没有DontDelete */ bar = 2; delete foo; // false delete bar; // true
요약:
속성에는 내부 속성이 있으며 그 중 하나는 DontDelete가 속성을 삭제할 수 있는지 여부를 결정하는 역할을 담당합니다.
전역 코드 또는 함수 코드의 변수 및 함수 선언은 모두 DontDelete를 사용하여 속성을 생성합니다.
는 자신의 멤버만 삭제할 수 있습니다.
VAR에서 선언한 전역 변수만 삭제
ps: Javascript의 삭제 연산자
Delete는 Javascript 언어에서 덜 자주 사용되는 작업 중 하나이지만 때로는 삭제 또는 지우기 작업을 수행해야 할 때 삭제 작업이 필요합니다. 이번 글에서는 사용법과 작동 원리에 대해 알아보겠습니다.
삭제의 목적은 무엇인가를 삭제하는 것입니다. 보다 구체적으로 다음 예와 같이 객체의 속성을 삭제합니다.
/* 'foo'创建的同时生成DontDelete */ function foo() {}; /* 之后的赋值过程不改变已有属性的内部属性,DontDelete仍然存在 */ foo = 1; delete foo; // false; typeof foo; // "number" /* 但赋值一个不存在的属性时,创建了一个没有内部属性的属性,因此没有DontDelete */ this.bar = 1; delete bar; // true; typeof bar; // "undefined"
var Benjamin = { "name": "zuojj", "url" : "//m.sbmmt.com" }; delete Benjamin.name; //Outputs: Object { url: "//m.sbmmt.com" } console.log(Benjamin);
var benjamin = "//m.sbmmt.com"; delete benjamin; //Outputs: "//m.sbmmt.com" console.log(benjamin);
삭제 연산자에도 반환 값이 있습니다. 속성 삭제에 성공하면 속성을 쓸 수 없어 삭제할 수 없으면 false를 반환하거나 if를 반환합니다. 엄격 모드에서.
// Because var isn't used, this is a property of window benjamin = "php"; delete window.benjamin; // ReferenceError: benjamin is not defined console.log(benjamin);
언제 삭제 연산자를 사용해야 할지 모를 수도 있습니다. 대답은 객체에서 속성을 정말로 제거하고 싶을 때마다입니다.
var benjamin = { "name": "zuojj", "url" : "//m.sbmmt.com" }; var nameDeleted = delete benjamin.name; // Outputs: true console.log(nameDeleted); "use strict"; var benjamin_ = "zuojj"; //Outputs: Uncaught SyntaxError: Delete of an unqualified identifier in strict mode. delete benjamin_;
// Outputs: Object { name: null, url: "//m.sbmmt.com" } console.log(benjamin);
同时,像in和for in 循环运算将不会报告null属性的存在,如果你使用个对象,可能使用这些方法来检查一个对象,你可能想确保你真正删除任何不需要的属性。
最后,你应该记住,删除并没有破坏属性的值,仅仅属性本身,看下面的例子:
var name = "zuojj", benjamin = {}; benjamin.name = name; delete benjamin.name; //Outputs: "zuojj" console.log(name);
这里,name和benjamin.name映射到相同的值,真如你所看到的,删除benjamin.name并不会影响name.
위 내용은 js의 삭제 및 삭제 연산자는 무엇입니까? 및 사용예 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!