<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                >[success] # delete -- 運算符 ~~~ 1.首先delete 會調用引擎內部的[[Delete]]方法 (PropertyName) 他主要做的是:從對象中移除指定的屬性 ~~~ * 推薦文章 [kangax 文章講解](http://perfectionkills.com/understanding-delete/) [mdn 中的delete](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/delete) >[info] ## 通過MDN 了解 -- delete ~~~ 1.MDN中對delete 操作符'解釋'是:用于刪除對象的某個屬性 2.'語法'為'delete expression',其中'expression' 表示的是某個屬性的引用 3.對于所有情況都是true,除非屬性是一個自己不可配置的屬性,在這種情況下,非嚴格模式返回 false。 簡單的說就是刪除成功返回true 失敗false 4.'異常'在嚴格模式下,如果是屬性是一個自己不可配置的屬性,會拋出'Global_objects/SyntaxError'。 簡單的說:會拋出一個語法錯誤( SyntaxError)而不是返回false。 ~~~ >[danger] ##### MDN 文檔中對delete 幾種考慮情況的說明 ~~~ 1.刪除不存在的屬性,delete 雖然不起任何作用但是返回的是true 2.delete操作只會在自身的屬性上起作用,即當前對象的原型上和當前對象有相同屬性名, 刪除屬性之后會使用原型對象上的屬性 3.不能刪除var 變量聲明的屬性不能從全局作用域或者函數中刪除,簡單的說var聲明的變量 delete 刪除不掉 3.1. 在對象(object)中的函數是能夠用delete操作刪除的 4.任何用let或const聲明的屬性不能夠從它被聲明的作用域中刪除 5.不可設置的(Non-configurable)屬性不能被移除。這意味著像Math, Array, Object內置對象的屬性以 及使用Object.defineProperty()方法設置為不可設置的屬性不能被刪除。 ~~~ >[danger] ##### 對上面的五條逐一案例分析 * 刪除不存在的屬性,delete 雖然不起任何作用但是返回的是true ~~~ var test = { age:10, name:'wang' } console.log(delete test.age) // true console.log(delete test.sex) // 刪除一個不存在的屬性返回的true console.log(test) // {name: "wang"} ~~~ * delete操作只會在自身的屬性上起作用 ~~~ var Test = function () { this.name = 'wang' this.age = '10' } Test.prototype.age = '20' Test.prototype.sex = '男' var test = new Test() console.log(test.age) // 10 console.log(delete test.age) // true console.log(delete test.sex) // true console.log(test.age) // 20 console.log(test.sex) // 男 // 再次刪除也不能刪除指向原型鏈的 console.log(delete test.age) // true console.log(test.age) // 20 // 從原型上刪除屬性 delete Test.prototype.sex ~~~ * 不能刪除var / let /const 定義的屬性 和 函數 ~~~ // 在全局作用域創建 adminName 屬性 adminName = 'xyz'; // 在全局作用域創建 empCount 屬性 // 因為我們使用了 var,它會標記為不可配置。同樣 let 或 const 也是不可配置的。 var empCount = 43; // adminName 是全局作用域的一個屬性。 // 因為它不是用 var 創建的,所在可以刪除。 // 因此,它是可配置的。 delete adminName; // 返回 true // 相反,empCount 是不可配置的, // 因為創建它時使用了 var。 delete empCount; // 返回 false // -------------- 函數 ----------- function func() {} console.log(delete func) // false console.log((func)) ~~~ ![](https://img.kancloud.cn/7e/fa/7efa222afcc0107a414d7c22cc7beef0_473x174.png) * 可以刪除Object 中的屬性 ~~~ console.log(delete Object.is) // true 這里is不是內置對象的屬性,雖然它是Object 一個屬性方法 Object.is(NaN,NaN) // 報錯提示沒有這個方法 // 實際常用的刪除自己定義屬性 var test = { name:'wang' } delete test.name // true ~~~ * 不可設置的(Non-configurable)屬性、內置對象的屬性不能被移除 [關于js中內置對象文章參考](https://segmentfault.com/a/1190000011467723) ~~~ console.log(delete Object.prototype) // false console.log(delete Math.E) // false // Object.defineProperty()方法設置為不可設置的屬性不能被刪除 var obj = {name: 'John'}; Object.defineProperty(obj, "key", { configurable: false, value: "static" }); delete obj.name; // true delete obj.key // false ~~~ >[danger] ##### 關于更多 那些是否可以刪除的文章 [關于delete 刪除的更多案例](https://www.cnblogs.com/snandy/archive/2013/03/06/2944815.html) >[info] ## 通過kangax 文章更進一步了解 * kangax 文章中對三種可執行的代碼分類 ~~~ 1.ECMAScript中有3種類型的可執行代碼:'Global code', 'Function code','Eval code'。這些類型在某種程度上是自我 描述的,但這里有一個簡短的概述: 1.1當源文本被視為程序時,它將在全局范圍內執行,并被視為'Global code'。在瀏覽器環境中,SCRIPT元素的內 容通常被解析為程序,因此被評估為'Global code'。 1.2.直接在函數中執行的任何操作都被視為'Function code'。在瀏覽器中,<p onclick="...">通常將事件屬性的內容 (例如)解析為'Function code'。 1.3.將提供給內置eval函數的文本解析為'Eval code'。 ~~~ * 對kangax 屬性里的屬性講解 ~~~ 1.kangax 文章中講到每個屬性都都會具有下面說的的屬性中0個或多個屬性組成分別是是: 'ReadOnly' ,'DontEnum','DontDelete','Internal' 依次為'只讀','不可枚舉','不可刪除','內部' ~~~ >[danger] ##### kangax 文章中舉的案例為什么隱式變量可以刪除/var全局變量不可以 ~~~ 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 = 'blah'; delete GLOBAL_OBJECT.baz; // true typeof GLOBAL_OBJECT.baz; // "undefined" \* create global property via undeclared assignment; property has no DontDelete \* bar = 2; delete bar; // true typeof bar; // "undefined" ~~~ >[danger] ##### 具有'DontDelete' 屬性一些特殊內置對象屬性 ~~~ 1.下面的案例解釋了為什么特殊的內置對象的屬性不能被移除 ~~~ ~~~ (function(){ /* 不能刪除 `arguments`, 因為它有 DontDelete屬性 */ delete arguments; // false typeof arguments; // "object" /* 不能刪除 function's `length`; 因為它有 DontDelete屬性 */ function f(){} delete f.length; // false typeof f.length; // "number" })(); ~~~ * 函數的形參也是不可以刪除的 ~~~ (function(foo, bar){ delete foo; // false foo; // 1 delete bar; // false bar; // 'blah' })(1, 'blah'); ~~~ >[danger] ##### 在屬性創建期間確定屬性的(即未設置任何屬性)。以后的分配不會修改現有屬性的屬性 ~~~ /* foo 是用DontDelete創建的屬性 */ function foo(){} /* 以后的賦值不會修改屬性,所以刪除不掉即使foo 看起來是一個隱式全局變量 */ foo = 1; delete foo; // false typeof foo; // "number" /* 但是給一個不存在的屬性賦值, 使用空屬性創建該屬性(因此不使用DontDelete) */ this.bar = 1; delete bar; // true typeof bar; // "undefined" ~~~ >[danger] ##### 總結一下 ~~~ 1.Variables(我的理解就是var) and function聲明是Activation或Global objects的屬性(他們是具有DontDelete) 2.屬性中的'DontDelete'負責是否可以刪除一個屬性。當然也有mdn中說到的Object.defineProperty() 方法設置為不可設置的屬性 3.Eval代碼中的變量和函數聲明總是在不使用DontDelete的情況下創建屬性。因此他們是可以刪除的 ~~~
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看