摘要:一旦屬性引用結(jié)束了,這個(gè)新創(chuàng)建的對象就會(huì)被銷毀。回到屬性訪問表達(dá)式,如果表達(dá)式后跟隨和標(biāo)識(shí)符,就會(huì)查找這個(gè)標(biāo)識(shí)符所指定的屬性的值沒并將其作為整個(gè)表達(dá)式返回的值。而且運(yùn)算符只能刪除自有屬性,不能刪除繼承屬性。真真真假真真真真真假真假未完待續(xù)
屬性訪問表達(dá)式
眾所周知,JavaScript為屬性的訪問定義了兩種語法方式:
表達(dá)式.標(biāo)識(shí)符
表達(dá)式(指定對象),標(biāo)識(shí)符(指定需要訪問的屬性的名稱)
表達(dá)式[表達(dá)式]
表達(dá)式1(指定對象),表達(dá)式2(指定需要訪問的屬性的名稱或者要訪問數(shù)組的索引)
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
第一種方法我們使用點(diǎn) . 來進(jìn)行屬性的訪問,第二種則是使用 [] 來進(jìn)行屬性訪問。其實(shí)如上我們就可以輕松發(fā)現(xiàn)兩種方法的區(qū)別,第二種方法的方括號(hào)內(nèi)也是一個(gè)表達(dá)式。
但是這兩種方法的第一個(gè)表達(dá)式都是先進(jìn)行計(jì)算的,如果計(jì)算結(jié)果是空或者未定義那么就會(huì)拋出錯(cuò)誤,如果運(yùn)算結(jié)果不是對象或者數(shù)組,JS會(huì)將其轉(zhuǎn)化為對象(例如下面代碼塊的字符串)。
var str = "Hello World!"; var world = s.substring(s.indexOf(" ")+1, s.length)
如果運(yùn)算結(jié)果不是對象或者數(shù)組,JS會(huì)將其轉(zhuǎn)化為對象,有些人會(huì)奇怪,字符串不是對象,為什么它還具有屬性?這是因?yàn)槲覀冊谶M(jìn)行屬性訪問的時(shí)候,JS就會(huì)將字符串調(diào)用 new String(str) 來轉(zhuǎn)換成對象,而提供這個(gè)方法新創(chuàng)建的對象自然就繼承(關(guān)于對象的繼承可以查閱相關(guān)資料)了字符串的方法并且用來處理屬性的引用。一旦屬性引用結(jié)束了,這個(gè)新創(chuàng)建的對象就會(huì)被銷毀。當(dāng)然我這里只寫了字符串的一個(gè) demo ,數(shù)字布爾值也類似通過Number() Boolean() 構(gòu)造函數(shù)來進(jìn)行對象創(chuàng)建。
回到屬性訪問表達(dá)式,如果表達(dá)式后跟隨 . 和標(biāo)識(shí)符,就會(huì)查找這個(gè)標(biāo)識(shí)符所指定的屬性的值沒并將其作為整個(gè)表達(dá)式返回的值。如果對象表達(dá)式跟隨一堆 [],則會(huì)計(jì)算 [] 內(nèi)的表達(dá)式的值并將其轉(zhuǎn)化為字符串,當(dāng)然這兩方法種如果訪問的屬性是不存在的,會(huì)返回 undefine。
我們可以看出,使用 . + 標(biāo)識(shí)符的寫法更加簡單,并且我們有時(shí)候習(xí)慣了鏈?zhǔn)秸{(diào)用的時(shí)候更加喜歡 .,但是,需要注意的是,這種方式下,我們要訪問的屬性名必須是合法的。如果我們進(jìn)行訪問的屬性名稱是一個(gè)保留字,或者包含空格,或者是一個(gè)數(shù)字,或者是通過表達(dá)式計(jì)算得出的值,這時(shí)候的屬性訪問必須要使用方括號(hào)。
delete運(yùn)算符delete 是一元運(yùn)算符,我們可以使用它來刪除對象屬性或者數(shù)組元素。
delete 希望他的操作數(shù)是一個(gè)左值,如果我們誤用使得他的操作數(shù)不是一個(gè)左值,那么 delete 就不會(huì)進(jìn)行任何操作并且返回 true,當(dāng)然并不是所有屬性都是能夠刪除的,用戶 var 聲明的變量,自定義函數(shù),函數(shù)參數(shù),內(nèi)置核心屬性等是不能給刪除的,刪除非法會(huì)拋出錯(cuò)誤。
這里插入補(bǔ)充下左值:所謂左值,簡單點(diǎn)說就是可以被賦值的表達(dá)式,在ES規(guī)范中是用內(nèi)部類型引用(Reference)描述的,其作用為存放數(shù)據(jù)空間,且存放是允許的。比如這里的屬性訪問表達(dá)式。
雖然 delete 運(yùn)算符可以刪除對象的屬性,但是我們要知道,delete 其實(shí)只是斷開了屬性和宿主對象的聯(lián)系,而不會(huì)操作屬性中的屬性。 而且delete運(yùn)算符只能刪除自有屬性,不能刪除繼承屬性。
a = { b:{c:1} }; d = a.b; delete a.b; console.log(d.c) //結(jié)果仍舊是1,可以看出delete其實(shí)只是斷開可屬性和宿主對象的聯(lián)系并沒有將其銷毀 o = {a:1}; delete o.a; //刪除屬性a并返回true delete o.x; //因?yàn)閍屬性不存在,什么都不做并返回true delete o.toString; //因?yàn)閠oString是繼承來的,什么都不做并返回true delete 110; //沒有意義,返回true delete Object.prototype; //返回false var b = 1; delete this.b; //返回false function f(){}; delete this.f; //返回false邏輯運(yùn)算符
運(yùn)算符 | 示例 | 說明 |
---|---|---|
邏輯與 (&&) | expr1&&expr2 | 如果 expr1 能轉(zhuǎn)換成 false則返回 expr1,否則返回 expr2. 因此, 在 Boolean 環(huán)境中使用時(shí), 兩個(gè)操作結(jié)果都為 true 時(shí)返回 true,否則返回false. |
邏輯或 (||) | expr1||expr2 | 如果 expr1 能轉(zhuǎn)換成 true 則返回 expr1,否則返回 expr2. 因此,在boolean環(huán)境(在if的條件判斷中)中使用時(shí), 二者操作結(jié)果中只要有一個(gè)為 true,返回 true;二者操作結(jié)果都為 false時(shí)返回false. |
邏輯非(!) | !expr | 如果單個(gè)表達(dá)式能轉(zhuǎn)換為true的話返回 false,否則返回 true. |
在JS計(jì)算邏輯中我們在使用邏輯運(yùn)算符會(huì)有一個(gè)短路原理。如下
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 賦值時(shí),a 和 1 都是真,但是因?yàn)閖s的短路原理,在邏輯或中只要排在前面的 a 為真,那么后面的 1 就會(huì)直接忽略,排在前面的操作數(shù)為假才會(huì)計(jì)算到后面的操作數(shù)。同理在使用邏輯與時(shí),只要排在前面的操作數(shù)是為假,那么js就會(huì)直接忽略后面的操作數(shù)而讓運(yùn)算結(jié)果直接為 false,如果前面的操作數(shù)為真,就會(huì)繼續(xù)計(jì)算后面的操作數(shù),最后如果后面操作數(shù)為真,賦值的才是后面的操作數(shù)。
var a = 真1 || 真2 //真1 var b = 假 || 真3 //真3 var c = 真4 && 真5 //真5 var d = 假 && 真6 //假
未完待續(xù)~~~~
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/94913.html
摘要:今天我來談?wù)劶夹g(shù)。我簡要羅列一下幾種常見的技術(shù)動(dòng)態(tài)腳本注入和圖片信標(biāo)技術(shù)接下來我簡要談?wù)勎覍@幾種技術(shù)的理解。該特性可以實(shí)現(xiàn)無阻塞加載腳本技術(shù)。和動(dòng)態(tài)腳本注入類似,技術(shù)也有可跨域和無法發(fā)送非請求的問題。目前使用最多的技術(shù)手段就是利用技術(shù)。 今天我來談?wù)凙jax技術(shù)。 Ajax是一種與服務(wù)器通信而無需重載頁面的方法。數(shù)據(jù)可以從服務(wù)器獲取或者發(fā)給服務(wù)器。 Ajax和異步分不開,但是本文重點(diǎn)...
摘要:語句語句概述在中語句使用分號(hào)進(jìn)行分隔可以在每行編寫一條語句也可以在每行編寫多條語句語句塊中使用一堆花括號(hào)表示一個(gè)語句塊使用語句塊為語句進(jìn)行分組這樣使語句的結(jié)構(gòu)清晰明了空語句空語句允許包含條語句解釋器執(zhí)行空語句時(shí)不會(huì)執(zhí)行任何動(dòng)作流程控制語句解 語句 語句概述 在JavaScript中 語句使用分號(hào)(;)進(jìn)行分隔 可以在每行編寫一條語句 也可以在每行編寫多條語句 語句塊 JavaScrip...
摘要:沒有耐心閱讀的同學(xué),可以直接前往學(xué)習(xí)全棧最后一公里。我下面會(huì)羅列一些,我自己錄制過的一些項(xiàng)目,或者其他的我覺得可以按照這個(gè)路線繼續(xù)深入學(xué)習(xí)的項(xiàng)目資源。 showImg(https://segmentfault.com/img/bVMlke?w=833&h=410); 本文技術(shù)軟文,閱讀需謹(jǐn)慎,長約 7000 字,通讀需 5 分鐘 大家好,我是 Scott,本文通過提供給大家學(xué)習(xí)的方法,...
閱讀 3606·2021-11-15 11:38
閱讀 2801·2021-11-11 16:55
閱讀 2551·2021-11-08 13:22
閱讀 2628·2021-11-02 14:45
閱讀 1304·2021-09-28 09:35
閱讀 2568·2021-09-10 10:50
閱讀 463·2019-08-30 15:44
閱讀 2775·2019-08-29 17:06