国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

目錄
1. delete操作符
2. js的內(nèi)部屬性
2.1 數(shù)據(jù)屬性
2.2 訪問器屬性
2.3 獲取內(nèi)部屬性
首頁(yè) web前端 js教程 js中delete操作符與內(nèi)部屬性實(shí)例詳解

js中delete操作符與內(nèi)部屬性實(shí)例詳解

Mar 31, 2018 pm 05:20 PM
delete javascript 實(shí)例

本文主要和大家分享js中delete操作符與內(nèi)部屬性實(shí)例詳解,在講解Configurable之前,我們首先來看一道面試題:

a = 1;console.log( window.a ); 
// 1console.log( delete window.a ); 
// trueconsole.log( window.a ); 
// undefinedvar b = 2;console.log( window.b ); 
// 2console.log( delete window.b ); 
// falseconsole.log( window.b ); // 2

從上面的這道題可以看出兩個(gè)的區(qū)別:在沒有使用var聲明變量時(shí),使用delete關(guān)鍵詞是可以進(jìn)行刪除的,再次獲取時(shí)值就是undefined了;在使用var聲明的變量,使用delete是不能刪除的,再獲取時(shí)值依然是2。

1. delete操作符

使用delete刪除變量或?qū)傩詴r(shí),刪除成功返回true,否則返回false。如上面的例子中,delete無法刪除變量a時(shí),則返回false;而delete能成功刪除變量b,則返回true。

除了上述的兩種情況,還有其他的各種常用變量也有能被delete刪除的,也有不能被刪除的。我們先不管delete這些變量時(shí),為什么會(huì)產(chǎn)生這樣的結(jié)果,這里只看他的返回值:

刪除delete數(shù)組中其中的一個(gè)元素:

// 使用for~in是循環(huán)不到的,直接忽略到該元素
// 使用for()可以得到該元素,但是值是undefinedvar 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]

刪除function類型的變量:

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

刪除function.length,該length是獲取形參的個(gè)數(shù):

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

刪除常用變量:

console.log( delete NaN );     
 // false,刪除失敗console.log( delete undefined );
 // falseconsole.log( delete Infinity ); 
 // falseconsole.log( delete null );     
 // true,刪除成功

刪除prototype,而不是刪除prototype上的屬性:

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

刪除數(shù)組和字符串的length時(shí):

var arr = [1, 2, 3, 4];console.log( arr.length );          
// 4console.log( delete arr.length );   
// false,刪除失敗console.log( arr.length );          
// 4var str = 'abcdefg';console.log( str.length );         
 // 7console.log( delete str.length );   
 // false,刪除失敗console.log( str.length );         
  // 7

刪除obj中的屬性時(shí):

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

刪除實(shí)例對(duì)象中的屬性時(shí),從以下的輸出結(jié)果可以看出,使用delete刪除屬性時(shí),刪除的僅僅是實(shí)例對(duì)象本身的屬性,而不能刪除prototype上的屬性,即使再刪一次也是刪除掉不的;若要?jiǎng)h除prototype上的屬性的屬性或方法,只能是:delete Person.prototype.name:

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

2. js的內(nèi)部屬性

在上面的例子中,有的變量或?qū)傩阅軌騽h除成功,而有的變量或?qū)傩詣t無法進(jìn)行刪除,那是什么決定這個(gè)變量或?qū)傩阅懿荒鼙粍h除呢。

ECMA-262第5版定義了JS對(duì)象屬性中特征(用于JS引擎,外部無法直接訪問)。ECMAScript中有兩種屬性:數(shù)據(jù)屬性和訪問器屬性。

2.1 數(shù)據(jù)屬性

數(shù)據(jù)屬性指包含一個(gè)數(shù)據(jù)值的位置,可在該位置讀取或?qū)懭胫?,該屬性?個(gè)供述其行為的特性:

. [[configurable]]:表示能否使用delete操作符刪除從而重新定義,或能否修改為訪問器屬性。默認(rèn)為true;
. [[Enumberable]]:表示是否可通過for-in循環(huán)返回屬性。默認(rèn)true;
. [[Writable]]:表示是否可修改屬性的值。默認(rèn)true;
. [[Value]]:包含該屬性的數(shù)據(jù)值。讀取/寫入都是該值。默認(rèn)為undefined;如上面實(shí)例對(duì)象Person中定義了name屬性,其值為’wenzi’,對(duì)該值的修改都反正在這個(gè)位置

要修改對(duì)象屬性的默認(rèn)特征(默認(rèn)都為true),可調(diào)用Object.defineProperty()方法,它接收三個(gè)參數(shù):屬性所在對(duì)象,屬性名和一個(gè)描述符對(duì)象(必須是:configurable、enumberable、writable和value,可設(shè)置一個(gè)或多個(gè)值)。

如下:

var person = {};Object.defineProperty(person, 'name', {
    configurable: false,    // 不可刪除,且不能修改為訪問器屬性
    writable: false,        // 不可修改
    value: 'wenzi'          // name的值為wenzi});console.log( person.name);          // wenziconsole.log( delete person.name );  // false,無法刪除person.name = 'lily';console.log( person.name );         // wenzi

可以看出,delete及重置person.name的值都沒有生效,這就是因?yàn)檎{(diào)用defineProperty函數(shù)修改了對(duì)象屬性的特征;值得注意的是一旦將configurable設(shè)置為false,則無法再使用defineProperty將其修改為true(執(zhí)行會(huì)報(bào)錯(cuò):Uncaught TypeError: Cannot redefine property: name);

2.2 訪問器屬性

它主要包括一對(duì)getter和setter函數(shù),在讀取訪問器屬性時(shí),會(huì)調(diào)用getter返回有效值;寫入訪問器屬性時(shí),調(diào)用setter,寫入新值;該屬性有以下4個(gè)特征:

. [[Configurable]]:是否可通過delete操作符刪除重新定義屬性;
. [[Numberable]]:是否可通過for-in循環(huán)查找該屬性;
. [[Get]]:讀取屬性時(shí)自動(dòng)調(diào)用,默認(rèn):undefined;
. [[Set]]:寫入屬性時(shí)自動(dòng)調(diào)用,默認(rèn):undefined;

訪問器屬性不能直接定義,必須使用defineProperty()來定義,如下:

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

不過還是有一點(diǎn)需要額外注意一下,Object.defineProperty()方法設(shè)置屬性時(shí),不能同時(shí)聲明訪問器屬性(set和get)和數(shù)據(jù)屬性(writable或者value)。意思就是,某個(gè)屬性設(shè)置了writable或者value屬性,那么這個(gè)屬性就不能聲明get和set了,反之亦然。

如若像下面的方式進(jìn)行定義,訪問器屬性和數(shù)據(jù)屬性同時(shí)存在:

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

上面的代碼看起來貌似是沒有什么問題,但是真正執(zhí)行時(shí)會(huì)報(bào)錯(cuò),報(bào)錯(cuò)如下:

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

對(duì)于數(shù)據(jù)屬性,可以取得:configurable,enumberable,writable和value;

對(duì)于訪問器屬性,可以取得:configurable,enumberable,get和set。

由此我們可知:一個(gè)變量或?qū)傩允欠窨梢员粍h除,是由其內(nèi)部屬性Configurable進(jìn)行控制的,若Configurable為true,則該變量或?qū)傩钥梢员粍h除,否則不能被刪除。

可是我們應(yīng)該怎么獲取這個(gè)Configurable值呢,總不能用delete試試能不能刪除吧。有辦法滴!!

2.3 獲取內(nèi)部屬性

ES5為我們提供了Object.getOwnPropertyDescriptor(object, property)來獲取內(nèi)部屬性。

如:

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個(gè)內(nèi)部屬性,configurable控制著變量或?qū)傩允欠窨杀粍h除。這個(gè)例子中,person.name的configurable是true,則說明是可以被刪除的:

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

我們?cè)倩氐阶铋_始的那個(gè)面試題:

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操作刪除變量時(shí)產(chǎn)生的結(jié)果是一樣的。

相關(guān)推薦:

JavaScript?delete操作符應(yīng)用實(shí)例_javascript技巧

以上是js中delete操作符與內(nèi)部屬性實(shí)例詳解的詳細(xì)內(nèi)容。更多信息請(qǐng)關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本站聲明
本文內(nèi)容由網(wǎng)友自發(fā)貢獻(xiàn),版權(quán)歸原作者所有,本站不承擔(dān)相應(yīng)法律責(zé)任。如您發(fā)現(xiàn)有涉嫌抄襲侵權(quán)的內(nèi)容,請(qǐng)聯(lián)系admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣服圖片

Undresser.AI Undress

Undresser.AI Undress

人工智能驅(qū)動(dòng)的應(yīng)用程序,用于創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用于從照片中去除衣服的在線人工智能工具。

Clothoff.io

Clothoff.io

AI脫衣機(jī)

Video Face Swap

Video Face Swap

使用我們完全免費(fèi)的人工智能換臉工具輕松在任何視頻中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的代碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

功能強(qiáng)大的PHP集成開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁(yè)開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級(jí)代碼編輯軟件(SublimeText3)

熱門話題

Laravel 教程
1600
29
PHP教程
1502
276
WebSocket與JavaScript:實(shí)現(xiàn)實(shí)時(shí)監(jiān)控系統(tǒng)的關(guān)鍵技術(shù) WebSocket與JavaScript:實(shí)現(xiàn)實(shí)時(shí)監(jiān)控系統(tǒng)的關(guān)鍵技術(shù) Dec 17, 2023 pm 05:30 PM

WebSocket與JavaScript:實(shí)現(xiàn)實(shí)時(shí)監(jiān)控系統(tǒng)的關(guān)鍵技術(shù)引言:隨著互聯(lián)網(wǎng)技術(shù)的快速發(fā)展,實(shí)時(shí)監(jiān)控系統(tǒng)在各個(gè)領(lǐng)域中得到了廣泛的應(yīng)用。而實(shí)現(xiàn)實(shí)時(shí)監(jiān)控的關(guān)鍵技術(shù)之一就是WebSocket與JavaScript的結(jié)合使用。本文將介紹WebSocket與JavaScript在實(shí)時(shí)監(jiān)控系統(tǒng)中的應(yīng)用,并給出代碼示例,詳細(xì)解釋其實(shí)現(xiàn)原理。一、WebSocket技

如何使用WebSocket和JavaScript實(shí)現(xiàn)在線語(yǔ)音識(shí)別系統(tǒng) 如何使用WebSocket和JavaScript實(shí)現(xiàn)在線語(yǔ)音識(shí)別系統(tǒng) Dec 17, 2023 pm 02:54 PM

如何使用WebSocket和JavaScript實(shí)現(xiàn)在線語(yǔ)音識(shí)別系統(tǒng)引言:隨著科技的不斷發(fā)展,語(yǔ)音識(shí)別技術(shù)已經(jīng)成為了人工智能領(lǐng)域的重要組成部分。而基于WebSocket和JavaScript實(shí)現(xiàn)的在線語(yǔ)音識(shí)別系統(tǒng),具備了低延遲、實(shí)時(shí)性和跨平臺(tái)的特點(diǎn),成為了一種被廣泛應(yīng)用的解決方案。本文將介紹如何使用WebSocket和JavaScript來實(shí)現(xiàn)在線語(yǔ)音識(shí)別系

如何利用JavaScript和WebSocket實(shí)現(xiàn)實(shí)時(shí)在線點(diǎn)餐系統(tǒng) 如何利用JavaScript和WebSocket實(shí)現(xiàn)實(shí)時(shí)在線點(diǎn)餐系統(tǒng) Dec 17, 2023 pm 12:09 PM

如何利用JavaScript和WebSocket實(shí)現(xiàn)實(shí)時(shí)在線點(diǎn)餐系統(tǒng)介紹:隨著互聯(lián)網(wǎng)的普及和技術(shù)的進(jìn)步,越來越多的餐廳開始提供在線點(diǎn)餐服務(wù)。為了實(shí)現(xiàn)實(shí)時(shí)在線點(diǎn)餐系統(tǒng),我們可以利用JavaScript和WebSocket技術(shù)。WebSocket是一種基于TCP協(xié)議的全雙工通信協(xié)議,可以實(shí)現(xiàn)客戶端與服務(wù)器的實(shí)時(shí)雙向通信。在實(shí)時(shí)在線點(diǎn)餐系統(tǒng)中,當(dāng)用戶選擇菜品并下單

JavaScript和WebSocket:打造高效的實(shí)時(shí)天氣預(yù)報(bào)系統(tǒng) JavaScript和WebSocket:打造高效的實(shí)時(shí)天氣預(yù)報(bào)系統(tǒng) Dec 17, 2023 pm 05:13 PM

JavaScript和WebSocket:打造高效的實(shí)時(shí)天氣預(yù)報(bào)系統(tǒng)引言:如今,天氣預(yù)報(bào)的準(zhǔn)確性對(duì)于日常生活以及決策制定具有重要意義。隨著技術(shù)的發(fā)展,我們可以通過實(shí)時(shí)獲取天氣數(shù)據(jù)來提供更準(zhǔn)確可靠的天氣預(yù)報(bào)。在本文中,我們將學(xué)習(xí)如何使用JavaScript和WebSocket技術(shù),來構(gòu)建一個(gè)高效的實(shí)時(shí)天氣預(yù)報(bào)系統(tǒng)。本文將通過具體的代碼示例來展示實(shí)現(xiàn)的過程。We

如何使用WebSocket和JavaScript實(shí)現(xiàn)在線預(yù)約系統(tǒng) 如何使用WebSocket和JavaScript實(shí)現(xiàn)在線預(yù)約系統(tǒng) Dec 17, 2023 am 09:39 AM

如何使用WebSocket和JavaScript實(shí)現(xiàn)在線預(yù)約系統(tǒng)在當(dāng)今數(shù)字化的時(shí)代,越來越多的業(yè)務(wù)和服務(wù)都需要提供在線預(yù)約功能。而實(shí)現(xiàn)一個(gè)高效、實(shí)時(shí)的在線預(yù)約系統(tǒng)是至關(guān)重要的。本文將介紹如何使用WebSocket和JavaScript來實(shí)現(xiàn)一個(gè)在線預(yù)約系統(tǒng),并提供具體的代碼示例。一、什么是WebSocketWebSocket是一種在單個(gè)TCP連接上進(jìn)行全雙工

簡(jiǎn)易JavaScript教程:獲取HTTP狀態(tài)碼的方法 簡(jiǎn)易JavaScript教程:獲取HTTP狀態(tài)碼的方法 Jan 05, 2024 pm 06:08 PM

JavaScript教程:如何獲取HTTP狀態(tài)碼,需要具體代碼示例前言:在Web開發(fā)中,經(jīng)常會(huì)涉及到與服務(wù)器進(jìn)行數(shù)據(jù)交互的場(chǎng)景。在與服務(wù)器進(jìn)行通信時(shí),我們經(jīng)常需要獲取返回的HTTP狀態(tài)碼來判斷操作是否成功,根據(jù)不同的狀態(tài)碼來進(jìn)行相應(yīng)的處理。本篇文章將教你如何使用JavaScript獲取HTTP狀態(tài)碼,并提供一些實(shí)用的代碼示例。使用XMLHttpRequest

如何在JavaScript中獲取HTTP狀態(tài)碼的簡(jiǎn)單方法 如何在JavaScript中獲取HTTP狀態(tài)碼的簡(jiǎn)單方法 Jan 05, 2024 pm 01:37 PM

JavaScript中的HTTP狀態(tài)碼獲取方法簡(jiǎn)介:在進(jìn)行前端開發(fā)中,我們常常需要處理與后端接口的交互,而HTTP狀態(tài)碼就是其中非常重要的一部分。了解和獲取HTTP狀態(tài)碼有助于我們更好地處理接口返回的數(shù)據(jù)。本文將介紹使用JavaScript獲取HTTP狀態(tài)碼的方法,并提供具體代碼示例。一、什么是HTTP狀態(tài)碼HTTP狀態(tài)碼是指當(dāng)瀏覽器向服務(wù)器發(fā)起請(qǐng)求時(shí),服務(wù)

JavaScript和WebSocket:打造高效的實(shí)時(shí)圖像處理系統(tǒng) JavaScript和WebSocket:打造高效的實(shí)時(shí)圖像處理系統(tǒng) Dec 17, 2023 am 08:41 AM

JavaScript是一種廣泛應(yīng)用于Web開發(fā)的編程語(yǔ)言,而WebSocket則是一種用于實(shí)時(shí)通信的網(wǎng)絡(luò)協(xié)議。結(jié)合二者的強(qiáng)大功能,我們可以打造一個(gè)高效的實(shí)時(shí)圖像處理系統(tǒng)。本文將介紹如何利用JavaScript和WebSocket來實(shí)現(xiàn)這個(gè)系統(tǒng),并提供具體的代碼示例。首先,我們需要明確實(shí)時(shí)圖像處理系統(tǒng)的需求和目標(biāo)。假設(shè)我們有一個(gè)攝像頭設(shè)備,可以采集實(shí)時(shí)的圖像數(shù)

See all articles