纯前端算法 · 无后端 · 无数据库

地址是怎么来的?

一句话结论:它不是从任何数据库“查”来的,而是用内置的真实地名词典 + 格式规则,在你的浏览器里“拼”出来的。

1. 数据存在哪里

整个项目只有静态文件,没有服务器、没有接口、没有数据库。所有地名都写在 script.js 里的一个常量 countryData 中,结构大致如下:

us: {
  name: "United States", nameZh: "美国",
  states: {
    CA: { full: "California", zh: "加州",
          cities: ["Los Angeles", "San Diego", "San Jose", "Sacramento", "Fresno"],
          zipPrefixes: ["900", "921", "951", "958", "937"] },
    ...
  },
  streets: ["Main St", "Oak Ave", ...],
  firstName: [...], lastName: [...],
  phonePrefix: "+1", areaCodes: [...],
  zipPattern: prefix => prefix + 两位随机数
}

当前内置 6 个国家、约 87 个州/省、约 427 个城市。国家、州名、城市名、街道名、邮编前缀均为真实存在的名称,所以看上去很“真”。

2. 一条地址的生成步骤

  1. 选州/省:你指定了就用你选的,选“随机”则从该国所有州省中抽一个。
  2. 选城市 + 配对邮编前缀:关键一步。代码先抽一个城市下标 i,再用同一个下标取 zipPrefixes[i],因此城市与邮编是对得上的,不会出现“洛杉矶配纳帕邮编”这种穿帮。
  3. 锛邮编:把前缀交给该国的 zipPattern() 补齐尾数。
  4. 锛街道:1~9999 的门牌号 + 随机街道名。
  5. 锛人:名/姓各抽一个,性别 50/50;电话 = 国际前缀 + 真实区号 + 随机号码;邮箱 = 名.姓 + 数字 @ 主流邮箱域名。
  6. 拼完整地址:按国家习惯排行(见下表)。

整个过程用到的随机源就是 Math.random(),全部在本地完成,不会发出任何网络请求。

3. 各国格式规则

国家邮编形式完整地址排列
美国前缀 + 2 位(5 位)街道 / 城市, 州全称 邮编 / 国家
加拿大字母数字交错(A1A 1A1)街道 / 城市, 省全称 邮编 / 国家
英国前缀 + 数字 + 空格 + 数字字母字母街道 / 城市 / 邮编 / 国家
澳大利亚4 位纯数字街道 / 城市, 州全称 邮编 / 国家
德国 / 法国前缀 + 3 位(5 位)街道 / 邮编 城市 / 国家

州/省已统一改为官方全称(如 California、Ontario),下拉框、结果卡、完整地址、已保存列表均一致;两位缩写仅作为 stateCode 保留在 CSV / JSON 导出里,方便需要缩写的系统使用。

4. 隐私:为什么说数据不上传

  • 生成逻辑全在前端 JS,页面不包含任何上报接口。
  • 你保存的地址存在浏览器 localStorage 的 saved_addresses 里,主题/特效偏好存在 ag_theme、ag_mode、ag_effect。
  • 清消浏览器数据或点“清空全部”即彻底删除,服务端没有任何副本。

5. 局限与合规提醒

生成结果是格式合法但不可投递的:门牌号与邮编尾数是随机的,不对应真实住宅,也无法通过邮政校验(如 USPS 地址验证)。

适合:表单测试、UI 占位、数据库假数据、地址格式学习。不适合:真实寄送、身份验证、任何需要真实居住地址的场景。请勿用于欺诈或绕过平台风控。

← 回到生成器