纯前端算法 · 无后端 · 无数据库
地址是怎么来的?
一句话结论:它不是从任何数据库“查”来的,而是用内置的真实地名词典 + 格式规则,在你的浏览器里“拼”出来的。
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. 一条地址的生成步骤
- 选州/省:你指定了就用你选的,选“随机”则从该国所有州省中抽一个。
- 选城市 + 配对邮编前缀:关键一步。代码先抽一个城市下标
i,再用同一个下标取zipPrefixes[i],因此城市与邮编是对得上的,不会出现“洛杉矶配纳帕邮编”这种穿帮。 - 锛邮编:把前缀交给该国的
zipPattern()补齐尾数。 - 锛街道:
1~9999的门牌号 + 随机街道名。 - 锛人:名/姓各抽一个,性别 50/50;电话 = 国际前缀 + 真实区号 + 随机号码;邮箱 =
名.姓 + 数字 @ 主流邮箱域名。 - 拼完整地址:按国家习惯排行(见下表)。
整个过程用到的随机源就是 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 地址验证)。