Come capire le parole chiave "cancella h [chiave]" di JavaScript e "del h [tasto]" di Python?

0

C'è una cosa che non riesco a capire in JavaScript o Python, e questa è la sintassi delete o del .

In JavaScript:

obj = {ha: 123, hi: 3.14}
delete obj.ha               # now obj is {hi: 3.14}

In Python:

d1 = {"ha" : 123, "hi" : 3.14}
del d1["ha"]                # now d1 is {'hi': 3.14}

Ma cosa significa delete obj.ha o del d1["ha"] ?

In JavaScript, delete obj.ha può significare delete 123 , perché obj.ha valuta 123 .

Allo stesso modo, in Python, del d1["ha"] può significare del 123 perché d1["ha"] valuta a 123 .

Quindi non ha senso delete 123 in entrambi i casi.

Quindi stiamo dicendo, beh, la maggior parte delle volte, le regole per valutare qualcosa e poi applicarlo al lavoro con delete o del , ma a volte, semplicemente "magicamente" funzionano nell'altro modo?

Ad esempio, penso che Smalltalk o Ruby abbiano molto più senso, che è h.delete("ha") , vale a dire passare il messaggio all'oggetto h , che è un dizionario o un hash, che per il chiave ha , rimuovila. Questo è coerente con tutto il resto. Quindi non abbiamo la cosa strana come delete obj.ha - oh non è uguale a delete 123 .

(Python h.pop(key) ha lo stesso effetto di del h[key] , a quanto pare, ma avere la sintassi del h[key] sembra ancora strano).

    
posta 太極者無極而生 07.03.2016 - 08:20
fonte

1 risposta

3

Quello che abbiamo dopo delete è un lvalue , il che significa che l'espressione non viene valutata sul valore nel campo, ma si riferisce a un riferimento al campo stesso.

Lo stesso accade in un costrutto più noto:

obj.ha = 456

Se l'espressione sulla mano sinistra è stata valutata prima sul valore, sarebbe equivalente a questo:

123 = 456

Che non ha alcun senso, perché non puoi assegnare a un intero.

Nella grammatica della lingua viene specificato che le espressioni in determinati contesti non vengono valutate su un valore ma si riferiscono a un riferimento a una variabile oa un campo. L'esempio è il lato sinistro di un compito e dopo la parola chiave delete .

Quindi è abbastanza limitato ciò che puoi mettere in una posizione di lvalue: deve essere una variabile o un campo. Qualsiasi altra espressione, come ad esempio una chiamata a una funzione, non è consentita.

del / delete è fondamentalmente l'inverso del compito, che crea un campo / variabile se non esiste già. Quindi direi che non è davvero strano o confuso, ma piuttosto piuttosto logico. Dopotutto, non devi chiamare obj.createField("ha") per creare un campo, ma usa un operatore ( = ).

    
risposta data 07.03.2016 - 08:47
fonte

Leggi altre domande sui tag