
第一次让 AI 帮忙写代码时,很多人都会有一个惊喜的瞬间:
text
我只描述了一句话,它居然真的把代码写出来了。
接着,一个很自然的想法就出现了:
这段代码看起来没问题,是不是可以直接复制进项目?
答案是:有时可以作为起点,但不要默认可以直接使用。
这不是因为 AI 写出的代码一定有问题,而是因为"能生成代码"和"代码适合你的真实场景"是两回事。
一段代码真正可以使用,至少要满足:
- 语法正确,能够运行。
- 逻辑正确,符合需求。
- 能处理异常和边界情况。
- 符合当前项目的技术栈和代码规范。
- 经过你自己的验证。
今天这篇文章,我们就从零开始理解:
为什么 AI 写出的代码有时不能直接用?新手应该怎样检查?
一、先看一个例子:能运行,不等于结果正确
假设你的需求是:
text
商品满 100 元减 10 元;不足 100 元不打折。
你把需求交给 AI,它可能给出这样的 JavaScript 代码:
javascript
function calculateFinalPrice(price) {
return price * 0.9;
}
这段代码本身没有语法错误,也可以正常运行:
javascript
console.log(calculateFinalPrice(100)); // 90
看起来好像没问题。
但再试几个价格:
javascript
console.log(calculateFinalPrice(99)); // 89.1
console.log(calculateFinalPrice(200)); // 180
问题就出现了:
99元不满足满减条件,本应返回99,却被打了折。200元应该减10元,本应返回190,却变成了180。
AI 把"满 100 减 10"理解成了"所有商品打九折"。
这就是 AI 编程中最需要建立的第一个意识:
代码能运行,只能说明它没有明显语法错误;不能说明它已经实现了你的真实需求。
一个更符合需求的版本应该是:
javascript
function calculateFinalPrice(price) {
if (typeof price !== "number" || price < 0) {
throw new Error("商品价格必须是大于等于 0 的数字");
}
return price >= 100 ? price - 10 : price;
}
console.log(calculateFinalPrice(99)); // 99
console.log(calculateFinalPrice(100)); // 90
console.log(calculateFinalPrice(200)); // 190
同样是 AI 可以帮忙生成的代码,差别在于:需求是否被理解清楚,以及结果有没有经过验证。
二、AI 写出的代码,为什么不能默认直接用
1. AI 可能理解错你的需求
我们日常说的需求,经常省略了很多条件。
比如一句:
text
帮我写一个登录功能。
这里至少可能有很多不同理解:
- 使用账号密码登录,还是手机号验证码登录?
- 登录失败后提示什么?
- 密码错误次数过多时要不要限制?
- 登录成功后跳转到哪里?
- 是否需要记住登录状态?
- 是否需要区分普通用户和管理员?
如果这些条件没有告诉 AI,它只能根据常见情况猜测。
AI 的猜测可能合理,但不一定是你想要的结果。
所以,得到代码前先把需求说清楚,比让 AI "写得更快"更重要。
2. AI 不知道你的项目上下文
AI 默认并不了解你的项目,除非你主动提供相关信息。
例如,它不知道:
- 你的项目使用 Vue、React,还是原生 JavaScript。
- 你们接口请求使用的是
fetch、axios,还是团队封装的方法。 - 项目中的错误提示、日志和命名有什么规范。
- 某个功能已经有哪些工具函数和组件。
- 当前依赖版本是否支持它推荐的写法。
同一个"请求用户信息"的功能,在不同项目中的正确写法可能完全不同。
如果 AI 给出了一个项目中不存在的库、方法或目录结构,直接复制就可能报错,或者让代码风格越来越混乱。
因此,向 AI 提问时,至少补充这些信息会更可靠:
text
技术栈:Vue 3 + TypeScript
请求方式:使用项目封装的 request 方法
相关文件:src/api/user.ts
要求:不新增依赖,沿用现有错误处理方式
三、AI 容易漏掉"正常情况以外"的问题
很多 AI 生成的示例,优先覆盖的是最容易演示的正常流程。
例如,读取用户姓名:
javascript
function getUserName(user) {
return user.name;
}
当数据完整时,它没有问题:
javascript
console.log(getUserName({ name: "小明" })); // 小明
但真实数据不一定总是完整的:
javascript
getUserName(null);
getUserName({});
getUserName({ name: "" });
这时可能出现报错,或者得到不符合预期的结果。
更稳妥的写法是先处理可能出现的情况:
javascript
function getUserName(user) {
if (!user || typeof user.name !== "string" || user.name.trim() === "") {
return "未知用户";
}
return user.name;
}
对于新手来说,可以先记住 4 类最常见的遗漏:
- 参数为空,例如
null、undefined。 - 参数类型不对,例如把字符串传给数字计算。
- 数据不存在,例如接口没有返回预期字段。
- 边界值不对,例如
0、负数、最大值、最小值。
以后拿到 AI 生成的代码,不妨主动问自己:
如果输入为空、输入错误、数据缺失,代码会发生什么?
四、AI 可能给出"看起来很专业"的错误写法
AI 的回答通常表达流畅,代码注释也可能很完整。
这会让初学者产生一种错觉:
text
它解释得这么详细,应该就是对的。
但请记住,AI 也可能:
- 使用已经过时的 API。
- 推荐不存在的库或配置。
- 把不同版本的写法混在一起。
- 引用了不适合当前项目的方案。
- 给出有安全隐患的处理方式。
例如,在网页中直接把不可信内容拼接到 innerHTML:
javascript
element.innerHTML = userInput;
这段代码很短,也能显示内容,但如果 userInput 来自用户输入,就可能带来安全风险。
因此,遇到下面这些情况时,要多做一步确认:
- AI 建议安装一个你从未见过的依赖。
- AI 给出很多复杂配置。
- AI 让你修改权限、支付、用户信息等敏感逻辑。
- AI 推荐删除、覆盖或批量修改文件。
- AI 的写法和项目现有代码明显不同。
不确定时,可以继续追问 AI:
text
这段代码依赖哪些库和版本?
它有哪些风险?
有没有不新增依赖的写法?
请结合这段现有代码检查是否兼容。
AI 可以帮助你继续分析,但最终仍然要以项目文档、官方文档和实际运行结果为准。
五、AI 不会自动替你运行和验证全部场景
即使 AI 生成的代码逻辑看起来正确,它也不一定真的在你的项目中运行过。
比如下面这些问题,通常只有运行后才会发现:
- 变量名写错。
- 导入路径不对。
- 依赖没有安装。
- 类型不匹配。
- 接口返回字段和预期不同。
- 浏览器、Node.js 或框架版本不兼容。
- 修改影响了其他已有功能。
所以,AI 给出的代码更适合看作:
一份等待验证的代码草稿。
不是最终答案,也不是可以跳过测试的通行证。
六、新手拿到 AI 代码后,应该怎么检查
不需要一开始就掌握复杂的测试工具。
先完成下面这 5 步,就已经能避开很多问题。
第 1 步:先读懂,再复制
不要看到代码就立刻粘贴。
至少确认:
- 每个函数是做什么的。
- 每个参数代表什么。
- 返回结果是什么。
- 哪一段代码会修改数据。
- 有没有调用你不认识的方法或库。
如果看不懂,可以继续让 AI 解释:
text
请逐行解释下面这段代码。
说明每个变量、函数和判断条件的作用。
不要只解释语法,也请说明它解决了什么问题。
看懂不等于要背下所有代码,而是要知道它大致在做什么。
第 2 步:先在小范围运行
不要刚拿到代码就直接放进正式项目或线上环境。
可以先:
- 放到一个临时文件中运行。
- 在测试页面中调用。
- 使用测试数据验证。
- 先修改一个小模块,而不是一次改很多文件。
例如,上面的满减函数可以先手动测试几组数据:
javascript
console.log(calculateFinalPrice(99)); // 预期:99
console.log(calculateFinalPrice(100)); // 预期:90
console.log(calculateFinalPrice(200)); // 预期:190
只要预期结果和真实结果不一致,就说明还不能直接使用。
第 3 步:主动测试边界情况
新手最容易只测试"正常输入":
javascript
calculateFinalPrice(100);
但更容易出问题的,往往是这些输入:
javascript
calculateFinalPrice(0);
calculateFinalPrice(99);
calculateFinalPrice(-1);
calculateFinalPrice("100");
calculateFinalPrice(null);
你不需要一下子想到所有情况。
可以把函数和需求交给 AI,让它帮助你列测试清单:
text
下面是一个计算商品最终价格的函数和业务规则。
请不要修改代码,只帮我列出需要手动测试的正常、边界和异常场景。
这是一种很适合初学者的用法:让 AI 帮你发现"还没有测试到什么"。
第 4 步:检查它是否符合你的项目
把 AI 生成的代码放进项目之前,检查:
- 文件应该放在哪里?
- 导入路径是否正确?
- 使用的变量、组件和方法在项目中是否存在?
- 命名是否符合项目现有风格?
- 是否额外安装了不必要的依赖?
- 是否修改了本次需求不需要修改的地方?
如果不确定,可以把相关的现有代码一并提供给 AI,并明确要求:
text
请只根据当前项目已有的写法修改。
不要新增依赖,不要修改无关文件。
如果信息不足,请先提问,不要自行假设。
第 5 步:保留你的判断权
AI 说"这样写更好",不代表你必须接受。
当你看到一个建议时,可以问:
- 它解决了什么问题?
- 它会带来什么副作用?
- 有没有更简单的实现?
- 是否真的符合当前需求?
- 我能不能通过运行或测试验证它?
这几个问题,会让你逐渐从"复制代码的人"变成"能够判断代码的人"。
七、一份可收藏的 AI 代码检查清单
每次准备使用 AI 生成的代码前,可以快速检查下面这份清单:
text
需求检查
[ ] 这段代码解决的是我真正要解决的问题吗?
[ ] AI 是否误解了规则、范围或输出要求?
理解检查
[ ] 我知道每个关键函数和条件在做什么吗?
[ ] 我知道它会修改哪些数据或文件吗?
运行检查
[ ] 我已经在小范围运行过了吗?
[ ] 正常输入的结果符合预期吗?
边界检查
[ ] 空值、错误类型和边界值会怎样?
[ ] 失败时是否有清晰的处理方式?
项目检查
[ ] 使用的依赖、方法和版本在项目中存在吗?
[ ] 是否符合现有项目的目录、命名和错误处理规范?
[ ] 是否修改了无关内容?
最终确认
[ ] 我是否真的理解并验证了这段代码?
刚开始不需要每一项都做到非常专业。
只要养成"先理解、再运行、再验证"的习惯,你使用 AI 编程的风险就会明显降低。
八、总结
AI 可以快速帮我们生成代码,但它不知道全部业务规则,也不会天然理解你的项目,更不能替你承担最终结果。
所以,AI 写出的代码有时不能直接用,常见原因是:
- AI 可能误解需求。
- AI 不知道项目上下文。
- AI 容易遗漏异常和边界情况。
- AI 可能使用不兼容、过时或不安全的写法。
- 代码还没有在你的真实环境中验证过。
对初学者来说,最重要的不是马上学会写复杂 Prompt,而是先建立一个简单习惯:
text
看懂代码
↓
小范围运行
↓
测试正常和异常情况
↓
确认符合项目要求
↓
再使用
请记住:
AI 生成代码,是开发工作的开始,不是结束。
下一篇文章,我们继续聊一个新手特别容易踩的坑:
新手最常见的 5 个 AI 编程误区。
✍坚持原创,求关注,点赞,收藏