严格模式下八进制字面量(如0123)直接报syntaxerror,因语法解析阶段即禁止隐式八进制;仅允许es6+标准形式0o17等,需通过"use strict"全局或函数级启用。

JavaScript 严格模式下,八进制字面量(如 0123)会被直接拒绝,不是“需要手动禁止”,而是语言规范本身禁止——只要启用了严格模式,这类写法就会触发 SyntaxError。
关键点在于:
- 非严格模式中,以
0开头的数字(如017)曾被部分引擎解释为八进制(历史遗留行为,已不推荐); - 严格模式彻底移除了这种隐式八进制解析,任何以
0开头、后跟十进制数字(不含o或O)的字面量都是非法的。
严格模式如何让八进制字面量失效
一旦启用严格模式,以下写法全部报错:
-
017→SyntaxError: Octal literals are not allowed in strict mode -
let num = 0755;→ 同样报错 const x = 00; // 即使是 00 也会被当作非法八进制
这是因为引擎在语法解析阶段就拒绝了这种形式,不进入执行环节。
合法的八进制写法(严格模式下唯一允许的形式)
如果确实需要八进制数值,必须使用标准的 ES6+ 八进制字面量语法:
- 以
0o或0O开头(小写 o 或大写 O),后面跟 0–7 的数字 - 例如:
0o17、0O755、0o0都是合法且跨环境兼容的 - 注意:
0b是二进制,0x是十六进制,它们在严格模式下完全不受影响
怎么确保你的代码运行在严格模式下
只有启用严格模式,上述限制才生效。启用方式有两种:
-
全局启用:脚本第一行(除注释外)写
"use strict"; -
函数级启用:在函数体第一行写
"use strict";,仅该函数受约束 - 注意:
"use strict"必须是作用域内第一个有效语句,前面不能有表达式或空行后的代码
为什么这样设计
禁用旧式八进制是为了消除歧义和潜在错误:
-
010在非严格模式下可能被当成八进制(值为 8),也可能被某些引擎当作十进制(导致不一致) - 统一要求显式前缀(
0o),让意图清晰、可读性强、便于引擎优化 - 避免因无意多写一个
0导致数值意外变化(比如0100≠100)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











