参考 > 发行说明 > MongoDB 2.4发行说明 > MongoDB 2.4中的JavaScript更改
考虑一下V8 JavaScript Engine在MongoDB 2.4中的以下影响:
小费
interpreterVersion()在mongoshell中使用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中使用。
undefinedSpiderMonkey和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()
方法。