JS冷门知识点(一)

66 阅读7分钟

以下是我在工作中经常忘记,或者总是想不起使用的一些知识点总结,如有错误欢迎指正

1.操作符也叫运算符,操作数也叫运算元

// 1,2 是操作数,或运算元;+ 是运算符或操作符

let a = 1 + 2;

2. 二元 + 是唯一支持字符串的运算符

二元 + 是唯一一个支持字符串的运算符。其他算术运算符只对数字起作用,并且总是将其运算元转换为数字

一元运算符加号,或者说,加号 + 应用于单个值,对数字没有任何作用。但是如果运算元(也叫操作数)不是数字,加号 + 则会将其转化为数字


'1' + 2 + 2; // "122",不是 "14"

+'1' // 1;

3. 不同基本类型的运算元比较时的类型转换

1). 对不同类型的值进行相等检查时,运算符 == 会将不同类型的值转换为数字(Symbol,null,undefined类型除外,此三种类型在使用 == 判断时,不会转换数字)

2). 除此外 >、<、>=、<= 不同基本类型的运算符也会先转为数字类型(Symbol类型比较会报错,Symbol类型不能隐式地转换为其他类型进行比较,会导致 TypeError 错误,因此只能使用 === 或 !== 进行比较)

3). 同是字符串类型的数据进行比较时,是按字典序比较

4). 对 undefined 进行数字型转换时,输出结果为 NaN,而非 0;null进行数字转换是为 0

5). 需要注意: null 和 undefined,使用 == 比较时,它们彼此相等和其它值都不会相等(固定规则,在与其他值使用==判断时不会进行类型转换;但大小>,<,>=,<=比较会进行数字转换)

4. 基本类型的类型转换

有三种常用的类型转换:

1). 转换为 string 类型

2). 转换为 number 类型

3). 转换为 boolean 类型

字符串转换 —— 转换发生在输出内容的时候,也可以通过 String(value) 进行显式转换。原始类型值的 string 类型转换通常是很明显的。


//什么情况变量会转换字符串

alert(x);

anotherObj[x] = 123; //x为非 Symbol 类型

'a' + x

数字型转换 —— 转换发生在进行算术操作时,也可以通过 Number(value) 进行显式转换。

例如:除去 二元+ 外的其它数学运算符,如:+a, -a, ++a, a-b, a*b, a/b 等等。(二元加法 + 可用于字符串(连接),也可以用于数字(相加))

除此外使用 >、<、>=、<= 运算符比较时,不同基本类型的运算元也会先转为数字类型(Symbol类型除外,Symbol类型不能隐式地转换为其他类型进行比较,会导致 TypeError 错误,因此只能使用 === 或 !== 进行比较;)

数字型转换遵循以下规则:

转换值
undefinedNaN
null0
true / false1 / 0
String“按原样读取”字符串,两端的空白字符(空格、换行符 \n、制表符 \t 等)会被忽略。空字符串变成 0。转换出错则输出 NaN

布尔型转换 —— 转换发生在进行逻辑操作时,也可以通过 Boolean(value) 进行显式转换。

布尔型转换遵循以下规则:

转换值
0, null, undefined, NaN, ""false
其他值true

注意: 上述的大多数规则都容易理解和记忆。人们通常会犯错误的值得注意的例子有以下几个:

undefined 进行数字型转换时,输出结果为 NaN,而非 0。

null进行数字转换是为 0

"0"只有空格的字符串( 比如:" ")进行布尔型转换时,输出结果为 true

5. null >= 0 值为 true

alert( null > 0 );  // (1) false

alert( null == 0 ); // (2) false

alert( null >= 0 ); // (3) true

上面的结果完全打破了你对数学的认识。在最后一行代码显示“null 大于等于 0”的情况下,前两行代码中一定会有一个是正确的,然而事实表明它们的结果都是 false。

为什么会出现这种反常结果,这是因为相等性检查 == 和普通比较符 > < >= <= 的代码逻辑是相互独立的。进行值的比较时,null 会被转化为数字,因此它被转化为了 0。这就是为什么(3)中 null >= 0 返回值是 true,(1)中 null > 0 返回值是 false。

另一方面,undefined 和 null 在相等性检查 == 中不会进行任何的类型转换,它们有自己独立的比较规则,所以除了它们之间互等外,不会等于任何其他的值。这就解释了为什么(2)中 null == 0 会返回 false。

6. typeof null 的结果为 "object"

typeof null 的结果为 "object"。这是官方承认的 typeof 的错误,这个问题来自于 JavaScript 语言的早期阶段,并为了兼容性而保留了下来。null 绝对不是一个 object。null 有自己的类型,它是一个特殊值。typeof 的行为在这里是错误的。

7. 运算符 ++ 和 -- 是有返回值的

运算符 ++ 和 -- 可以置于变量前,也可以置于变量后,表示自增或自减

当运算符置于变量后,被称为“后置形式”:counter++。

当运算符置于变量前,被称为“前置形式”:++counter。

区别:前置形式返回一个新的值(自增或自减后的值),但后置返回原来的值(自增或自减之前的值)

8. JavaScript 中的 ?? 表示空值合并运算符

JavaScript 中有四个逻辑运算符:||(或),&&(与),!(非),??(空值合并运算符)

空值合并运算符(nullish coalescing operator)的写法为两个问号 ??。

?? 和 || 类似,区别只在于

var c = a ?? b;

var d = a || b;

?? 对待当一个值是 null 或 undefined 时,为假,其余为真

|| 对待当一个值是 false、0、空字符串 ""、null/undefined 为假,其余为真

9. 逗号运算符

逗号运算符能让我们处理多个表达式,使用 , 将它们分开。每个表达式都运行了,但是只有最后一个的结果会被返回


let a = (1 + 2, 3 + 4);

alert( a ); // 7(3 + 4 的结果)

这里,第一个表达式 1 + 2 运行了,但是它的结果被丢弃了。随后计算 3 + 4,并且该计算结果被返回

请注意逗号运算符的优先级非常低,比 = 还要低,因此上面你的例子中圆括号非常重要

如果没有圆括号:a = 1 + 2, 3 + 4 会先执行 +,将数值相加得到 a = 3, 7,然后赋值运算符 = 执行 a = 3,然后逗号之后的数值 7 不会再执行,它被忽略掉了。相当于 (a = 1 + 2), 3 + 4

10. break/continue 不能出现在三元表达式 ? 的右侧

请注意 非表达式的语法结构 不能与三元运算符 ? 一起使用。特别是 break/continue 这样的指令是不允许这样使用的。

例如,我们使用如下代码:


if (i > 5) {

  alert(i);

} else {

  continue;

}

//……用问号重写,continue 不允许在这个位置;

(i > 5) ? alert(i) : continue; //SyntaxError: Unexpected token 'continue'

11. 函数注意事项

1). 在 JavaScript 中,函数不是“神奇的语言结构”,而是一种特殊的值,表示一个“行为”的值

2). 为了使代码简洁易懂,建议在函数中主要使用局部变量和参数,而不是外部变量。与不获取参数但将修改外部变量作为副作用的函数相比,获取参数、使用参数并返回结果的函数更容易理解。

12. 函数参数术语

参数(parameter)是函数声明中括号内列出的变量(它是函数声明时的术语)。

参数(argument)是调用函数时传递给函数的值(它是函数调用时的术语)。

我们声明函数时列出它们的参数(parameters),然后调用它们传递参数(arguments

13. 函数还是方法

在 JavaScript 中,“函数”(function)和“方法”(method)都是执行代码块,但一般情况下它们有不同的语境和用法:

  1. 函数(function):函数是一个独立的代码块,可以在程序的任何地方定义和调用

  2. 方法(method):方法是属于对象的函数。换句话说,当一个函数作为对象的属性存在时,它被称为方法。方法通常通过对象字面量或类定义来创建

一般在实际工作中并不需要这么较真这些名字

参考

JavaScript 编程语言