IE11中使用‘if key in object’语法报错:Unexpected Identifier, string or number
嘿,我之前也踩过IE11兼容性的坑,结合你遇到的错误提示,除了你已经排查过的 trailing commas,还有几个高频问题值得你去检查:
ES6+语法未转译:IE11完全不支持大部分ES6及以上的语法特性,比如箭头函数
() => {}、let/const声明、解构赋值、模板字符串这些。举个例子,如果你的代码里写了const btn = document.querySelector('#btn');或者list.map(item => item.id),IE11会直接把这些它识别不了的语法当成“未预期的标识符”报错。- 适配方案:用Babel把ES6+代码转译为ES5,记得在
@babel/preset-env的配置里把targets设置为包含ie: "11",确保所有新语法都被转成IE能识别的代码。
- 适配方案:用Babel把ES6+代码转译为ES5,记得在
对象字面量的简写语法:比如
const username = 'James'; const user = { username };这种属性名简写,IE11不支持这种写法,会把username当成未识别的标识符。- 适配方案:改成完整的键值对写法
var user = { username: username };。
- 适配方案:改成完整的键值对写法
函数参数默认值:像
function fetchData(url = '/api/data') {}这种给参数设默认值的写法,IE11也不支持,会触发类似的错误。- 适配方案:在函数内部手动处理默认值,比如
function fetchData(url) { url = url || '/api/data'; }。
- 适配方案:在函数内部手动处理默认值,比如
Spread扩展操作符:不管是数组的
const newArr = [...oldArr, 'newItem'];还是对象的const newObj = { ...oldObj, status: 'active' };,IE11完全不认识这个语法,肯定会报错。- 适配方案:用ES5的方法替代,数组可以用
oldArr.concat('newItem'),对象可以用Object.assign({}, oldObj, { status: 'active' })。
- 适配方案:用ES5的方法替代,数组可以用
变量声明遗漏或拼写错误:有时候代码里某个变量漏写了
var/let/const,或者变量名拼写错误,IE11的错误提示可能会比较模糊,指向“Unexpected Identifier”。- 排查方案:逐行检查故障代码段里的变量,确保所有用到的变量都有正确声明,没有拼写失误。
举个适配前后的例子
原来的ES6代码:
const user = { name: 'James', age: 30 }; const getUserInfo = (user = {}) => `${user.name} is ${user.age} years old`; const updatedUser = { ...user, city: 'New York' };
转译为适配IE11的ES5版本:
var user = { name: 'James', age: 30 }; function getUserInfo(user) { user = user || {}; return user.name + ' is ' + user.age + ' years old'; } var updatedUser = Object.assign({}, user, { city: 'New York' });
如果排查完这些还是找不到问题,建议把注释掉的故障代码段贴出来,这样能更精准地定位问题~
内容的提问来源于stack exchange,提问作者James

