JavaScript之恶
零碎知识 JavaScript 0 154
  • 隐式类型转换:
    • 字符串拼接: 当一个字符串与非字符串类型的值进行拼接时,非字符串类型的值会被隐式转换为字符串。
    • 算术运算: 当一个操作符与非数值类型的值进行算术运算时,非数值类型的值会被隐式转换为数值。
    • 比较运算: 在比较运算中,JavaScript会尝试将两个操作数转换为相同的类型,然后再进行比较。这可能导致一些意外的结果。
    • 逻辑运算: 逻辑运算符&&||也会进行类型转换。对于&&运算符,如果第一个操作数为真值,则返回第二个操作数;如果第一个操作数为假值,则返回第一个操作数。对于||运算符,则相反。
      console.log("Hello" && "World"); // 输出 "World"
      console.log("" || "World"); // 输出 "World"
  • 作用域:
    • 变量如果没有使用varletconst关键字进行声明,就会被自动添加到全局作用域中,这可能会导致变量污染和不可预测的行为。
  • 函数:
    • 调用无参函数可以传递实参;调用有参函数可以不传递实参,数据没有丢失会放到js的一个内置数组对象arguments中。
      function func1(a, b){
          return a + b;
      }
      function func2(){
          return 2;
      }
      console.log(func1(); //  输出 undefined
      console.log(func2(1, 2)); // 输出 2
  • 数组:
    • 创建: 推荐只有在创建某个长度数组时采用new Array
      • new Array(3): 创建长度为3的数组
      • new Array(3.14): 报错
      • new Array("狗东西"): 创建只包含"狗东西"一个元素的数组
      • new Array(3,4): 包含元素3和4的数组
    • 长度:
      • 数组长度可以直接设置: arr.length = 2(自动截断后面的元素)
      • 数组不存在越界,访问越界元素时会自动在尾部填充undefined
    • splice【本意是拼接】
      • splice(ind, len): 删除从ind开始的len个元素
      • array.splice(ind, len, 'a', 'b', 'c'): 删除从ind开始的len个元素后在ind位置添加新元素
  • 对象:
    • this: this的指向在不同情况下会发生变化,特别是在嵌套函数中或使用箭头函数时,this的行为可能会令人困惑。
    • 原型继承: ES6以前JavaScript只能使用原型继承而不是经典的类继承,这种继承方式比较不直观
  • 异步:
    • 回调地狱: 在处理异步代码时,如果多个操作依赖于彼此的结果,可能会导致回调地狱(Callback Hell),代码难以理解和维护。【已通过Promiseasync/await解决】
  • "严格模式":
    • 禁止意外创建全局变量: 在严格模式下,如果变量未经声明就赋值,会引发 ReferenceError错误,而不是隐式创建一个全局变量。
    • 禁止删除变量: 在严格模式下,使用delete删除一个变量会导致语法错误。
    • 禁止重复参数名: 在严格模式下,函数参数名不能重复。
    • 禁止使用八进制字面量: 在严格模式下,八进制字面量会引发语法错误。
    • 禁止使用with语句: 在严格模式下,with语句会引发语法错误。
    • 提高eval的安全性: 在严格模式下,eval的行为更安全,它在自己的作用域中执行,而不是在当前作用域中。
    • 限制arguments对象: 在严格模式下,对arguments对象的修改会反映到对应的函数参数上,而且不允许arguments.calleearguments.caller的使用
编写
预览