当前位置: 首页 > news >正文

刷题 | 牛客 - js简单10题(更ing)1/10知识点解答

知识点总结:

str.charCodeAt(位置)——返回指定位置的Unicode编码,不支持 超过 0xFFFF 的字符(emoji、生僻字)(即不支持 码点 > 65535,仅支持常规字符 如英文、数字), JS中 String(字符串)对象的方法

str.codePointAt(位置)——返回指定位置的完整码点(含),es6新增,支持所有编码(可以超出65535),支持代理对(即 支持高位字符,如 索引0),

.fromCodePoint() —— 可反向转换字符,用于从一个或多个 Unicode 码点创建字符串,支持完整的 Unicode 字符,包括 emoji、生僻字等超出 0xFFFF 的码点。

for循环:

场景建议使用
遍历普通对象属性for...in
遍历数组或字符串for...of
需要同时获取索引和值arr.entries() 搭配 for...of
遍历 Map、Setfor...of
使用对象中自定义方法或原型方法for...in 会包括它们,要注意过滤

JS48 获取字符串的长度

描述

如果第二个参数 bUnicode255For1 === true,则所有字符长度为 1
否则如果字符 Unicode 编码 > 255 则长度为 2

示例1

输入:

'hello world, 牛客', false

输出:17


解答

<!DOCTYPE html>
<html>

<head>
    <meta charset="UTF-8">
    <style>
       /* 填写样式 */
    </style>
</head>

<body>
    <!-- 填写标签 -->
    <script type="text/javascript">
        // 填写JavaScript
        function strLength(s, bUnicode255For1) {
            // 思想:求字符串中的unicode编码,并求对应的长度

            // 法一(两种写法):str.charCodeAt(i) 方法,求对应位置i上的字符的 Unicode编码
            /*
            let res = 0;
            if(bUnicode255For1){
                return s.length;
            }else{
                const arr = s.split('');
                for(let i=0;i<arr.length;i++){
                    let len = arr[i].charCodeAt(0) > 255 ? 2 : 1;
                    res += len;    
                }
                return res;
            }
            */

            /*
            let length = s.length;
            if(!bUnicode255For1){
                for(let i in s){
                    if(s.charCodeAt(i) > 255){
                        length++;
                    }
                }
            }
            return length;
            */

            // 法二: codePointAt ,支持所有Unicode
            /*
            let res = 0;
            if(bUnicode255For1){
                return s.length;
            }else{
                const arr = s.split('');
                for(let i=0;i<arr.length;i++){
                    let len = arr[i].codePointAt(0) > 255 ? 2 : 1;                res += len;
                }
                return res;
            }
            */

            let length = s.length;
            if(!bUnicode255For1){
                for(let i in s){
                    if(s.codePointAt(i) > 255){
                        length++;
                    }
                }
            }
            return length;
        }
    </script>
</body>

</html>

知识点

字符串方法

✅ 1.  str.charCodeAt(位置) —— 求位置中的字符 的 Unicode 编码 

是 JavaScript 中 String(字符串)对象的方法

回的是指定位置的字符的 Unicode 编码(UTF-16 编码单元)。

  • 参数:index,必需,整数,表示字符在字符串中的位置(从 0 开始计数)。

  • 返回:该位置字符的 Unicode 编码(0~65535 之间的十进制数字)。

  • 如果 index 超出范围,返回 NaN

  • 适合 BMP 基本多文种字符,即 普通英文、数字、拉丁字母

  • const code = 'A'.charCodeAt(0);

    console.log(code); // 输出:65(即 'A' 的 Unicode 编码)

  • 返回的是字符的 UTF-16 编码单元(16位以内)

  • 适合处理普通英文、数字、拉丁字母等基本字符

 例子:

let str = "ABC";

console.log(str.charCodeAt(0));  // 65  -> 'A'
console.log(str.charCodeAt(1));  // 66  -> 'B'
console.log(str.charCodeAt(2));  // 67  -> 'C'
console.log(str.charCodeAt(3));  // NaN -> 越界

注:charCodeAt 不能识别完整 emoji Unicode 扩展字符(码点 > 65535

如何获取完整的Unicode编码(码点):

使用 codePointAt( )——》即 使用 codePointAt() 处理 emoji 和高位字符 更准确

console.log("😀".codePointAt(0)); // 128512(十进制)即 U+1F600

✅ 2. str.codePointAt(位置) ——【ES6 引入】 ——(支持所有 Unicode 字符,推荐 👍)

codePointAt() JavaScript ES6 引入字符串方法,用于返回指定位置处字符的 Unicode 码点(code point),即完整的 Unicode 编码支持 emoji 和高位字符

语法:str.codePointAt(position)

  • position:字符串中某个字符的位置(索引,从 0 开始)
  • 返回字符的 Unicode 码点(十进制数)
  • 如果超出字符串范围,返回 undefined
实际应用场景
1. 判断字符串是否包含高位字符(如 emoji)
function hasHighCodePoint(str) {
  for (let ch of str) {
    if (ch.codePointAt(0) > 0xffff) {
      return true;
    }
  }
  return false;
}
console.log(hasHighCodePoint("hi😀")); // true
2. 获取字符的 Unicode 编码(十六进制)
let ch = '𠮷'; // 中文“吉”字的异体字
console.log(ch.codePointAt(0).toString(16)); // 20bb7
注意事项
codePointAt() 支持代理对(surrogate pair)
  • JS 字符串是基于 UTF-16,每个字符最多用两个编码单元(2×16位)

  • 对于编码大于 0xFFFF 的字符(如 emoji),使用 codePointAt() 可以正确获取 完整码点

✅ 使用 fromCodePoint() 可反向转换字符

let cp = "😄".codePointAt(0);

console.log(String.fromCodePoint(cp)); // 😄


fromCodePoint()String.fromCharCode() 区别

方法是否支持代理对(高位字符)返回值范围
String.fromCharCode()❌ 不支持,仅支持 BMP 区域0 ~ 65535 (0xFFFF)
String.fromCodePoint()✅ 支持所有 Unicode 字符0 ~ 0x10FFFF

例子:

const code = '𠮷'.codePointAt(0);

console.log(code); // 输出:134071(大于 0xFFFF 的字符)
  • 支持高位字符(例如 emoji、汉字扩展等)

  • 返回完整的 Unicode 码点值(即十进制)

let emoji = "😄"; // Unicode 编码是 U+1F604

console.log(emoji.codePointAt(0));   // 128516 ✅
console.log(emoji.charCodeAt(0));    // 55357 ❌(高位代理项)
console.log(emoji.charCodeAt(1));    // 56836 ❌(低位代理项)

str.codePointAt( ) 总结
项目内容
方法str.codePointAt(index)
返回Unicode 码点(十进制)
用途获取任意字符(包括 emoji)的完整编码
特点支持代理对,支持 UTF-16 以外字符
返回类型Number,如果越界则返回 undefined
对比更现代、更强大,推荐替代 charCodeAt()
 注:——代理对(Surrogate Pair)
总结:
术语含义
代理对表示 Unicode 编码超出 BMP(U+FFFF)的字符,需两个 UTF-16 单元
作用用于支持 emoji、生僻字等字符
示例"😄"、"𠮷"、"🧠"
判断方式charCodeAt(0) 返回大于 0xD800,小于 0xDBFF
推荐方法codePointAt() fromCodePoint() 支持完整字符处理

1.介绍

是一种在 UTF-16 编码中表示超出基本多语言平面(BMP,即 U+0000 到 U+FFFF)字符的方法。

  • JavaScript 使用 UTF-16 编码存储字符串。

  • 每个字符通常用 2 个字节(16 位)表示。

  • 但有些字符(比如 emoji 😄、生僻字 𠮷)码点超过了 0xFFFF(即 十进制 65535),需两个 16 位的单元来表示(即使用两个UTF-16单元编码),这两个单元就叫做 代理对


2.具体结构

写法顺序: 位代理项1  位代理项0

部分名称范围(十六进制)
高位代理项high surrogate——》如 索引00xD800 - 0xDBFF
低位代理项low surrogate0xDC00 - 0xDFFF

两者组合后表示一个码点范围在 U+10000 ~ U+10FFFF 的字符。


3. 为何要理解代理对:

js中,场景误差示例
.length把代理对当作两个字符"😄".length === 2
.charAt() 只能访问 UTF-16 单元"😄".charAt(0) 是乱码——》高位乱码
.charCodeAt() 只能取 0~65535不能获取完整码点
.codePointAt() ✅ 可正确处理代理对字符

4. 常用方法对代理对字符的支持情况

方法是否支持完整字符?
charCodeAt()❌ 不支持,返回 UTF-16 单元
codePointAt()✅ 支持
fromCharCode()❌ 不支持
fromCodePoint()✅ 支持(推荐)

例子:写法顺序: 位代理项1  位代理项0

let str = "😄"; // Unicode U+1F604
console.log(str.length);              // 2
console.log(str.charCodeAt(0));       // 55357 (0xD83D 高位代理项)
console.log(str.charCodeAt(1));       // 56836 (0xDE04 低位代理项)

console.log(str.codePointAt(0));      // 128516 (0x1F604 ✅ 正确码点)

codePointAt() 与 charCodeAt() 的区别

比较项charCodeAt()codePointAt()
支持范围基本多语言平面(BMP)U+0000 ~ U+FFFF支持所有 Unicode,包括辅助平面(如 emoji)
返回UTF-16 编码单元Unicode 码点(真正字符编码)
表情/特殊字符支持❌ 不支持完整字符,不支持 超过 0xFFFF 的字符(emoji、生僻字✅ 支持
返回类型十进制整数十进制整数

相关文章:

  • pdf转latex
  • 关于GEO的100个核心问题
  • Linux中进程
  • 微服务注册中心选择指南:Eureka vs Consul vs Zookeeper vs Nacos
  • Redis的事务
  • Cadence 修改 铜和pin脚 连接属性 和 光绘参数修改
  • AI Agent开发大全第二十三课-基于本地模型开发文本转语音
  • G1学习打卡
  • 1.5-APP的架构\微信小程序的架构
  • 【元表 vs 元方法】
  • JVM调优
  • WVP-PRO配置与部署
  • 人工智能——AdaBoost算法
  • ASP.NET Web 中进行 GET/POST 提交并接收返回数据的几种方案
  • 视频下载工具yt-dlp_macos
  • Linux学习——了解和熟悉Linux系统的远程终端登录
  • java设计模式-装饰者模式
  • 模拟考试系统(ssm+vue+mysql5.x)
  • 实验一 单管共射极放大电路
  • nps端口被占用
  • 做导购网站多少钱/企业管理软件排名
  • 石油大学网页设计与网站建设/怎么搭建属于自己的网站
  • 用什么开源框架做网站/公司网站设计报价
  • 英语写作网站/2021年十大热点事件
  • 万户做网站如何/软件外包公司排名
  • 贡嘎网站建设/站长工具大全