夯实基础-js中String

78 阅读4分钟

前言

在阅读 现代Javascript教程过程中带着问题深度学习后总结记录了一些忽略的点,知其然知其所以然,温故而知新,文章分QA两部分,知道的同学可以直接划过。

Question

  • Javascript 字符串内部编码格式是什么?
  • 关于很长的字符串在编写代码时怎么控制显示长度不是很长,并增强可读性?
  • "😍".length的结果是多少?如果不正确的话如何修正?
  • 为什么字符串作为基础类型却可以调用方法?
  • 访问字符串某一个位置的字符,可以怎么做?有什么区别?
  • 转换为字符串类型有几种方式?
  • String()和new String()区别是?
  • 查找子字符串有几种方式?应用场景是什么?
  • "3" > "20"结果是什么?为什么?
  • 字符串乱码产生的原因是什么?怎么修复解决?

Answer

  • Javascript 字符串内部编码格式是什么?

    如今使用的是UTF-16,2012年前使用的是UCS-2【已经淘汰了】。原因这个阮一峰老师交代的特别清楚。

  • 关于很长的字符串在编写代码时怎么控制显示长度不是很长,并增强可读性?

    // 方式1:用 + 运算符分割
    const longString =
      "This is a very long string which needs " +
      "to wrap across multiple lines because " +
      "otherwise my code is unreadable.";
    // 方式2:在每行的末尾加上\,并且\后不能有任何字符
    const longString =
      "This is a very long string which needs \
    to wrap across multiple lines because \
    otherwise my code is unreadable.";
    
  • "😍".length的结果是多少?如果不正确的话如何修正?

    结果是2。对于普通字符占有2字节,返回1;而特殊字符或者emoji会**占有4字节,**会返回2。要想修正的话可以Array.from(string).length;或者使用for of迭代器计算

  • 为什么字符串作为基础类型却可以调用方法?

    1. 字符串 str 是一个原始值。因此,在访问其属性时引擎会创建一个包含字符串字面值的特殊对象,并且具有可用的方法,例如 toUpperCase()
    2. 调用方法运行并返回一个新的字符串。
    3. 引擎将这个特殊对象销毁,只留下原始值 str
  • 访问字符串某一个位置的字符,可以怎么做?有什么区别?

    | 方法 | 对于越位表现 | 是否支持负索引 | | -------- | ----------- | ------- | | charAt() | 返回"" | 否 | | [] | 返回undefined | 否 | | at() | 返回undefined | 是 |

  • 转换为字符串类型有几种方式?

    xxx.toString()、String(xxx)、${xxx}、"" + xxx

    ps:关于MDN的转换Symbol实践下来和说的不太一致

    Image.png

  • String()和new String()区别是?

    String就是转换最终还是基本类型,new String()最后就变成对象了,属于引用类型了,一般情况下也不会这样做

  • 查找子字符串有几种方式?应用场景是什么?

    | 方式 | 应用场景 | | ----------- | ---------------------- | | indexOf | 需要知道起始的索引位置 | | lastIndexOf | 需要从后面查找并知道索引位置【找文件扩展名】 | | includes | 仅仅判断是否存在,不关注索引。更语义化 | | 正则 | 其他复杂情景使用正则更强大 |

  • "3" > "20"结果是什么?为什么?

    结果是 true,因为比较的是字符的unicode码大小。具体原因如下:

    1. 首先比较两个字符串的首位字符大小。
    2. 如果一方字符较大(或较小),则该字符串大于(或小于)另一个字符串。算法结束。
    3. 否则,如果两个字符串的首位字符相等,则继续取出两个字符串各自的后一位字符进行比较。
    4. 重复上述步骤进行比较,直到比较完成某字符串的所有字符为止。
    5. 如果两个字符串的字符同时用完,那么则判定它们相等,否则未结束(还有未比较的字符)的字符串更大。

    ps:若有一方是数字上面的结果就会不一样了,因为会做类型转换

  • 文件字符串乱码产生的原因是什么?怎么修复解决?

    编写文件的时候指定的编码格式和最后服务器拿到二进制文件后存储时指定的编码格式不同,最终导致存储后在访问乱码。然后客户端在打开的时候的解码又有可能不一致,通俗理解就是驴唇不对马嘴。修复解决这个可以在保存的时候用编码嗅探库识别正确的编码后存储而不是一股脑用utf-8;然后客户端打开的时候选择正确的解码格式

参考链接: