cari
Rumahhujung hadapan webtutorial jsPengenalan kepada atribut dalaman dan padam operator dalam kemahiran js_javascript

Sebelum menerangkan Configurable, mari kita lihat dahulu soalan temu bual:

a = 1;
console.log( window.a ); // 1
console.log( delete window.a ); // true
console.log( window.a ); // undefined

var b = 2;
console.log( window.b ); // 2
console.log( delete window.b ); // false
console.log( window.b ); // 2

Daripada soalan di atas, kita dapat melihat dua perbezaan: apabila pembolehubah tidak diisytiharkan menggunakan var, ia boleh dipadamkan menggunakan kata kunci padam, dan nilai akan tidak ditentukan apabila diperoleh semula apabila pembolehubah diisytiharkan menggunakan var, Ia tidak boleh dipadam menggunakan padam, dan nilainya masih 2 apabila diambil.

1. padam operator

Apabila anda menggunakan padam untuk memadam pembolehubah atau atribut, ia mengembalikan benar jika pemadaman berjaya, jika tidak ia mengembalikan palsu. Seperti dalam contoh di atas, jika padam tidak boleh memadam pembolehubah a, ia akan mengembalikan palsu jika pemadaman berjaya memadam pembolehubah b, ia akan kembali benar.

Selain dua situasi di atas, terdapat pelbagai pembolehubah lain yang biasa digunakan yang boleh dipadamkan dengan pemadaman, dan beberapa yang tidak boleh dipadamkan. Jangan risau mengapa padam menghasilkan hasil seperti itu di sini kita hanya melihat nilai pulangannya:

Padamkan elemen dalam tatasusunan padam:

// 使用for~in是循环不到的,直接忽略到该元素
// 使用for()可以得到该元素,但是值是undefined
var arr = [1, 2, 3, 4];
console.log( arr );     	// [1, 2, 3, 4]
console.log( delete arr[2] );	// true,删除成功
console.log( arr );      	// [1, 2, undefined, 4]

Padam pembolehubah jenis fungsi:

// chrome 不能删除;火狐可以删除
function func(){
}
console.log( func );
console.log( delete func );
console.log( func );

Padam fungsi.panjang, iaitu bilangan parameter formal yang diperoleh:

function func1(a, b){
}
console.log( func1.length );   	// 2
console.log( delete func1.length );	// true,删除成功
console.log( func1.length );   	// 0

Padamkan pembolehubah yang biasa digunakan:

console.log( delete NaN );  	// false,删除失败
console.log( delete undefined );// false
console.log( delete Infinity );	// false
console.log( delete null );  	// true,删除成功

Padamkan prototaip dan bukannya memadamkan atribut pada prototaip:

function Person(){
}
Person.prototype.name = "蚊子";
console.log( delete Person.prototype );	// false,无法删除
console.log( delete Object.prototype );	// false

Apabila memadamkan panjang tatasusunan dan rentetan:

var arr = [1, 2, 3, 4];
console.log( arr.length );    	// 4
console.log( delete arr.length ); 	// false,删除失败
console.log( arr.length );    	// 4

var str = 'abcdefg';
console.log( str.length );    	// 7
console.log( delete str.length ); 	// false,删除失败
console.log( str.length );    	// 7

Apabila memadamkan atribut dalam obj:

var obj = {name:'wenzi', age:25};
console.log( obj.name );   	// wenzi
console.log( delete obj.name );	// true,删除成功
console.log( obj.name );   	// undefined
console.log( obj );      	// { age:25 }

Apabila memadamkan atribut dalam objek contoh, anda boleh melihat daripada output berikut bahawa apabila anda menggunakan padam untuk memadamkan atribut, hanya atribut objek contoh itu sendiri dipadamkan dan atribut pada prototaip tidak boleh dipadamkan anda memadamkannya sekali lagi, ia masih akan dipadamkan. Ia tidak boleh dipadamkan jika anda ingin memadamkan atribut atau kaedah atribut pada prototaip, anda hanya boleh memadamkannya: delete Person.prototype.name:

function Person(){
  this.name = 'wenzi';
}
Person.prototype.name = '蚊子';
var student = new Person();
console.log( student.name );    // wenzi
console.log( delete student.name ); // true,删除成功
console.log( student.name );    // 蚊子
console.log( delete student.name ); // true
console.log( student.name );    // 蚊子
console.log( delete Person.prototype.name );// true,删除成功
console.log( student.name );    // undefined

2. Sifat dalaman js

Dalam contoh di atas, beberapa pembolehubah atau atribut boleh dipadamkan dengan jayanya, manakala yang lain tidak boleh dipadamkan Jadi apakah yang menentukan sama ada pembolehubah atau atribut ini boleh dipadamkan.

ECMA-262 5th Edition mentakrifkan ciri ciri objek JS (digunakan dalam enjin JS, tidak boleh diakses secara langsung dari luar). Terdapat dua jenis sifat dalam ECMAScript: sifat data dan sifat aksesor.

2.1 Atribut data

Atribut data merujuk kepada lokasi yang mengandungi nilai data yang nilainya boleh dibaca atau ditulis Atribut ini mempunyai 4 sifat yang menerangkan kelakuannya:

  • [[boleh dikonfigurasikan]]: Menunjukkan sama ada ia boleh dipadamkan dan ditakrifkan semula menggunakan operator padam, atau sama ada ia boleh diubah suai sebagai atribut pengakses. Lalai adalah benar;
  • [[Enumberable]]: Menunjukkan sama ada atribut boleh dikembalikan melalui gelung untuk masuk. Lalai benar;
  • [[Boleh ditulis]]: Menunjukkan sama ada nilai atribut boleh diubah suai. Lalai benar;
  • [[Nilai]]: Mengandungi nilai data atribut ini. Nilai ini dibaca/ditulis. Lalai tidak ditentukan; contohnya, atribut nama ditakrifkan dalam objek instance di atas, dan nilainya ialah 'wenzi'
Untuk mengubah suai ciri lalai sifat objek (lalai adalah benar), anda boleh memanggil kaedah Object.defineProperty(), yang menerima tiga parameter: objek di mana harta itu terletak, nama harta dan objek deskriptor ( mestilah: boleh dikonfigurasikan, boleh dibilang, boleh ditulis dan nilai, satu atau lebih nilai boleh ditetapkan).

adalah seperti berikut:

var person = {};
Object.defineProperty(person, 'name', {
  configurable: false,	// 不可删除,且不能修改为访问器属性
  writable: false,		// 不可修改
  value: 'wenzi'			// name的值为wenzi
});
console.log( person.name);			// wenzi
console.log( delete person.name );	// false,无法删除
person.name = 'lily';
console.log( person.name );			// wenzi
Ia boleh dilihat bahawa tidak memadam atau menetapkan semula nilai person.name berkuat kuasa Ini kerana memanggil fungsi defineProperty mengubah suai ciri-ciri objek perlu diperhatikan bahawa apabila boleh dikonfigurasikan ditetapkan kepada palsu, defineProperty boleh tidak lagi digunakan untuk Ubah suai kepada benar (pelaksanaan akan melaporkan ralat: Ralat Jenis Tidak Ditangkap: Tidak boleh mentakrifkan semula sifat: nama);

2.2 Sifat pengakses

Ia terutamanya termasuk sepasang fungsi getter dan setter Apabila membaca atribut accessor, getter akan dipanggil untuk mengembalikan nilai yang sah apabila atribut accessor ditulis, setter akan dipanggil untuk menulis nilai baru; atribut mempunyai 4 ciri berikut :

    [[Boleh Dikonfigurasikan]]: Sama ada atribut boleh dipadamkan dan ditakrifkan semula melalui pengendali padam
  • [[Numberable]]: Sama ada atribut ini boleh ditemui melalui gelung untuk-masuk
  • [[Dapatkan]]: Dipanggil secara automatik semasa membaca sifat, lalai: tidak ditentukan;
  • [[Set]]: Dipanggil secara automatik semasa menulis atribut, lalai: tidak ditentukan;
Sifat aksesori tidak boleh ditakrifkan secara langsung dan mesti ditakrifkan menggunakan defineProperty(), seperti berikut:

var person = {
  _age: 18
};
Object.defineProperty(person, 'isAdult', {
	Configurable : false,
  get: function () {
    if (this._age >= 18) {
      return true;
    } else {
      return false;
    }
  }
});
console.log( person.isAdult ); // true
Walau bagaimanapun, masih terdapat satu perkara yang memerlukan perhatian tambahan Apabila menetapkan sifat dengan kaedah Object.defineProperty(), sifat pengakses (set dan dapatkan) dan sifat data (boleh ditulis atau nilai) tidak boleh diisytiharkan pada masa yang sama. Ini bermakna jika sesuatu harta mempunyai set atribut boleh tulis atau nilai, maka sifat ini tidak boleh mengisytiharkan get atau set, dan begitu juga sebaliknya.

Jika ditakrifkan seperti berikut, sifat pengakses dan sifat data wujud pada masa yang sama:

var o = {};
Object.defineProperty(o, 'name', {
  value: 'wenzi',
  set: function(name) {
    myName = name;
  },
  get: function() {
    return myName;
  }
});

上面的代码看起来貌似是没有什么问题,但是真正执行时会报错,报错如下:

Uncaught TypeError: Invalid property. A property cannot both have accessors and be writable or have a value

对于数据属性,可以取得:configurable,enumberable,writable和value;

对于访问器属性,可以取得:configurable,enumberable,get和set。

由此我们可知:一个变量或属性是否可以被删除,是由其内部属性Configurable进行控制的,若Configurable为true,则该变量或属性可以被删除,否则不能被删除。

可是我们应该怎么获取这个Configurable值呢,总不能用delete试试能不能删除吧。有办法滴!!

2.3 获取内部属性

ES5为我们提供了Object.getOwnPropertyDescriptor(object, property)来获取内部属性。

如:

var person = {name:'wenzi'};
var desp = Object.getOwnPropertyDescriptor(person, 'name'); // person中的name属性
console.log( desp );	// {value: "wenzi", writable: true, enumerable: true, configurable: true}

通过Object.getOwnPropertyDescriptor(object, property)我们能够获取到4个内部属性,configurable控制着变量或属性是否可被删除。这个例子中,person.name的configurable是true,则说明是可以被删除的:

console.log( person.name );			// wenzi
console.log( delete person.name );	// true,删除成功
console.log( person.name );			// undefined

我们再回到最开始的那个面试题:

a = 1;
var desp = Object.getOwnPropertyDescriptor(window, 'a');
console.log( desp.configurable ); 	// true,可以删除

var b = 2;
var desp = Object.getOwnPropertyDescriptor(window, 'b');
console.log( desp.configurable ); 	// false,不能删除

跟我们使用delete操作删除变量时产生的结果是一样的。

3. 总结

别看一个简简单单的delete操作,里面其实包含了很多的原理!

Kenyataan
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Dari C/C ke JavaScript: Bagaimana semuanya berfungsiDari C/C ke JavaScript: Bagaimana semuanya berfungsiApr 14, 2025 am 12:05 AM

Peralihan dari C/C ke JavaScript memerlukan menyesuaikan diri dengan menaip dinamik, pengumpulan sampah dan pengaturcaraan asynchronous. 1) C/C adalah bahasa yang ditaip secara statik yang memerlukan pengurusan memori manual, manakala JavaScript ditaip secara dinamik dan pengumpulan sampah diproses secara automatik. 2) C/C perlu dikumpulkan ke dalam kod mesin, manakala JavaScript adalah bahasa yang ditafsirkan. 3) JavaScript memperkenalkan konsep seperti penutupan, rantaian prototaip dan janji, yang meningkatkan keupayaan pengaturcaraan fleksibiliti dan asynchronous.

Enjin JavaScript: Membandingkan PelaksanaanEnjin JavaScript: Membandingkan PelaksanaanApr 13, 2025 am 12:05 AM

Enjin JavaScript yang berbeza mempunyai kesan yang berbeza apabila menguraikan dan melaksanakan kod JavaScript, kerana prinsip pelaksanaan dan strategi pengoptimuman setiap enjin berbeza. 1. Analisis leksikal: Menukar kod sumber ke dalam unit leksikal. 2. Analisis Tatabahasa: Menjana pokok sintaks abstrak. 3. Pengoptimuman dan Penyusunan: Menjana kod mesin melalui pengkompil JIT. 4. Jalankan: Jalankan kod mesin. Enjin V8 mengoptimumkan melalui kompilasi segera dan kelas tersembunyi, Spidermonkey menggunakan sistem kesimpulan jenis, menghasilkan prestasi prestasi yang berbeza pada kod yang sama.

Beyond the Browser: JavaScript di dunia nyataBeyond the Browser: JavaScript di dunia nyataApr 12, 2025 am 12:06 AM

Aplikasi JavaScript di dunia nyata termasuk pengaturcaraan sisi pelayan, pembangunan aplikasi mudah alih dan Internet of Things Control: 1. Pengaturcaraan sisi pelayan direalisasikan melalui node.js, sesuai untuk pemprosesan permintaan serentak yang tinggi. 2. Pembangunan aplikasi mudah alih dijalankan melalui reaktnatif dan menyokong penggunaan silang platform. 3. Digunakan untuk kawalan peranti IoT melalui Perpustakaan Johnny-Five, sesuai untuk interaksi perkakasan.

Membina aplikasi SaaS Multi-penyewa dengan Next.js (Integrasi Backend)Membina aplikasi SaaS Multi-penyewa dengan Next.js (Integrasi Backend)Apr 11, 2025 am 08:23 AM

Saya membina aplikasi SaaS multi-penyewa berfungsi (aplikasi edTech) dengan alat teknologi harian anda dan anda boleh melakukan perkara yang sama. Pertama, apakah aplikasi SaaS multi-penyewa? Aplikasi SaaS Multi-penyewa membolehkan anda melayani beberapa pelanggan dari Sing

Cara Membina Aplikasi SaaS Multi-Tenant dengan Next.js (Integrasi Frontend)Cara Membina Aplikasi SaaS Multi-Tenant dengan Next.js (Integrasi Frontend)Apr 11, 2025 am 08:22 AM

Artikel ini menunjukkan integrasi frontend dengan backend yang dijamin oleh permit, membina aplikasi edtech SaaS yang berfungsi menggunakan Next.Js. Frontend mengambil kebenaran pengguna untuk mengawal penglihatan UI dan memastikan permintaan API mematuhi dasar peranan

JavaScript: meneroka serba boleh bahasa webJavaScript: meneroka serba boleh bahasa webApr 11, 2025 am 12:01 AM

JavaScript adalah bahasa utama pembangunan web moden dan digunakan secara meluas untuk kepelbagaian dan fleksibiliti. 1) Pembangunan front-end: Membina laman web dinamik dan aplikasi satu halaman melalui operasi DOM dan kerangka moden (seperti React, Vue.js, sudut). 2) Pembangunan sisi pelayan: Node.js menggunakan model I/O yang tidak menyekat untuk mengendalikan aplikasi konkurensi tinggi dan masa nyata. 3) Pembangunan aplikasi mudah alih dan desktop: Pembangunan silang platform direalisasikan melalui reaktnatif dan elektron untuk meningkatkan kecekapan pembangunan.

Evolusi JavaScript: Trend Semasa dan Prospek Masa DepanEvolusi JavaScript: Trend Semasa dan Prospek Masa DepanApr 10, 2025 am 09:33 AM

Trend terkini dalam JavaScript termasuk kebangkitan TypeScript, populariti kerangka dan perpustakaan moden, dan penerapan webassembly. Prospek masa depan meliputi sistem jenis yang lebih berkuasa, pembangunan JavaScript, pengembangan kecerdasan buatan dan pembelajaran mesin, dan potensi pengkomputeran IoT dan kelebihan.

Demystifying JavaScript: Apa yang berlaku dan mengapa pentingDemystifying JavaScript: Apa yang berlaku dan mengapa pentingApr 09, 2025 am 12:07 AM

JavaScript adalah asas kepada pembangunan web moden, dan fungsi utamanya termasuk pengaturcaraan yang didorong oleh peristiwa, penjanaan kandungan dinamik dan pengaturcaraan tak segerak. 1) Pengaturcaraan yang didorong oleh peristiwa membolehkan laman web berubah secara dinamik mengikut operasi pengguna. 2) Penjanaan kandungan dinamik membolehkan kandungan halaman diselaraskan mengikut syarat. 3) Pengaturcaraan Asynchronous memastikan bahawa antara muka pengguna tidak disekat. JavaScript digunakan secara meluas dalam interaksi web, aplikasi satu halaman dan pembangunan sisi pelayan, sangat meningkatkan fleksibiliti pengalaman pengguna dan pembangunan silang platform.

See all articles

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
3 minggu yang laluBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
3 minggu yang laluBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Cara Memperbaiki Audio Jika anda tidak dapat mendengar sesiapa
3 minggu yang laluBy尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Cara Membuka Segala -galanya Di Myrise
4 minggu yang laluBy尊渡假赌尊渡假赌尊渡假赌

Alat panas

Penyesuai Pelayan SAP NetWeaver untuk Eclipse

Penyesuai Pelayan SAP NetWeaver untuk Eclipse

Integrasikan Eclipse dengan pelayan aplikasi SAP NetWeaver.

Muat turun versi mac editor Atom

Muat turun versi mac editor Atom

Editor sumber terbuka yang paling popular

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

Persekitaran pembangunan bersepadu PHP yang berkuasa

VSCode Windows 64-bit Muat Turun

VSCode Windows 64-bit Muat Turun

Editor IDE percuma dan berkuasa yang dilancarkan oleh Microsoft

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa