Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

重学js —— js数据类型:文本处理——String对象二:原型对象上的属性(一) #118

Open
lizhongzhen11 opened this issue Jun 10, 2020 · 0 comments
Labels
js基础 Good for newcomers 重学js 重学js系列 规范+MDN

Comments

@lizhongzhen11
Copy link
Owner

lizhongzhen11 commented Jun 10, 2020

文本处理——String对象二:原型对象上的属性(一)

  • MDN
  • 即固有对象 %StringPrototype%
  • 属于 String怪异对象,拥有为此类对象指定的内部方法
  • [[StringData]] 内置插槽,其值为空字符串
  • "length" 属性其值为0,属性描述符为 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }
  • [[Prototype]] 内置插槽其值为 %Object.prototype%

除非另有明确说明,下面定义的String原型对象方法并不通用,且传给它们的 this 值必须是 String 或拥有能被初始化为字符串的 [[StringData]] 内置插槽的对象。

thisStringValue(value)

  1. 如果 valueString 类型,返回 value
  2. 如果 valueObject 类型且 value[[StringData]] 内置插槽
    1. 定义 svalue.[[StringData]]
    2. 断言:sString 类型
    3. 返回 s
  3. TypeError 异常

String.prototype.charAt ( pos )

如果 posNumber 类型的整数,那么 x.charAt(pos) 结果与 x.substring(pos, pos + 1) 相同

  1. 定义 O? RequireObjectCoercible(this 值)
  2. 定义 S ? ToString(O)
  3. 定义 position? ToInteger(pos)
  4. 定义 sizeS 的长度
  5. 如果 position < 0position ≥ size,返回空字符串
  6. 返回长度为1的字符串值,其中包含来自 S 的一个代码单位,即索引位置的代码单位。

charAt 函数是通用的; 它不需要 this 值为 String 对象。 因此,可以被其他种类的对象使用。

String.prototype.charCodeAt ( pos )

  • MDN
  • 返回一个小于 65,536 的值,没找到返回 NaN
  • 注意与 codePointAt 区分
  1. 定义 O? RequireObjectCoercible(this 值)
  2. 定义 S ? ToString(O)
  3. 定义 position? ToInteger(pos)
  4. 定义 sizeS 的长度
  5. 如果 position < 0position ≥ size,返回 NaN
  6. 返回 Number 类型值,其为字符串 Sposition 位置的码元数值

String.prototype.codePointAt ( pos )

  • MDN
  • 没找到返回 undefined,与 charCodeAt 不同

返回一个 ≤ 0x10FFFF 非负整数,其为字符串中从索引 pos 开始的字符元素UTF-16码点。

  1. 定义 O? RequireObjectCoercible(this 值)
  2. 定义 S ? ToString(O)
  3. 定义 position? ToInteger(pos)
  4. 定义 sizeS 的长度
  5. 如果 position < 0position ≥ size,返回 undefined
  6. 定义 cp! CodePointAt (S, position)
  7. 返回 cp.[[CodePoint]]

String.prototype.concat ( ...args )

  • MDN
  • 建议用 (+,+=) 代替
  • 说它性能不好,估计与其内部用循环实现有关

String.prototype.

初始值为 %String%

String.prototype.endsWith ( searchString [ , endPosition ] )

  • MDN
  • searchString 不能是正则,否则抛 TypeError 异常

String.prototype.includes ( searchString [ , position ] )

// 我在这里栽过跟头
'2, 11'.includes('1') // true
// 事实上,我应该把它转成数组再查找看 '1' 是不是包含在内
['2', '11'].includes('1') // false
  1. 定义 O? RequireObjectCoercible(this 值)
  2. 定义 S ? ToString(O)
  3. 定义 isRegExp? IsRegExp(searchString)
  4. 如果 isRegExptrue,抛 TypeError 异常
  5. 定义 searchStr? ToString(searchString)
  6. 定义 pos? ToInteger(position)
  7. 断言:如果 positionundefined,则 pos 为 0
  8. 定义 lenS 的长度
  9. 定义 startmin(max(pos, 0), len)
  10. 定义 searchLensearchStr 的长度
  11. 如果存在整数 k 不小于 start 使得 k + searchLen 不超过 len,且对于所有小于 searchLen 的非负整数 jSk + j 位置的码元应该和 searchStrj 位置的相同,符合条件的话返回 true,否则返回 false

String.prototype.indexOf ( searchString [ , position ] )

// 如果没有提供确切地字符串,searchString 在算法内部会通过 ToString 转为 "undefined", 然后在当前字符串中查找这个值。
'undefined'.indexOf() // 0

String.prototype.lastIndexOf ( searchString [ , position ] )

String.prototype.localeCompare ( that [ , reserved1 [ , reserved2 ] ] )

包含ECMA-402国际化API的ECMAScript实现必须实现ECMA-402规范中指定的 localeCompare 方法。如果ECMAScript实现不包含ECMA-402 API,则使用以下 localeCompare 方法的规范。

当使用 that 参数调用 localeCompare 方法时,返回一个 Number 而不是 NaN,该 Number 值表示 this 值(转为字符串)与 that (转为字符串)值的区域设置敏感字符串比较结果。这两个字符串为 SThat。以实现定义的方式比较两个字符串。结果旨在按主机默认语言环境指定的排序顺序对String值进行排序,结果可能为负数,零或正数,具体取决于 S 排在 That 前面,还是 SThat 相等,或 S 是排在 That 后面。

执行比较之前,先执行以下步骤准备字符串:

  1. 定义 O? RequireObjectCoercible(this 值)
  2. 定义 S ? ToString(O)
  3. 定义 That ? ToString(that)

ECMA-402规范中定义了此方法可选的第二和第三参数的含义;不包含ECMA-402支持的实现不得将任何其他解释分配给这些参数位置。

如果将 localeCompare 方法视为 thisthat 两个参数的函数,则它是所有String集合上的 一致比较函数

实际的返回值是由实现定义的,允许实现在值中编码其他信息,但是需要该函数定义所有String的总顺序。此函数必须将 与Unicode标准规范等效的字符串视为相同,并且在比较被认为等效的字符串时必须返回0。

String.prototype.match ( regexp )

String.prototype.matchAll ( regexp )

String.prototype.normalize ( [ form ] )

  • MDN
  • 主要用来将Unicode码转换为其表示的字符
  1. 定义 O? RequireObjectCoercible(this 值)
  2. 定义 S ? ToString(O)
  3. 如果 formundefined,定义 f"NFC"
  4. 否则,定义 f? ToString(form)
  5. 如果 f 不是 "NFC""NFD""NFKC",或 "NFKD" 中的一个,抛 RangeError 异常
  6. 定义 ns 为字符串值,该值为将 S 标准化为 https://unicode.org/reports/tr15/ 中指定的以 f 命名的标准化形式的结果
  7. 返回 ns

2020-07-31 补充

Daily-Interview-Question第 114 题:找出字符串中连续出现最多的字符和个数

我写的最low,而且还看错题目了,没注意 连续 二字,还忘了 Math.max,这要是现场面试写的话直接挂了。

@lizhongzhen11 lizhongzhen11 added js基础 Good for newcomers 重学js 重学js系列 规范+MDN labels Jun 10, 2020
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
js基础 Good for newcomers 重学js 重学js系列 规范+MDN
Projects
None yet
Development

No branches or pull requests

1 participant