'); // '<div class="a">'
XUtils.HTMLDeCode('<div>'); // '
'
```
### Cookie 操作
| 方法 | 参数 | 返回值 | 说明 |
|------|------|--------|------|
| `getCookie(name)` | `string name` — Cookie 名 | `string | null` | 获取指定 Cookie 的值,不存在则返回 `null` |
| `setCookie(name, value, expiredays)` | `string name` — Cookie 名
`string value` — Cookie 值
`number expiredays` — 过期天数(可选) | 无 | 设置 Cookie,可指定过期天数 |
```javascript
// 设置 Cookie,7 天过期
XUtils.setCookie('theme', 'dark', 7);
// 设置 Cookie,会话结束即失效
XUtils.setCookie('session_id', 'abc123');
// 获取 Cookie
const theme = XUtils.getCookie('theme'); // 'dark'
const none = XUtils.getCookie('notexist'); // null
```
### 数值工具
| 方法 | 参数 | 返回值 | 说明 |
|------|------|--------|------|
| `randomBool()` | 无 | `boolean` | 获取随机布尔值 |
| `isEven(num)` | `number num` | `boolean` | 判断数字是否为偶数 |
| `average(...args)` | `...number args` | `number` | 计算所有参数的平均值 |
| `toFixed(n, fixed)` | `number n` — 数值
`number fixed` — 小数位数 | `number` | 保留小数位(截断方式,非四舍五入) |
```javascript
XUtils.randomBool(); // true 或 false
XUtils.isEven(4); // true
XUtils.isEven(3); // false
XUtils.average(1, 2, 3, 4); // 2.5
XUtils.toFixed(25.198726, 2); // 25.19(截断,非四舍五入)
XUtils.toFixed(25.198726, 4); // 25.1987
```
### 日期与温度
| 方法 | 参数 | 返回值 | 说明 |
|------|------|--------|------|
| `isWeekDay(date)` | `Date date` | `boolean` | 判断日期是否为工作日(周一至周五) |
| `timeFromDate(date)` | `Date date` | `string` | 从日期中提取时间字符串 `HH:MM:SS` |
| `celsiusToFahrenheit(celsius)` | `number celsius` | `number` | 摄氏度转华氏度 |
| `fahrenheitToCelsius(fahrenheit)` | `number fahrenheit` | `number` | 华氏度转摄氏度 |
```javascript
XUtils.isWeekDay(new Date(2024, 0, 8)); // true(周一)
XUtils.isWeekDay(new Date(2024, 0, 6)); // false(周六)
XUtils.timeFromDate(new Date(2024, 0, 1, 17, 30, 0)); // '17:30:00'
XUtils.celsiusToFahrenheit(0); // 32
XUtils.celsiusToFahrenheit(100); // 212
XUtils.fahrenheitToCelsius(32); // 0
XUtils.fahrenheitToCelsius(212); // 100
```
### DOM 操作
| 方法 | 参数 | 返回值 | 说明 |
|------|------|--------|------|
| `createScriptElement(url, callback)` | `string url` — 脚本 URL
`Function callback` — 加载完成回调(可选) | 无 | 动态加载外部 JS 脚本,兼容 IE |
| `removeClassElement(selectors, once)` | `string | string[] selectors` — CSS 选择器或数组
`boolean once` — 仅移除首个匹配(可选,默认 `false`) | 无 | 移除匹配选择器的 DOM 元素 |
```javascript
// 加载外部脚本
XUtils.createScriptElement('https://cdn.example.com/lib.js', () => {
console.log('脚本加载完成');
});
// 移除所有匹配元素
XUtils.removeClassElement('.ad-banner');
XUtils.removeClassElement(['.ad-banner', '.popup-overlay']);
// 仅移除第一个匹配元素
XUtils.removeClassElement('.notification', true);
```
### 数据转换
| 方法 | 参数 | 返回值 | 说明 |
|------|------|--------|------|
| `jsonToCsv(jsonData)` | `Object[] jsonData` — 对象数组 | `string` | 将 JSON 对象数组转换为 CSV 字符串 |
```javascript
const data = [
{ name: '张三', age: 25, city: '北京' },
{ name: '李四', age: 30, city: '上海' }
];
const csv = XUtils.jsonToCsv(data);
// "name,age,city\n张三,25,北京\n李四,30,上海\n"
// 配合 downloadText 导出 CSV 文件
XUtils.downloadText('users.csv', csv);
```
### 函数工具
| 方法 | 参数 | 返回值 | 说明 |
|------|------|--------|------|
| `toOnceFn(fn)` | `Function fn` — 源函数 | `Function` | 创建只执行一次的函数包装,第二次调用不再执行 |
```javascript
// 确保初始化逻辑只执行一次
const init = XUtils.toOnceFn(() => {
console.log('初始化完成');
});
init(); // 输出 "初始化完成"
init(); // 不再执行,返回 undefined
```
## 浏览器兼容
| 浏览器 | 最低版本 |
|--------|----------|
| Chrome | 60+ |
| Firefox | 55+ |
| Safari | 11+ |
| Edge | 79+ |
| Node.js | 8+ |
> **注意**:依赖 DOM/BOM 的函数(`downloadText`、`getCookie`、`setCookie`、`createScriptElement`、`removeClassElement`)在 Node.js 环境中不可用。其他纯逻辑函数(`sleep`、`isPromise`、`isAsyncFunction`、`reverse`、`average` 等)可在任何 JavaScript 环境中使用。
## 版本历史
| 版本 | 日期 | 说明 |
|------|------|------|
| 1.0.0 | 2023-12-10 | 初始版本,从油猴脚本重构为纯 JS 库 |
## 许可证
MIT License - 详见 [LICENSE](../../LICENSE)