DAILY DOCDAILY DOC
Rust
Node
Notes
Ubuntu
Leetcode
  • it-tools
  • excalidraw
  • linux-command
Rust
Node
Notes
Ubuntu
Leetcode
  • it-tools
  • excalidraw
  • linux-command
  • BFC 块级格式化上下文
  • Note
  • WebAssembly
  • public api
  • 位运算
  • bitwise operator
  • css实现隐藏效果
  • css snippets
  • 抖音点赞
  • js 相等判断
  • fetch ReadableStream
  • git
  • Github Actions 工作流
  • google search
  • RPC vs HTTP
  • gravatar
  • hhkb
  • Init project
  • input 文件上传
  • mac

    • Mac 使用技巧
    • alfred
    • mac shortcuts
    • shortcuts text edit
    • mac 修改host
  • 微前端
  • mock
  • nginx dump
  • nginx
  • NirCmd
  • npm
  • Operator Precedence
  • package.json
  • url query 解析
  • pnpm
  • JavaScript Precise countdown
  • react 模版
  • regexp
  • setup web development
  • telegram

    • telegram bot
  • timeFunction ease
  • 视频裁剪
  • vscode

    • vscode 高级指南
    • bracketPairs
    • jsconfig.json
    • vscode pipe into code
    • social project
    • vscode tasks
  • draggable resizable
  • windows 激活
  • 前端截图实现
  • 文本配音 富文本实现
  • 图片处理
  • 前端坐标
  • 定时任务
  • work efficient
  • 微信小程序动画实现方案
  • 排列组合
  • 数列
  • 语音驱动文字
  • 浏览器
  • 状态管理
  • 移动盒子
  • 移动端开发常用snippets
  • 设计模式
  • web performance

Operator Precedence

题目:[] == ![]

解析:

  1. ! 优先级高于 == 先计算 ![]部分。[]为非falsy值,转化为true,因此![] 为false。题目转换为[] == false。
  2. 比较运算符的左右操作数类型不一致,[]先通过toString() 转化为原始值"",题目转化为"" == false。
  3. 比较操作符左右两边为基本类型的值,操作符右边有布尔类型的值,将布尔类型的值转换为数值,因此false 转化为0。题目转换为"" == 0
  4. 比较操作符两边是数值和字符串的比较,调用Number()将字符串转化为数值。Number("") 转化为0 即 0 == 0 ,结果为true。

扩展:

var a = 0;
!a++ == ++a
//  false  此时 a = 2


目录

  1. 运算符优先级
  2. ! 运算符
  3. 比较操作符

运算符优先级

  1. 运算符 ! 优先级高于 == 因此先计算 ![]
  2. 常用运算符优先级:
  3. 后置递增、后置递减 a++ a--
  4. 逻辑非 ! 前置递增、前置递减 ++a --a 从右向左
  5. 大于、小于、大于等于 、小于等于 > < >= <=
  6. 等于、全等于 == === !==
  7. 逻辑与 &&
  8. 逻辑或 ||
  9. 条件运算符
  10. 赋值 =

参考:

  1. MDN:运算符优先级
  2. 逻辑运算符

! 运算符

  1. falsy 值
  • null
  • NaN
  • 0
  • 空字符串 '' ""
  • undefined
  1. 其他值都是 true

比较操作符

  • ==比较操作符 ,比较前,将两个操作数转换为相同的数据类型。

  • === 严格比较,操作数类型和值都必须相等

特点:

  1. null == undefined // true 不严格相等
  2. +0 === -0 // true 严格相等
  3. null undefined 严格和自身相等
  4. NaN == NaN //false NaN 都不等 NaN

== 相等运算符

  1. 左右操作数都是基本类型的值时,转换为相同类型的值作比较。
1 == "1" //true
1 == true // true
0 == false // true
"" == 0  //  true ,Number("") = 0
  1. 左右操作数都是复杂数据类型(对象、数组)时,他们在栈内存中的引用地址(堆内存)相同时才相等。
[] == [] // false  
[1,2] == [1,2] //false

var arr = [1,2];
var a = arr;
var b = arr;
a == b  //true
a === b  //true 

// 同理 对象一样
{} == {}  //false
var obj = {a:1};
var a = obj;
var b = obj;
a === b  true
  1. 左右操作数类型不一致,基本数据类型和复杂数据类型(对象)作比较,对象会被转化为原始值。

  2. 数字和字符串比较

字符串会转换为相应的数值 (Number())

```javascript
  1 == "1";  //true  "1"会转化为 数值 1  
"1" == 1;  //true
  //  Number实现字符串转换
"1.1.1" == 1.1  //false 
parseInt("1.1.1")  //  1
parseFloat("1.1.1")  //  1.1
Number("1.1.1")  //  NaN 

Number("1.1")  //  1.1
parseInt("1.1")  //  1
parseFloat("1.1")  //  1.1 

Number("")  //  0 相当于 Number()
parseInt("") // NaN 相当于parseInt()
parseFloat("")  //  NaN 相当于parseFloat()

```
  1. 如果其中一个操作数为布尔值,则true 转换为1 ,false转换为0
```javascript
1 == true  //  true
"1" == true  //  true

```
  1. 对象与数字或字符串作比较时,操作符通过valueOf() 和 toString()将对象转换为原始值(字符串、数值),转换失败会产生运行时错误。
```javascript
var obj = {a:1};
obj.toString()  //  "[object Object]"
obj.valueOf()  //  obj
obj.valueOf() === obj  //  true

var arr = [];
arr.toString() //  ""
arr.valueOf()  //  	arr
arr.valueOf() === arr  //  true

[] == 0  //  true
[] == false  //  true
[1] == 1  //  true
[1] == "1"  //  true
```

=== 全等运算符

操作数值和数据类型相等时返回true 否则返回false

1 === "1"  //false
1 === 1  //true

参考:

  1. MDN:比较操作符
Last Updated:
Contributors: rosendo
Prev
npm
Next
package.json