- 隐式类型转换:
- 字符串拼接: 当一个字符串与非字符串类型的值进行拼接时,非字符串类型的值会被隐式转换为字符串。
- 算术运算: 当一个操作符与非数值类型的值进行算术运算时,非数值类型的值会被隐式转换为数值。
- 比较运算: 在比较运算中,JavaScript会尝试将两个操作数转换为相同的类型,然后再进行比较。这可能导致一些意外的结果。
- 逻辑运算: 逻辑运算符
&&
和||
也会进行类型转换。对于&&
运算符,如果第一个操作数为真值,则返回第二个操作数;如果第一个操作数为假值,则返回第一个操作数。对于||
运算符,则相反。console.log("Hello" && "World"); // 输出 "World" console.log("" || "World"); // 输出 "World"
- 作用域:
- 变量如果没有使用
var
、let
或const
关键字进行声明,就会被自动添加到全局作用域中,这可能会导致变量污染和不可预测的行为。
- 变量如果没有使用
- 函数:
- 调用无参函数可以传递实参;调用有参函数可以不传递实参,数据没有丢失会放到js的一个内置数组对象
arguments
中。function func1(a, b){ return a + b; } function func2(){ return 2; } console.log(func1(); // 输出 undefined console.log(func2(1, 2)); // 输出 2
- 调用无参函数可以传递实参;调用有参函数可以不传递实参,数据没有丢失会放到js的一个内置数组对象
- 数组:
- 创建: 推荐只有在创建某个长度数组时采用
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),代码难以理解和维护。【已通过
Promise
与async/await
解决】
- 回调地狱: 在处理异步代码时,如果多个操作依赖于彼此的结果,可能会导致回调地狱(Callback Hell),代码难以理解和维护。【已通过
- "严格模式":
- 禁止意外创建全局变量: 在严格模式下,如果变量未经声明就赋值,会引发 ReferenceError错误,而不是隐式创建一个全局变量。
- 禁止删除变量: 在严格模式下,使用
delete
删除一个变量会导致语法错误。 - 禁止重复参数名: 在严格模式下,函数参数名不能重复。
- 禁止使用八进制字面量: 在严格模式下,八进制字面量会引发语法错误。
- 禁止使用
with
语句: 在严格模式下,with
语句会引发语法错误。 - 提高
eval
的安全性: 在严格模式下,eval
的行为更安全,它在自己的作用域中执行,而不是在当前作用域中。 - 限制
arguments
对象: 在严格模式下,对arguments
对象的修改会反映到对应的函数参数上,而且不允许arguments.callee
和arguments.caller
的使用