javascript_javascript 기술의 연산자 삭제 및 삭제

WBOY
풀어 주다: 2016-05-16 15:32:14
원래의
1351명이 탐색했습니다.

그렇다면 객체의 속성을 삭제할 수 있는 이유는 무엇입니까?

var x = { a: 1 };
delete x.a; // true
x.a; // undefined
로그인 후 복사

하지만 변수를 삭제할 수는 없습니다.

var x = 1;
delete x; // false;
x; // 1
로그인 후 복사

함수를 삭제할 수 없습니다.

function x() {};
delete x; // false;
typeof x; // "function"
로그인 후 복사

참고: 삭제는 속성을 삭제할 수 없는 경우에만 false를 반환합니다.

각 속성에는 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가 없습니다

그래서 제거가 가능합니다*/

GLOBAL_OBJECT.baz = "baz";
delete GLOBAL_OBJECT.baz; // true
typeof GLOBAL_OBJECT.baz; // "undefined"
로그인 후 복사

1.5, 내장 및 DontDelete | 내장 및 DontDelete

이것이 바로 이 모든 일이 일어나는 이유입니다. 속성의 특별한 내부 속성이 속성 삭제 가능 여부를 제어합니다. 참고: 내장 개체의 일부 속성에는 내부 속성 DontDelete가 있으므로 삭제할 수 없습니다. 특수 인수 변수(우리가 알고 있듯이 활성화된 개체의 속성)에는 모든 함수 인스턴스의 길이(반환 매개 변수 길이) 속성도 있습니다. 삭제하지 마세요:

(function() {
  //不能删除'arguments',因为有DontDelete
  delete arguments; // false;
  typeof arguments; // "object"

  //也不能删除函数的length,因为有DontDelete
  function f() {};
  delete f.length; // false;
  typeof f.length; // "number"
}) ();

로그인 후 복사

함수 인수와 관련된 속성에도 DontDelete가 있으므로 삭제할 수 없습니다.

(function(foo,bar) {
  delete foo; // false
  foo; // 1

  delete bar; // false
  bar; // "bah"
}) (1,"bah");
로그인 후 복사

1.6. 선언되지 않은 변수 할당

선언되지 않은 변수 할당은 해당 속성이 범위 체인의 다른 곳에서 발견되지 않는 한 전역 객체의 속성이 된다는 점을 기억하실 것입니다. 이제 우리는 속성 할당과 변수 선언의 차이점을 이해합니다. 후자는 DontDelete를 생성하고 전자는 생성하지 않습니다. 이것이 바로 선언되지 않은 변수 할당을 삭제할 수 있는 이유입니다.

var GLOBAL_OBJECT = this;

/* 通过变量声明生成全局对象的属性,拥有DontDelete */
var foo = 1;

/* 通过未声明的变量赋值生成全局对象的属性,没有DontDelete */
bar = 2;
delete foo; // false
delete bar; // true

로그인 후 복사

참고: 내부 속성은 속성이 생성될 때 결정되며 후속 할당 프로세스에서는 기존 속성의 내부 속성을 변경하지 않습니다. 이 차이점을 이해하는 것이 중요합니다.

/* 'foo'创建的同时生成DontDelete */
function foo() {};
/* 之后的赋值过程不改变已有属性的内部属性,DontDelete仍然存在 */
foo = 1;
delete foo; // false;
typeof foo; // "number"
/* 但赋值一个不存在的属性时,创建了一个没有内部属性的属性,因此没有DontDelete */
this.bar = 1;
delete bar; // true;
typeof bar; // "undefined"
로그인 후 복사

요약:

변수 및 함수 선언은 활성화 전역 객체의 속성입니다.

속성에는 내부 속성이 있으며, 그 중 하나인 DontDelete는 속성 삭제 가능 여부를 결정하는 역할을 담당합니다.

전역 코드 또는 함수 코드의 변수 및 함수 선언은 모두 DontDelete를 사용하여 속성을 생성합니다.

함수 매개변수도 활성화 개체의 속성이며 DontDelete를 갖습니다.

개체의 속성 삭제: delete object.member

자신의 회원만 삭제할 수 있습니다

var로 선언된 전역 변수만 삭제할 수 없습니다

창이나 창[""]을 사용하여 추가된 전역 멤버는 삭제할 수 있습니다

ps: Javascript의 삭제 연산자

삭제는 Javascript 언어에서 덜 자주 사용되는 작업 중 하나이지만 때로는 삭제 또는 지우기 작업을 수행해야 할 때 삭제 작업이 필요합니다. 이번 글에서는 사용법과 작동 원리에 대해 알아보겠습니다.

삭제의 목적은 무엇인가를 삭제하는 것입니다. 보다 구체적으로는 다음 예와 같이 개체의 속성을 삭제합니다.

var Benjamin = {
  "name": "zuojj",
  "url" : "http://www.zuojj.com"
};
delete Benjamin.name;
//Outputs: Object { url: "http://www.zuojj.com" }
console.log(Benjamin);
로그인 후 복사

삭제 연산자는 다음 예와 같이 일반 변수를 삭제하지 않습니다.

var benjamin = "http://www.zuojj.com";
delete benjamin;
//Outputs: "http://www.zuojj.com"
console.log(benjamin);
로그인 후 복사

그러나 "전역 변수"는 실제로 전역 개체(브라우저의 창) 개체의 속성이므로 제거할 수 있습니다.

// Because var isn't used, this is a property of window
benjamin = "zuojj";
delete window.benjamin;
// ReferenceError: benjamin is not defined
console.log(benjamin);
로그인 후 복사

삭제 연산자에도 반환 값이 있습니다. 속성 삭제에 성공하면 true를 반환합니다. 속성이 쓰기 가능하지 않아 삭제할 수 없으면 false를 반환합니다. 그렇지 않으면 오류가 발생합니다. 엄격 모드.

var benjamin = {
  "name": "zuojj",
  "url" : "http://www.zuojj.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_;
로그인 후 복사

你可能不知道在什么情况下使用删除运算符。答案是,只要你真的想从对象中删除一个属性。

有的时候,Javascript开发不是删除一个属性,而是把这个属性值设置为null.像下面这样:

var benjamin = {
  "name": "zuojj",
  "url" : "http://www.zuojj.com"
};
benjamin.name = null;
로그인 후 복사

虽然这有效地切断从原来的值的属性,但该属性本身仍然存在的对象上,你可以看到如下:

// Outputs: Object { name: null, url: "http://www.zuojj.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.

以上,就是我对delete运算符的概述,不妥之处,欢迎大家批评指正。

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿