参考 > 发行说明 > MongoDB 2.4发行说明 > MongoDB 2.4中的JavaScript更改
考虑一下V8 JavaScript Engine在MongoDB 2.4中的以下影响:
小费
interpreterVersion()
在mongo
shell中使用new 方法,
并javascriptEngine
在输出中使用字段db.serverBuildInfo()
来确定MongoDB二进制文件使用哪个JavaScript引擎。
以前,需要JavaScript解释器的MongoDB操作必须获得一个锁,并且一个操作一次mongod
只能运行一个JavaScript操作。切换到V8通过允许同时运行多个JavaScript操作来提高并发性。
ECMAscript的第五版(缩写为ES5)增加了许多新的语言功能,包括:
在V8中,MongoDB支持Javascript的ES5实现,但以下情况除外。
注意
以下功能在MongoDB查询返回的文档上无法正常工作 :
Object.seal()
从MongoDB查询返回的文档上引发异常。Object.freeze()
从MongoDB查询返回的文档上引发异常。Object.preventExtensions()
错误地允许在从MongoDB查询返回的文档上添加新属性。enumerable
属性添加到MongoDB查询返回的文档中时,在写操作期间不会保存。有关更多信息,请参见SERVER-8216,SERVER-8223, SERVER-8215和SERVER-8214。
对于尚未从MongoDB查询返回的对象,这些功能将按预期工作。
V8并没有支持以下非标准 的SpiderMonkey JavaScript扩展,以前MongoDB的使用的SpiderMonkey作为其JavaScript引擎支持。
V8不支持非标准的 E4X扩展。E4X为 JavaScript语言提供了本机XML对象,并添加了将文字XML文档嵌入JavaScript代码中的语法。
如果使用以下任何构造函数/方法,则需要使用替代XML处理:
XML()
Namespace()
QName()
XMLList()
isXMLName()
Iterator()
,StopIteration()
和发电机¶InternalError()
¶V8不支持InternalError()
。使用Error()
代替。
for each...in
构造¶V8不支持在
构造中使用each。使用construct。for (var x in y)
例
以下构造
对V8 无效:for each (var x in y)
相反,在版本2.4中,可以使用以下
结构:for (var x in y)
您还可以将数组实例方法forEach()
与ES5方法一起使用Object.keys()
:
V8不支持数组推导。
使用其他方法,如Array
实例方法map()
,
filter()
或forEach()
。
例
对于V8,以下数组推导无效:
相反,您可以使用Array
instance方法
forEach()
和ES5方法来实现Object.keys()
:
注意
新逻辑使用Array
实例方法forEach()
而不是通用方法Array.forEach()
; V8并没有
支持Array
通用的方法。有关更多信息,请参见数组通用方法。
V8不支持多个catch
块,并且会抛出
SyntaxError
。
例
以下多个catch块对于V8 无效,并将抛出:"SyntaxError: Unexpected token if"
与条件函数定义相比,V8将产生与SpiderMonkey不同的结果。
例
以下条件函数定义在SpiderMonkey与V8中产生不同的结果:
对于SpiderMonkey,条件函数输出undefined
,而对于V8,条件函数输出function
。
如果您的代码以这种方式定义函数,则强烈建议您重构代码。以下示例重构了条件函数定义,使其可同时在SpiderMonkey和V8中使用。
undefined
SpiderMonkey和V8中的重构代码输出。
V8不支持String泛型。字符串泛型是String
类上反映实例方法的一组方法。
例
以下使用泛型方法
String.toLowerCase()
是无效的与V8:
随着V8,使用String
实例方法toLowerCase()
可以通过一个实例中的String
类,而不是:
在V8中,请使用String
实例方法代替以下
通用方法:
String.charAt() |
String.quote() |
String.toLocaleLowerCase() |
String.charCodeAt() |
String.replace() |
String.toLocaleUpperCase() |
String.concat() |
String.search() |
String.toLowerCase() |
String.endsWith() |
String.slice() |
String.toUpperCase() |
String.indexOf() |
String.split() |
String.trim() |
String.lastIndexOf() |
String.startsWith() |
String.trimLeft() |
String.localeCompare() |
String.substr() |
String.trimRight() |
String.match() |
String.substring() |
V8不支持Array通用方法。数组泛型是Array
类上反映实例方法的一组方法。
例
以下使用泛型方法Array.every()
是
无效的与V8:
随着V8,使用Array
实例方法every()
可以通过一个实例中的Array
类,而不是:
在V8中,请使用Array
实例方法代替以下
通用方法:
Array.concat() |
Array.lastIndexOf() |
Array.slice() |
Array.every() |
Array.map() |
Array.some() |
Array.filter() |
Array.pop() |
Array.sort() |
Array.forEach() |
Array.push() |
Array.splice() |
Array.indexOf() |
Array.reverse() |
Array.unshift() |
Array.join() |
Array.shift() |
toSource()
¶V8不支持Array
实例方法toSource()。请改用Array
实例方法toString()
。
uneval()
¶V8不支持非标准方法uneval()
。请改用标准化的JSON.stringify()
方法。