> For the complete documentation index, see [llms.txt](https://keenv.gitbook.io/notes/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://keenv.gitbook.io/notes/javascript.md).

# JavaScript 知识点

1. 根据具体需要，JavaScript 按照如下规则将变量转换成布尔类型：
   1. false、0、空字符串("")、NaN、null 和 undefined 被转换为 false
   2. 所有其他值被转换为 true
2. 在 JavaScript 中声明一个新变量的方法是使用关键字 let 、const 和 var： 1. let 语句声明一个块级作用域的本地变量（没有变量提升）

   ```
    **polyfills实现原理：**使用var声明这个变量，在es6之前js是没有块级作用域只有函数作用域，那么它的作用域是整个函数，并且是不同于原来的变量名，在同一块内&&出现在声明代码之后&&访问此变量值的地方会被替换成新的变量名，这样便限制了变量的作用域在块内，如果块内有异步函数访问这个变量，便会通过函数参数把变量传递给异步函数
   ```

   1. const 允许声明一个不可变的常量（块级作用域，没有变量提升）

      **polyfills实现原理：**&#x4E0E;let不同的是const的值不能变化，那么内部实现与let不同的是对变量的重新赋值操作不会把变量名替换为新的变量名，这样便限制了对变量的改变
   2. var 是最常见的声明变量的关键字（变量提升）
3. 当使用＋运算符连接字符串
   * `"hello" + " world"; // hello world`
   * `"3" + 4 + 5; // 345`
   * `3 + 4 + "5"; // 75`
4. 逻辑运算符
   1. `expr1 && expr2` 当expr1被转换为false时，返回expr1；否则返回expr2
   2. `expr1 || expr2` 当expr1被转换为true时，返回expr1；否则返回expr2
5. 关键字 this。当使用在函数中时，this 指代当前的对象，也就是调用了函数的对象。如果在一个对象上使用点或者方括号来访问属性或方法，这个对象就成了 this。如果并没有使用“点”运算符调用某个对象，那么 this 将指向全局对象（global object）。
6. new 方法的简单实现：

   ```
   function trivialNew(constructor, ...args) {
    var o = {}; // 创建一个对象
    constructor.apply(o, args);
    return o;
   }
   以下两种方式等效
   var bill = trivialNew(Person, "William", "Orange");
   var bill = new Person("William", "Orange");
   ```
7. 计算属性名：

   ```
   this.setState({
   });
   相当于如下ES5语法
   var partialState = {};
   partialState[name] = value;
   this.setState(partialState);
   ```
