用 void 0 代替 undefined。任何变量在赋值前是 Undefined 类型、值为 undefined。undefined 是一个变量,而并非是一个关键字。null 是 JavaScript 关键字。undefined,表示JavaScript不识别它。

我们一般不会把变量赋值为 undefined。void该运算符指定要计算一个表达式但是不论该表达式原来是否有自己的返回值,其返回值都为undefined。void运算符的操作数可以是任意类型。

 

前端规范_赋值

 

前端规范_字符串_02

 

 

var声明一个变量和直接window.变量名还是有区别的

var声明的,虽然属于window,但是不直接作用在window上,能赋值也可以解释了

 

 

String 有最大长度是 2^53 - 1,最大长度,并不完全是你理解中的字符数。而是字符串的 UTF16 编码,受字符串的编码长度影响的。

1990 UCS-2 诞生
1995.5 JavaScript 诞生
1996.7 UTF-16 诞生

也就是说,Brendan Eich 在写 JS 的时候,UTF-16 还没问世,所以只能用 UCS-2 的方式来处理字符,也因此留下了隐患。

JS 认为每 16 位 (2 字节)即表示一个字符

坑 1——length 属性

>"💩".length
>2

坑 2——反转字符串

  1. ES6 的 Array.from 支持代理对的解析

> Array.from('😃')
< ["😃"]

坑 3——码点与字符互转

>> String.fromCodePoint(0x1F4A9)

'💩' // U+1F4A9

>> '💩'.codePointAt(0)

0x1F4A9

坑 4——正则匹配

正则匹配符​​.​​ 只能匹配单个 “字符”,但 js 将代理对当成两个单独的 “字符” 处理,所以匹配不到任何辅助平面字符。

从上面的例子中可以看出,ES6 已经在很努力地填坑了。对于 Unicode 字符,ES6 支持新的表示方法
​​​\u{1F4A9}​​​ 加上花括号后,可以把码点直接填进去来表示,而不用去计算代理对。再补充 2 点:
1. 为了向后兼容,字符串的 length 属性还是用双字节判断的,所以要用 Array.from(str).length。
2. 遍历字符串的时候,可以用 ​​​for(let s of str) {}​