以下是我在工作中经常忘记,或者总是想不起使用的一些知识点总结,如有错误欢迎指正
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 错误,因此只能使用 === 或 !== 进行比较;)
数字型转换遵循以下规则:
| 值 | 转换值 |
|---|---|
| undefined | NaN |
| null | 0 |
| true / false | 1 / 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)都是执行代码块,但一般情况下它们有不同的语境和用法:
-
函数(function):函数是一个独立的代码块,可以在程序的任何地方定义和调用
-
方法(method):方法是属于对象的函数。换句话说,当一个函数作为对象的属性存在时,它被称为方法。方法通常通过对象字面量或类定义来创建
一般在实际工作中并不需要这么较真这些名字