紧急!这些 JavaScript API 已经废弃!请慎用!

4 阅读4分钟

一、字符串操作类:这些老方法别再用了

1. String.prototype.substr()

废弃原因:属于非标准遗留特性,参数规则和substring、slice不一致,极易混淆,已被纳入ECMAScript附录B,仅为兼容旧代码保留,不推荐新代码使用。

❌ 错误写法(废弃)

const str'frontend';  
// 第一个参数是起始索引,第二个是截取长度,极易和substring搞混  
const res = str.substr(23); // 输出 'ont'

✅ 替代方案:String.prototype.substring() 或 String.prototype.slice()

// substring(起始索引, 结束索引)  
const res1 = str.substring(25); // 输出 'ont'  
// slice支持负数索引,更灵活,日常优先推荐  
const res2 = str.slice(25); // 输出 'ont'

2. String.prototype.trimLeft() / trimRight()

废弃原因:语义不统一,标准规范已推出语义更清晰的替代方法,部分新版浏览器已逐步移除支持。

❌ 错误写法(废弃)

const str'  hello world  ';  
str.trimLeft(); // 去除左侧空格  
str.trimRight(); // 去除右侧空格

✅ 替代方案:trimStart() / trimEnd()(语义一致,全现代浏览器支持)

str.trimStart(); // 替代trimLeft,语义更清晰  
str.trimEnd(); // 替代trimRight

3. escape() / unescape()

废弃原因:编码规则不标准,无法正确处理Unicode字符,存在安全风险,已被完全废弃,随时可能失效。

❌ 错误写法(废弃)

escape('前端开发'); // 编码结果不标准,特殊字符处理异常  
unescape('%u524D%u7AEF'); // 解码异常

✅ 替代方案:encodeURI() / encodeURIComponent()、decodeURI() / decodeURIComponent()

// 处理完整URL  
encodeURI('https://xxx.com/前端');  
// 处理URL参数,更常用  
encodeURIComponent('前端开发');  
// 对应解码  
decodeURIComponent('%E5%89%8D%E7%AB%AF%E5%BC%80%E5%8F%91');

二、日期时间类:千年虫+兼容性坑太多

1. Date.prototype.getYear() / setYear()

废弃原因:千年虫问题,返回的是年份减去1900的值,比如2024年返回124,极易导致逻辑错误,已被标准废弃。

❌ 错误写法(废弃)

const datenew Date();  
date.getYear(); // 2024年返回124,完全不符合预期

✅ 替代方案:getFullYear() / setFullYear()(返回完整4位年份,无bug)

date.getFullYear(); // 2024,正确返回  
date.setFullYear(2025); // 正确设置年份

2. Date.prototype.toLocaleFormat()

废弃原因:非标准方法,仅Firefox旧版本支持,Chrome、Safari完全不兼容,已被移除。

✅ 替代方案:Intl.DateTimeFormat()(标准国际化API,全浏览器兼容,格式化更灵活)

// 格式化日期:2024-05-20  
const formatternew Intl.DateTimeFormat('zh-CN', {  
  year'numeric',  
  month'2-digit',  
  day'2-digit'  
});  
formatter.format(new Date());

三、DOM与Web API类:安全+性能双坑

1. document.execCommand()

废弃原因:曾经用来做富文本、复制粘贴、文字加粗,但是兼容性极差,不同浏览器行为不一致,还存在XSS安全风险,现代浏览器已全面标记废弃,不再维护。

❌ 错误写法(废弃)

// 复制文本,老掉牙写法  
document.execCommand('copy');

✅ 替代方案:Clipboard API(navigator.clipboard),异步、安全、标准化,现代浏览器全覆盖

// 异步复制文本,推荐写法  
const copyTextasync (text) => {  
  try {  
    await navigator.clipboard.writeText(text);  
    console.log('复制成功');  
  } catch (err) {  
    console.error('复制失败', err);  
  }  
};

2. 同步XMLHttpRequest

废弃原因:同步请求会阻塞JS主线程,导致页面卡死、交互无响应,严重影响用户体验,官方强烈禁止使用,新版浏览器已抛出废弃警告。

❌ 错误写法(废弃)

// 第三个参数设为false,开启同步,卡死主线程  
const xhr = new XMLHttpRequest();  
xhr.open('GET''/api/data'false);  
xhr.send();

✅ 替代方案:fetch API(基于Promise,异步非阻塞,语法更简洁)

fetch('/api/data')  
  .then(res => res.json())  
  .then(data => console.log(data))  
  .catch(err => console.error(err));  
// 异步async/await写法更优雅  
const getDataasync () => {  
  try {  
    const res = await fetch('/api/data');  
    const data = await res.json();  
    return data;  
  } catch (err) {}  
};

3. event.srcElement / window.event

废弃原因:IE旧版本专属API,现代浏览器仅兼容保留,非标准写法,代码健壮性极差。

❌ 错误写法(废弃)

// IE旧版获取事件目标  
dom.onclick = function(e) {  
  const target = e.srcElement || window.event.srcElement;  
};

✅ 替代方案:event.target(W3C标准,全浏览器兼容)

dom.onclick = function(e) {  
  const target = e.target; // 标准写法,无兼容问题  
};

4. element.attachEvent()

废弃原因:IE专属事件绑定方法,仅IE5-IE10支持,IE11及现代浏览器已完全废弃,无法解绑事件,易造成内存泄漏。

✅ 替代方案:addEventListener()(标准事件监听,支持多事件绑定、事件捕获/冒泡)

// 标准绑定  
dom.addEventListener('click', handleClick, false);  
// 解绑  
dom.removeEventListener('click', handleClick);

四、对象与函数类:严格模式直接报错

1. arguments.callee / function.caller

废弃原因:严格模式下完全禁用,会泄漏函数调用上下文,破坏模块化,性能差,递归场景极易出现内存问题。

❌ 错误写法(废弃)

// 递归调用自身,严格模式报错  
function factorial(num) {  
  if(num <=1return 1;  
  return num * arguments.callee(num-1);  
}

✅ 替代方案:具名函数递归、箭头函数,避免依赖arguments.callee

// 具名函数递归,标准写法  
function factorial(num) {  
  if(num <=1) return 1;  
  return num * factorial(num-1);  
}

2. Object.prototype.proto / defineGetter/defineSetter

废弃原因:非标准原型访问方式,破坏原型链规范,存在安全隐患,已被标准API替代。

✅ 替代方案

  • proto 替换为 Object.getPrototypeOf() / Object.setPrototypeOf()
  • defineGetter 替换为 Object.defineProperty() / Object.getOwnPropertyDescriptor()

3. Object.observe() / Array.observe()

废弃原因:性能开销极大,API设计混乱,未进入正式标准,已被移除。

✅ 替代方案:Proxy(Vue3响应式核心,灵活度拉满,性能更优)