2010-03-12 37 views
5

两个基于ActionScript3和Javascript这些语句产生相同的结果:它是Ecmascript中的错误 - /S/.test(null)是否返回true?

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

似乎空值转换成在这种情况下,字符串“null”。

这是Ecmascript中的一个已知错误还是我错过了什么?

+8

专业提示:您永远不会在语言或工具中发现错误。只有超级酷的程序员才能这样做。 – Marius 2010-03-12 04:57:07

回答

11

这是不是一个错误,但是你是对的,null胁迫'null'并且该行为在sp上定义EC:

  1. RegExp.prototype.test(string),内部是相当于表达式:RegExp.prototype.exec(string) != null
  2. exec方法类型的第一个参数转换为字符串,使用ToString内部操作(看起来exec方法的步骤1)。
  3. ToString内部操作,明确返回"null"当输入是 类型Null

总之,在你的例子中,正则表达式配衬对字符串'null',所以第一个非空格字符,在这种情况下,信'n'

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

null对象,以及对对象(非字符串),其首先被转换为字符串,然后测试其时给出这样的结果。

您可以试用/Number/.test(Number)/String/.test(String),这也会返回true

大概String(null)被调用,这是'null'

String(Number)会给

function Number() { 
    [native code] 
} 

/function Number/.test(Number)返回true

+5

从技术上讲,'null'不是一个对象,它是一个原始值,这种误解已存在多年,不幸的是,即使'typeof'运算符也是错误的,因为'typeof null =='object''完全不正确。遗憾的是,ECMAScript第5版修复这个问题已经太晚了。 http://wiki.ecmascript.org/doku.php?id=proposals:typeof – CMS 2010-03-12 05:43:36

+0

感谢@CMS的信息。 + 1ed给你。 – YOU 2010-03-12 05:50:55

相关问题