2010-03-12 9 views
5

Sia in Actionscript3 e JavaScript queste dichiarazioni invia lo stesso risultato:E 'un bug in Ecmascript - /S/.test(null) restituisce vero?

/\S/.test(null) => true 
/null/.test(null) => true 
/m/.test(null) => false 
/n/.test(null) => true 

Sembra che valore nullo viene convertito in stringa "null" in questo caso.

Si tratta di un bug noto in Ecmascript o mi manca qualcosa?

+8

Suggerimento per professionisti: non si troverà mai un errore in una lingua o in uno strumento. Solo i programmatori super cool lo fanno. – Marius

risposta

11

Non è un bug, ma hai ragione, nullcostringe a 'null' e tale comportamento è definito sulla sp ec:

  1. RegExp.prototype.test(string), internamente è equivalente alla espressione: RegExp.prototype.exec(string) != null
  2. Il tipo metodo exec converte il primo argomento di stringa, usando il funzionamento interno ToString (guardare la Fase 1 del metodo exec).
  3. L'operazione interna ToString restituisce esplicitamente "null" quando l'input è di tipo Null.

In conclusione, nei tuoi esempi, la RegExp matchs contro la stringa 'null', in modo che il primo carattere non-spazio, in questo caso la lettera 'n'.

var a = null+''; // 'null' 
/\S/.test(a); // true 
(null+'').match(/\S/) // ["n"] 
3

null è un oggetto , e durante il test contro oggetti (non di tipo stringa), il suo primo convertito a stringa, allora la sua dandovi quel risultato.

Si potrebbe provare con /Number/.test(Number) o /String/.test(String), che restituirebbe anche true troppo.

Probabilmente String(null) viene chiamato, che è 'null'

String(Number) darà

function Number() { 
    [native code] 
} 

e /function Number/.test(Number) ritorno true troppo

+5

Tecnicamente 'null' non è un oggetto, è un valore primitivo, questo malinteso esiste da anni, sfortunatamente anche l'operatore' typeof' è sbagliato, dal momento che 'typeof null == 'object'' che è completamente errato. Purtroppo, era troppo tardi per essere corretto nella 5a edizione di ECMAScript. http://wiki.ecmascript.org/doku.php?id=proposals:typeof – CMS

+0

Grazie a @CMS per le informazioni. + 1 volta al tuo. – YOU

Problemi correlati