Skip to main content

JavaScript中&&与&区别

0.简介#

昨晚看到一篇关于逻辑与和按位与的区别, 引起疑问后今天查完资料发现一些之前遗漏的细节。

逻辑与按位与 在基础语言中都有学习, 一个用于逻辑判断,一个用于按位取与操作。日常业务中常用Boolean && expression来代替

if (Boolean) {
expression
}

疑问: 除了标准用法, 当操作符两边为其他数据类型时, 又会返回什么值呢?

1. 预备知识-假值#

即可以转换为false(Boolean(expr) => false

  • null
  • NaN
  • 0
  • ''(空字符串)
  • undefined

2. 逻辑与#

印象中的解释是, 同时为才为真。真值表:

左边右边a && b 返回值
truetruetrue
truefalsefalse
falsetruefalse
falsefalsefalse

如果, 操作符两边不都是Boolean时, 又该如何返回呢?

console.log(7 && 8) // 8
console.log(7 && 0) // 0
console.log(0 && 8) // 0

Number && Number 返回后者

console.log('a' && 'b') // b
console.log(true && 'b') // b
console.log('a' && true) // true
console.log(false && 'b') // false
console.log('a' && false) // false

当字符串与布尔进行逻辑与时, 存在false则返回false, 否则, 返回后者

console.log('b' && null) // null
console.log('b' && NaN) // NaN
console.log('b' && 0) // 0
console.log('b' && '') // 空
console.log('b' && undefined) // undefined
console.log(null && 'b') // null
console.log(NaN && 'b') // NaN
console.log(0 && 'b') // 0
console.log('' && 'b') // 空
console.log(undefined && 'b') // undefined

逻辑与遇到假值时,另一个是真值, 返回假值

console.log(null && false) // null
console.log(false && null) // false

左右都为假值, 返回左边

Logical AND (&&) expr1 && expr2, 如果expr1可以转化为真, 返回expr2; 否者, 返回 expr1。

等价于

if (expr1) {
return expr2
} else {
return expr1
}

3. 按位与#

console.log(0b0011 & 0b0010) // 2
console.log(3 & 2) // 2

显而易见, 分别把左右两侧转为二进制后进行位运算

console.log(true & true) // 1
console.log(true & false) // 0
console.log(false & true) // 0
console.log(false & false) // 0

按位处理布尔值, 仅返回0后者1。等价于Boolean && Boolean ? 1 : 0

console.log(1 & true) // 1
console.log(1 & false) // 0
console.log(1 & null) // 0
console.log(1 & NaN) // 0
console.log(1 & '') // 0
console.log(1 & undefined) // 0

假值处理与Boolean类似

console.log(1 & []) // 0
console.log(1 & [0]) // 0
console.log(1 & [1]) // 1
console.log(1 & [0,1]) // 0
console.log(1 & [1,0]) // 0
console.log(1 & {}) // 0
console.log(1 & '1') // 1

1 & 非假值, 依然会返回1。 似乎被转成数字进行运算。

console.log(Number([])) // 0
console.log(Number([0])) // 0
console.log(Number([1])) // 1
console.log(Number([0,1])) //0
console.log(Number([1,0])) // NaN
console.log(Number({})) // NaN
console.log('1') // 1

验证发现, 与猜想基本一致。

Bitwise AND 按位操作符对这种二进制表示形式执行操作,但是它们返回标准的JavaScript数值。 a & b , 操作符两边同时为1时, 返回1

左边右边a & b 返回值
111
100
010
000

如何使用hexo搭建个人博客

Welcome to Hexo! This is your very first post. Check documentation for more info. If you get any problems when using Hexo, you can find the answer in troubleshooting or you can ask me on GitHub.

Quick Start#

Create a new post#

hexo new "My New Post"

More info: Writing

Run server#

hexo server

More info: Server

Generate static files#

hexo generate

More info: Generating

Deploy to remote sites#

hexo deploy

如何搭建自己的博客网站#

平台: github/gitee

代码工程应为youname.github.io, 如此依赖便可直接访问 https://yourname.github.io/

打开GitHub Pages,即可访问。建议使用master存放开发代码, gp-pages存放用于访问的静态资源。

More info: Deployment

发布#

方式1#

安装hexo-deployer-git, 配置_config.yml中的

deploy:
type: git
repo: https://github.com/username/username.github.io.git
branch: gh-pages

命令

"deploy": "hexo deploy",

方式2: gh-pages#

  • chalk
  • progress

方式3: Travis CI 持续发布#

操作步骤:

language: node_js
node_js:
- lts/*
cache:
directories:
- node_modules
branches:
only:
- master
before_install:
- export TZ='Asia/Beijing'
install:
- npm install
script:
- npm run build
after_script:
- cd ./public
- git init
- git config user.name "username"
- git config user.email "username@163.com"
- git add .
- git commit -m "Travis CI Auto Builder at $(date +'%Y-%m-%d %H:%M:%S')"
- git push --force --quiet "https://${GH_TOKEN}@${GH_REF}" master:gh-pages

注意: git init 后没有分支, 在git add . 后默认创建mater分支

也可以直接执行npm run deploy, 注意先设置token, 否则运行会失败

选择主题#

当前使用主题: Melody

修改配置文件_config.yml

theme: melody

常见问题#

build资源为空#

错误提示

(node:5510) Warning: Accessing non-existent property 'lineno' of module exports inside circular dependency
(Use `node --trace-warnings ...` to show where the warning was created)
(node:5510) Warning: Accessing non-existent property 'column' of module exports inside circular dependency
(node:5510) Warning: Accessing non-existent property 'filename' of module exports inside circular dependency
(node:5510) Warning: Accessing non-existent property 'lineno' of module exports inside circular dependency
(node:5510) Warning: Accessing non-existent property 'column' of module exports inside circular dependency
(node:5510) Warning: Accessing non-existent property 'filename' of module exports inside circular dependency

原因: node v14下存在的bug, 尝试其他版本

参考:

配置travis_ci