摘要:一旦屬性引用結束了,這個新創建的對象就會被銷毀。回到屬性訪問表達式,如果表達式后跟隨和標識符,就會查找這個標識符所指定的屬性的值沒并將其作為整個表達式返回的值。而且運算符只能刪除自有屬性,不能刪除繼承屬性。真真真假真真真真真假真假未完待續
屬性訪問表達式
眾所周知,JavaScript為屬性的訪問定義了兩種語法方式:
表達式.標識符
表達式(指定對象),標識符(指定需要訪問的屬性的名稱)
表達式[表達式]
表達式1(指定對象),表達式2(指定需要訪問的屬性的名稱或者要訪問數組的索引)
var O = {a:1,b:{c:3}} var A = [O,4,[5,6,7]] O.a //1 O.b.c //3 O["a"] //1 A[1] //4 A[0].b.c //3 A[2]["2"] //7
第一種方法我們使用點 . 來進行屬性的訪問,第二種則是使用 [] 來進行屬性訪問。其實如上我們就可以輕松發現兩種方法的區別,第二種方法的方括號內也是一個表達式。
但是這兩種方法的第一個表達式都是先進行計算的,如果計算結果是空或者未定義那么就會拋出錯誤,如果運算結果不是對象或者數組,JS會將其轉化為對象(例如下面代碼塊的字符串)。
var str = "Hello World!"; var world = s.substring(s.indexOf(" ")+1, s.length)
如果運算結果不是對象或者數組,JS會將其轉化為對象,有些人會奇怪,字符串不是對象,為什么它還具有屬性?這是因為我們在進行屬性訪問的時候,JS就會將字符串調用 new String(str) 來轉換成對象,而提供這個方法新創建的對象自然就繼承(關于對象的繼承可以查閱相關資料)了字符串的方法并且用來處理屬性的引用。一旦屬性引用結束了,這個新創建的對象就會被銷毀。當然我這里只寫了字符串的一個 demo ,數字布爾值也類似通過Number() Boolean() 構造函數來進行對象創建。
回到屬性訪問表達式,如果表達式后跟隨 . 和標識符,就會查找這個標識符所指定的屬性的值沒并將其作為整個表達式返回的值。如果對象表達式跟隨一堆 [],則會計算 [] 內的表達式的值并將其轉化為字符串,當然這兩方法種如果訪問的屬性是不存在的,會返回 undefine。
我們可以看出,使用 . + 標識符的寫法更加簡單,并且我們有時候習慣了鏈式調用的時候更加喜歡 .,但是,需要注意的是,這種方式下,我們要訪問的屬性名必須是合法的。如果我們進行訪問的屬性名稱是一個保留字,或者包含空格,或者是一個數字,或者是通過表達式計算得出的值,這時候的屬性訪問必須要使用方括號。
delete運算符delete 是一元運算符,我們可以使用它來刪除對象屬性或者數組元素。
delete 希望他的操作數是一個左值,如果我們誤用使得他的操作數不是一個左值,那么 delete 就不會進行任何操作并且返回 true,當然并不是所有屬性都是能夠刪除的,用戶 var 聲明的變量,自定義函數,函數參數,內置核心屬性等是不能給刪除的,刪除非法會拋出錯誤。
這里插入補充下左值:所謂左值,簡單點說就是可以被賦值的表達式,在ES規范中是用內部類型引用(Reference)描述的,其作用為存放數據空間,且存放是允許的。比如這里的屬性訪問表達式。
雖然 delete 運算符可以刪除對象的屬性,但是我們要知道,delete 其實只是斷開了屬性和宿主對象的聯系,而不會操作屬性中的屬性。 而且delete運算符只能刪除自有屬性,不能刪除繼承屬性。
a = { b:{c:1} }; d = a.b; delete a.b; console.log(d.c) //結果仍舊是1,可以看出delete其實只是斷開可屬性和宿主對象的聯系并沒有將其銷毀 o = {a:1}; delete o.a; //刪除屬性a并返回true delete o.x; //因為a屬性不存在,什么都不做并返回true delete o.toString; //因為toString是繼承來的,什么都不做并返回true delete 110; //沒有意義,返回true delete Object.prototype; //返回false var b = 1; delete this.b; //返回false function f(){}; delete this.f; //返回false邏輯運算符
運算符 | 示例 | 說明 |
---|---|---|
邏輯與 (&&) | expr1&&expr2 | 如果 expr1 能轉換成 false則返回 expr1,否則返回 expr2. 因此, 在 Boolean 環境中使用時, 兩個操作結果都為 true 時返回 true,否則返回false. |
邏輯或 (||) | expr1||expr2 | 如果 expr1 能轉換成 true 則返回 expr1,否則返回 expr2. 因此,在boolean環境(在if的條件判斷中)中使用時, 二者操作結果中只要有一個為 true,返回 true;二者操作結果都為 false時返回false. |
邏輯非(!) | !expr | 如果單個表達式能轉換為true的話返回 false,否則返回 true. |
在JS計算邏輯中我們在使用邏輯運算符會有一個短路原理。如下
var a = true; var b = false; var c = a || 1; //true var d = b || 1; //1 var e = a && 1; //1 var f = b && 1; //false
上面代碼塊的變量 c 賦值時,a 和 1 都是真,但是因為js的短路原理,在邏輯或中只要排在前面的 a 為真,那么后面的 1 就會直接忽略,排在前面的操作數為假才會計算到后面的操作數。同理在使用邏輯與時,只要排在前面的操作數是為假,那么js就會直接忽略后面的操作數而讓運算結果直接為 false,如果前面的操作數為真,就會繼續計算后面的操作數,最后如果后面操作數為真,賦值的才是后面的操作數。
var a = 真1 || 真2 //真1 var b = 假 || 真3 //真3 var c = 真4 && 真5 //真5 var d = 假 && 真6 //假
未完待續~~~~
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/94913.html
摘要:語句語句概述在中語句使用分號進行分隔可以在每行編寫一條語句也可以在每行編寫多條語句語句塊中使用一堆花括號表示一個語句塊使用語句塊為語句進行分組這樣使語句的結構清晰明了空語句空語句允許包含條語句解釋器執行空語句時不會執行任何動作流程控制語句解 語句 語句概述 在JavaScript中 語句使用分號(;)進行分隔 可以在每行編寫一條語句 也可以在每行編寫多條語句 語句塊 JavaScrip...
摘要:沒有耐心閱讀的同學,可以直接前往學習全棧最后一公里。我下面會羅列一些,我自己錄制過的一些項目,或者其他的我覺得可以按照這個路線繼續深入學習的項目資源。 showImg(https://segmentfault.com/img/bVMlke?w=833&h=410); 本文技術軟文,閱讀需謹慎,長約 7000 字,通讀需 5 分鐘 大家好,我是 Scott,本文通過提供給大家學習的方法,...
閱讀 3614·2021-11-15 11:38
閱讀 2810·2021-11-11 16:55
閱讀 2562·2021-11-08 13:22
閱讀 2638·2021-11-02 14:45
閱讀 1321·2021-09-28 09:35
閱讀 2596·2021-09-10 10:50
閱讀 471·2019-08-30 15:44
閱讀 2787·2019-08-29 17:06