内置对象、包装类型、String、字符串 API

273 阅读4分钟

1. 内置对象

  • ES 标准中规定的, 浏览器厂商已经实现的对象

  • 包括: 11 个

    • String, Number, Boolean -> 包装类型
    • Array, Date, Math, RegExp
    • Error
    • Function, Object
    • Global -> 在浏览器中被 window 代替

2. 包装类型

  • 什么是: 专门包装一个原始类型的值, 并提供操作原始类型值的 API
  • 为什么: 原始类型的值本身不具有任何功能
  • 何时: 一般不会主动使用
    • 只要试图用原始类型的值调用函数时, 会自动创建包装类型的对象, 调用对象的函数执行
  • 操作: Ex:
    • n.toFixed(2) -> typeof n -> number => new Number(n).toFixed(2)
    • str.charCodeAt() -> typeof str -> string => new String(str).charCodeAt()
  • 为什么 nullundefined不能调用任何方法: 因为没有对应的包装类型

3. String

  • 什么是: 由多个字符组成的只读字符数组

  • 对比数组:

    • 相同: 1. 下标 2. length 3. slice
    • 不同: 类型不同, API 不通用
      • 数组中凡是直接修改原数组的 API, 字符串都不能用

4. String API

  • 强调: 所有 String API 都无权修改原字符串, 只能返回新字符串

  1. 大小写转换

    • 将字符串中所有字母, 统一转为大写 或 小写
    • str.toLowerCase(): 将字符串中所有字母, 统一转为 小写
    • str.toUpperCase(): 将字符串中所有字母, 统一转为 大写
    • 何时: 不区分大小时
      • 验证码, 用户名, 电子邮件
  2. str.charAt(i): 获得指定位置的字符

    • 等同于 str[i]
  3. str.charCodeAt(i): 获得指定位置字符的 unicode

  4. String.fromCharCode(unicode): 将 unicode 号, 反向转回原文

    • 强调: 一次只能转一个字

  5. 获取子字符串: 3 种

    1. str.slice(starti, end + 1): 和数组的 slice 用法一样
    2. str.substring(starti, endi + 1): 用法同 slice, 但不支持负数
    3. str.substr(starti, n) => str.slice(starti, starti + n)
  6. 查找关键词: 4 种

    1. 查找一个固定关键词的位置:

      • 语法: var i = str.indexOf("关键词", fromi)
        • fromi 位置开始, 找 str 中下一个"关键词"的位置
      • 返回值: 找到的关键词的下标位置 i
        • 如果没找到, 返回 -1
      • 简写: 省略 fromi, 默认从位置 0 开始
      • 查找最后一个关键词的位置
        • var lasti = str.lastIndexOf("关键词")
      • 问题: 只能查找一个固定关键词的位置
        • 解决: 正则表达式
    2. 判断字符串中 是否包含 符合规则的关键词

      • 语法: var i = str.search(/reg/i)
      • 返回值: 返回关键词的位置
        • 如果没找到返回 -1
      • 问题: 正则表达式默认都是大小写敏感的
        • 解决: 在第二个 / 后加 i, 表示忽略大小写( ignore )
      • 何时: 只要仅判断有没有关键词时, 首选 search
      • 问题:
        1. 只能查找一个关键词
        2. 只能返回位置, 无法返回关键词内容
    3. 查找所有关键词的内容

      • 语法: var kwords = str.match(/reg/ig)
      • 返回值: 返回所有关键词组成的数组
        • 如果没找到, 返回 null
      • 问题: 正则表达式默认都只匹配第一个关键词
        • 解决: 在第二个 / 后加 g, 表示全部( global )
      • 何时: 仅希望获得关键词内容时
      • 问题: 仅能获得内容, 无法获得每个关键词的位置
        • 解决: 正则表达式 API -> reg.exec(str)
    4. 替换: 将字符串中找到的关键词, 替换为指定新内容

      1. 简单替换: 将所有关键词都替换为统一的内容

        • 语法: str = str.replace(/reg/ig, "新值")

        • Ex:

           var str = "No zuo no die, No can no bibi, nothing nano"
           str = str.replace(/\bno\b/ig, "**")
          console.log(str) // ** zuo ** die, ** can ** bibi, nothing nano
          
      2. 高级替换: 根据每个关键词的不同, 动态选择替换不同的新值

        • 语法:

          str = str.replace(/reg/ig, function(kw){
                  kw //可自动获得本次找到的关键词
                  return 根据kw的不同, 动态返回不同的值
          })
          
        • Ex:

          var str = "那天,我去了她家。我说:我草,你家真大!她想和我去草地野餐。我草草的收拾了草地。她说:我去去就来"
          str = str.replace( /我[去草]{1,2}/ig, function(kw){
            return kw.length==2 ? "**" : "***"
          })
          console.log(str) // 那天,**了她家。我说:**,你家真大!她想和***地野餐。***的收拾了草地。她说:***就来
          
        • 衍生: 删除 -> 将关键词替换为 ""

          • 语法: str = str.replace(/reg/ig, "")
    5. 切割: 按指定字符, 将一个字符串切割为多段子字符串

      • 语法: var subs = str.split(/reg/i)
      • 说明: 在切割后的结果数组中, 不包含切割符了
      • 固定套路: 将字符串打散为字符数组