es5-compliance

Compare original and translation side by side

🇺🇸

Original

English
🇨🇳

Translation

Chinese

ES5 Compliance for ServiceNow

ServiceNow的ES5合规性

ServiceNow runs on Mozilla Rhino engine which only supports ES5 JavaScript (2009 standard). All server-side scripts MUST use ES5 syntax.
ServiceNow基于Mozilla Rhino引擎运行,该引擎仅支持ES5 JavaScript(2009标准)。所有服务器端脚本必须使用ES5语法。

Forbidden Syntax (WILL CAUSE SyntaxError)

禁止使用的语法(会导致SyntaxError)

ES6+ SyntaxES5 Alternative
const x = 5
var x = 5
let items = []
var items = []
() => {}
function() {}
`Hello ${name}`
'Hello ' + name
for (x of arr)
for (var i = 0; i < arr.length; i++)
{a, b} = obj
var a = obj.a; var b = obj.b;
[a, b] = arr
var a = arr[0]; var b = arr[1];
...spread
Use
Array.prototype.slice.call()
class MyClass {}
Use constructor functions
async/await
Use GlideRecord callbacks
Promise
Use GlideRecord with callbacks
ES6+语法ES5替代方案
const x = 5
var x = 5
let items = []
var items = []
() => {}
function() {}
`Hello ${name}`
'Hello ' + name
for (x of arr)
for (var i = 0; i < arr.length; i++)
{a, b} = obj
var a = obj.a; var b = obj.b;
[a, b] = arr
var a = arr[0]; var b = arr[1];
...spread
使用
Array.prototype.slice.call()
class MyClass {}
使用构造函数
async/await
使用GlideRecord回调
Promise
使用GlideRecord回调

Common Patterns

常见模式

Variable Declarations

变量声明

javascript
// WRONG - ES6
const MAX_RETRIES = 3;
let currentUser = gs.getUser();

// CORRECT - ES5
var MAX_RETRIES = 3;
var currentUser = gs.getUser();
javascript
// 错误 - ES6
const MAX_RETRIES = 3;
let currentUser = gs.getUser();

// 正确 - ES5
var MAX_RETRIES = 3;
var currentUser = gs.getUser();

Functions

函数

javascript
// WRONG - Arrow functions
var active = incidents.filter(inc => inc.active);
var process = () => { return 'done'; };

// CORRECT - ES5 functions
var active = [];
for (var i = 0; i < incidents.length; i++) {
  if (incidents[i].active) {
    active.push(incidents[i]);
  }
}
var process = function() { return 'done'; };
javascript
// 错误 - 箭头函数
var active = incidents.filter(inc => inc.active);
var process = () => { return 'done'; };

// 正确 - ES5函数
var active = [];
for (var i = 0; i < incidents.length; i++) {
  if (incidents[i].active) {
    active.push(incidents[i]);
  }
}
var process = function() { return 'done'; };

String Concatenation

字符串拼接

javascript
// WRONG - Template literals
var message = `Incident ${number} assigned to ${user}`;

// CORRECT - String concatenation
var message = 'Incident ' + number + ' assigned to ' + user;
javascript
// 错误 - 模板字符串
var message = `Incident ${number} assigned to ${user}`;

// 正确 - 字符串拼接
var message = 'Incident ' + number + ' assigned to ' + user;

Loops

循环

javascript
// WRONG - for...of
for (var item of items) {
  gs.info(item);
}

// CORRECT - Traditional for loop
for (var i = 0; i < items.length; i++) {
  gs.info(items[i]);
}
javascript
// 错误 - for...of循环
for (var item of items) {
  gs.info(item);
}

// 正确 - 传统for循环
for (var i = 0; i < items.length; i++) {
  gs.info(items[i]);
}

Default Parameters

默认参数

javascript
// WRONG - Default parameters
function process(incident, priority = 3) {
  // ...
}

// CORRECT - Manual defaults
function process(incident, priority) {
  if (typeof priority === 'undefined') {
    priority = 3;
  }
  // ...
}
javascript
// 错误 - 默认参数
function process(incident, priority = 3) {
  // ...
}

// 正确 - 手动设置默认值
function process(incident, priority) {
  if (typeof priority === 'undefined') {
    priority = 3;
  }
  // ...
}

Automatic Validation

自动验证

Before deploying any server-side script:
  1. Check for
    const
    /
    let
    declarations - convert to
    var
  2. Check for arrow functions
    =>
    - convert to
    function()
  3. Check for template literals
    `
    - convert to string concatenation
  4. Check for destructuring
    {a, b}
    - convert to explicit property access
  5. Check for
    for...of
    loops - convert to index-based loops
在部署任何服务器端脚本之前:
  1. 检查
    const
    /
    let
    声明 - 转换为
    var
  2. 检查箭头函数
    =>
    - 转换为
    function()
  3. 检查模板字符串
    `
    - 转换为字符串拼接
  4. 检查解构
    {a, b}
    - 转换为显式属性访问
  5. 检查
    for...of
    循环 - 转换为基于索引的循环

Exception: Client Scripts

例外情况:客户端脚本

Client-side scripts (Client Scripts, UI Policies) run in the browser and MAY support ES6+ depending on user's browser. However, for maximum compatibility, ES5 is still recommended.
客户端脚本(Client Scripts、UI Policies)在浏览器中运行,根据用户浏览器的不同,可能支持ES6+。不过,为了最大兼容性,仍然推荐使用ES5。