haizlin/fe-interview

[js] 第75天 js中=、==、===三个的区别是什么?并说明它们各自的工作过程

haizhilin2013 opened this issue · 6 comments

第75天 js中=、==、===三个的区别是什么?并说明它们各自的工作过程

=赋值操作符。执行顺序是从右到左, 比如 a = b = c,先执行 b = c,再执行 a = b。结合其它算术运算符就是复合赋值运算符比如: +=,-=,*=。a += b 等价于 a = a + b,其它复合赋值运算符类似。

== 在 js 中叫 不严格等于。和其它语言不一样,其它语言比如 java 中的 == 和 js 中的 === 更像。js 中的 == 也是用来比较左右操作数是否相等,但是它在比较时会自动进行类型转换,不严格。举个例子 '' == false 返回的结果是 true,左右都被转换成数字进行比较 Number('') 和 Number(false) 都返回 0,所以相等。

=== 在 js 中叫 严格等于。没什么可说的,就是严格比较左右两个操作数的相等性,0 === false 结果是 false。

建议:平时编码应该尽量使用 === 而不是 == 避免因为自动类型转换带来的逻辑 bug。

  • = 是赋值运算符
    • 它遵循右结合律
    • 它返回 lhs (但在声明语句(var, let, const)中返回 undefined
    • 若 rhs 是 primitive value (number, string, symbol, undefined, boolean) 则 lhs 被赋值为该值
    • 若 rhs 是 object 则 lhs 被赋值为指向该 object 的 reference
    • const 声明的不变量不能被再次赋值,否则会 throw ReferenceError
    • 如果在局部作用域不使用声明语句就给一个既未声明于局部作用域,也未声明于任何上层作用域的变量赋值,那它将会被创建为一个全局变量。不应该如此使用。
  • == 是带有 implicit type conversion 的判等运算符
    • 它遵循左结合律
    • 它返回 boolean
    • 个人认为背诵它的规则没有意义,实际开发时也不会使用
  • === 是严格的判等运算符
    • 它遵循左结合律
    • 它返回 boolean
    • 若两侧是 primitive value 则判断两侧值是否相等
    • 若两侧是 object 则判断两侧 reference 是否指向同一块内存
  • = 是赋值运算符,读取的时候先读等号右边再读等号左边 。
  • == 在做判断的时候只是简单的比较两个值等不等
  • === 在做判断的时候不仅要判断两个值等不等还要判断内存地址是不是一样

(1) = 是赋值运算符,用于将右边的值赋值给左边的变量;还可以与+、-、*、/等组成 +=、-=、*=、/=

(2) == 是相等运算符,常用于比较两个值,返回布尔值;== 在比较时不会考虑数据类型,而是采用相应策略尽量让比较的两个值相等;比如 true与数字1进行比较时,会将true 数字化再进行比较。相等运算符在进行判断时容易出现一些违反直觉的结果,个人推荐使用===进行判断。

1 == true;
//策略
1 == Number(true); //true

(3) === 是严格相等运算符,与 == 不同的是, === 是先判断数据类型,如果相同再判断值。返回的也是布尔值。

(1) = 是赋值运算符,用于将右边的值赋值给左边的变量;还可以与+、-、、/等组成 +=、-=、=、/=

(2) == 是相等运算符,常用于比较两个值,返回布尔值;== 在比较时不会考虑数据类型,而是采用相应策略尽量让比较的两个值相等;比如 true与数字1进行比较时,会将true 数字化再进行比较。相等运算符在进行判断时容易出现一些违反直觉的结果,个人推荐使用===进行判断。

1 == true;
//策略
1 == Number(true); //true

(3) === 是严格相等运算符,与 == 不同的是, === 是先判断数据类型,如果相同再判断值。返回的也是布尔值。

1:=是赋值操作符
2:==是相等运算符,判断两值是否相等,如果类型不一 会自动类型转换,
3:=== 全等于, 判断两值是否是相同类型,再判断是否是同值。