【面试题】Javascript的这些运算符,你都都掌握哪些?

2023-11-11

 

前端面试题库 (面试必备)            推荐:★★★★★

地址:前端面试题库

【国庆头像】- 国庆爱国 程序员头像!总有一款适合你!

theme: devui-blue highlight: a11y-light

无论是JavaScript还是其他语言,运算符是基础,表达式和语句中都可能存在运算符。下面就列举一些JavaScript中一些你也许不知道的运算符的作用及使用场景。

+ 加法运算符

如果是单目运算(也称一元运算)即一个操作数,会将其 隐式转换 成number类型:

// 获取当前时间戳
new Date().getTime() // 1681607509065
Date.now() // 1681607509065

// better
+new Date() // 1681607509065

如果有两个操作数,+会先将两边的操作数 隐式转换 成基本数据类型,并按照以下顺序判断:

  1. 如果有一侧是string,则将另一侧也转成string
[1, 2, 3] + '' // '1,2,3'
  1. 如果两侧都是BigInt则执行BigInt的加法,如果只有一侧是BigInt,则抛出TypeError错误,因为BigInt不支持单目+运算:
10n + 20n; // → 30n
+ 10n // → TypeError: Cannot convert a BigInt value to a number
  1. 否则将两边再转换成number,执行数字加法:
let a = {
    valueOf: () => false
}
a + true // 1

** 幂(指数)运算符

** 是ES7新增的幂运算符,可以代替Math.pow()

Math.pow(2, 3) // 8

// better
2 ** 3 // 8

** 运算符的一个特点是右结合,而不是常见的左结合。多个幂运算符连用时,是从最右边开始计算的:

2 ** 2 ** 3 // 256
// 相当于
2 ** (2 ** 3) // 256

可以使用圆括号运算符()来控制表达式的优先级:

(2 ** 2) ** 3 // 64

? : 条件(三元)运算符

condition ? exprIfTrue : exprIfFalse

在简单的条件判断下,可以使用三元运算? :代替if else

if (age >= 18) {
    console.log('成年')
} else {
    console.log('未成年')
}

// better
age >= 18 ? console.log('成年') : console.log('未成年')

当然条件运算符也可以链接使用,它也满足右结合:

age >= 70 ? console.log('从心所欲')
    : age >= 60 ? console.log('耳顺')
    : age >= 50 ? console.log('知天命')
    :age >= 40 ? console.log('不惑')
    : age >= 30 ? console.log('立')
    : console.log('啥也不是')

注意:condition 如果不是一个boolean 将会发生隐式转换,如果是一个真值Truthy,就会执行exprIfTrue

let studyList = [{ name: 'jude', age: 25 }, { name: 'andy', age: 24 }]
let person = studyList.find(item => item.age < 18) // undefined
person ? console.log('要开花') : console.log('要发芽') // '要发芽'

补充一下Truthy和Falsy:

假值(Falsy): false0-00n""nullundefined 和 NaN

真值(Truthy): 除了假值以外的都是真值

, 逗号运算符

逗号运算符可以创建一个以上的复合表达式,整个复合表达式的值为最右侧的表达式的值

x => {
    x = x + 1
    return x
}

// better
x => (x++, x)
// or
x => ++x

最常用于在for循环中提供多个参数:

for (let i = a.length - 1, j = b.length - 1; i >= 0 || j >= 0; i--, j--) {
  //do sth
}

% 取余运算符

取余运算符返回左侧操作数除以右侧操作数的余数,返回值符号与被除数符号保持一致:

13 % 5  // 3
13 % -5 // 3
13.5 % 5 // 3.5
-13 % 5 // -3
NaN % 2 // NaN
Infinity % R // NaN    // R表示任意一个实数
R % Infinity // R
Infinity % Infinity // NaN

在一些算法题中可以得到应用:

已知2019年的第一天是周四,求第x天是周几:

function getDay(x) {
    return [4, 5, 6, 0, 1, 2, 3][x % 7]
}

?. 可选链运算符

我们知道当读取null或者undefined的属性时,js会抛出一个TypeError

null.name // TypeError: Cannot read properties of null (reading 'name')
undefined.name //  TypeError: Cannot read properties of undefined (reading 'name')

ES2020 新增可选链运算符,可以作用在上述情况,并短路返回undefined

null?.name // undefined
undefined?.name // undefined

针对函数调用的可选链:

let personList = [
    { name: 'jude' }
]
// personList[0].sleep() // person.sleep is not a function
if (personList[0].sleep) {
    personList[0].sleep()
}
// better
personList[0].sleep?.() // undefined

// 如果前面的对象也可能不存在的话:
personList[1]?.sleep?.() // undefined

// 当然如果,该属性虽然存在但是不是一个函数,就会报is not a function:
personList[0]?.name() // TypeError: personList[0]?.name is not a function

也可用于方括号属性访问器 和 访问数组元素

let propertyName = 'name'
null?.[propertyName] // undefined

let arr = []
arr?.[0] // undefined

要注意的是可选链运算符不可用于赋值操作

({})?.name = 'jude' // SyntaxError: Invalid left-hand side in assignment

&& 逻辑与运算符 和 || 逻辑或运算符

从左往右,&&Falsy, ||Truthy,找到了则将返回找到的值,否则返回下一个:

1 && {} && ' ' && NaN && undefined // NaN
'' || 0 || null ||  [] || 1 // []

因此它们都属于短路运算符

&&可以用作函数的判断执行:

if (age >= 22) {
    work()
}
// or
age >= 22 && work() 

||可以用来设置备用值:

name => {
    if (name) {
        return name
    } else {
        return '未知'
    }
}
// better
name => name ? name : '未知'
// or
name => name || '未知'

以上写法都会判断name是否是Falsy来设置其默认值,而ES6默认值只会判断是否是undefined

(name = '未知') => name
// 相当于
name => name === undefined ? name : '未知'

// such as
((name = '未知') => name)(null) // null
((name = '未知') => name)(0) // 0
((name = '未知') => name)(undefined) // '未知'
((name = '未知') => name)() // '未知'

要注意的是&&的优先级高于||

1 || 1 && 0  // 1

?? 空值合并运算符

空值合并运算符??当且仅当左侧操作数为null或者undefined时才会返回右侧操作数。

上边说到逻辑或运算符||可以用来设置备用值,但其实有隐患:

function getScore(x) {
    x = x || '未知'
    console.log('张三的英语成绩是:' + x)
}
getScore(0) // '张三的英语成绩是:未知'

逻辑或运算符||会在左侧操作数为Falsy时返回右侧操作数。而0,''也属于Falsy,但是实际某些场景中它们正想要的结果,如上代码。

空值合并运算符??解决了这个问题:

function getScore(x) {
    x = x ?? '未知'
    console.log('张三的英语成绩是:' + x)
}
getScore(0) // '张三的英语成绩是:0'

常与可选链运算符?.一起用:

let person
person?.name ?? '未注册' // '未注册'

!! 双非运算符

逻辑非运算符!,会检测操作数是真值还是假值,如果是Truthy则返回false,如果是Falsy则返回true。 而双飞运算符!!,在这基础上再取反,其作用相当于Boolean()

Boolean('') // false

// or
!!'' // false

下面介绍一些位运算符

位运算符将操作数看作是4byte(32bit)二进制串。在这基础上进行运算,但最终返回十进制数字。

<< 左移操作符 和 >> 右移操作符

x << n 会将 x 转成 32 位的二进制,然后左移 n 位,左侧越界的位被丢弃:

10 * 2³ // 80

// better
10 << 3 // 80

x >> n 会将 x 转成 32 位的二进制,然后右移 n位,右侧越界的位被丢弃:

Math.floor(a / Math.pow(2,n))
// or
Math.floor(a / 2 ** n)

// better
a >> n

这在二分查找可以得以应用:

function BinarySearch(arr, target) {
    const n = arr.length
    let left = 0, 
        right = n - 1
    while (left <= right) {
      // let mid = Math.floor((left + right) / 2)
      // better
      let mid = (left + right) >> 1
      if (arr[mid] === target) {
          return mid
      } else if (arr[mid] > target) {
          right = mid - 1
      } else {
          left = mid + 1
      }
    }
    return -1
}

^ 按位异或运算符

按位异或运算符 ^ 将两边的操作数都转成32位的二进制数后,逐一比较每一位,有且仅有一个1时,则返回1

3 ^ 5 // 6
// 00000000000000000000000000000011    // 3
// 00000000000000000000000000000101    // 5
// 00000000000000000000000000000110    // 6

可以用于交换两个数值:

let a = 3,
    b = 5;
let temp = a
a = b // 5
b = temp //3

// 以上交换使用额外的内存temp,而^可以in-place原地交换:
// better
a = a ^ b
b = a ^ b // 5
a = a ^ b // 3

异或运算符^满足以下三个性质:

  1. 任何数和0做异或运算,结果仍然是原来的数字:�⊕0=�x⊕0=x
  2. 任何数和自身做异或运算,结果是0:�⊕�=0x⊕x=0
  3. 异或运算满足交换律和结合律:�⊕�⊕�=�⊕�⊕�=�⊕(�⊕�)=�⊕0=�x⊕y⊕x=y⊕x⊕x=y⊕(x⊕x)=y⊕0=y

下面是一道利用上述三个性质求解的一道算法题:

给你一个 非空 整数数组 nums ,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。(你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间。)

/**
 * @param {number[]} nums
 * @return {number}
 */
function singleNumber (nums) {
    let ans = 0
    for (let i = 0; i < nums.length; i++) {
        ans ^= nums[i]
    }
    return ans
};
singleNumber([4, 1, 2, 1, 2]) // 4

此外异或运算符可以用于简单的加密和解密操作。例如,我们可以将一个字符串的每个字符和一个密钥进行异或运算,得到一个加密后的字符串,然后再将加密后的字符串和密钥进行异或运算,就可以得到原来的字符串:

let str = 'Hello World'
let key = 123
let encrypted = ''
for (let i = 0; i < str.length; i++) {
  encrypted += String.fromCharCode(str.charCodeAt(i) ^ key)
}
console.log(encrypted) // '3[,	'
let decrypted = ''
for (let i = 0; i < encrypted.length; i++) {
  decrypted += String.fromCharCode(encrypted.charCodeAt(i) ^ key)
}
console.log(decrypted) // 'Hello World'

~ 按位非运算符

按位非运算符~将操作数转换成32位有符号整型,然后按位取反:

重点:

  • 计算机存储数字都以补码的形式存储(至于为什么涉及到电路,只能做加运算,不能减,因此设计了反码和补码来存储负数)
  • 正数的反码和补码等于原码
  • 负数的补码等于原码取反+1

const a = 5;     // 32位二进制:00000000000000000000000000000101
// 取反后:11111111111111111111111111111010(补码)
~a  // -6

总之: 按位非运算时,任何数字 x 的运算结果都是 -(x + 1)

因此可以用~代替!== -1的判断:

// == -1 的写法不是很好称为“抽象渗漏”,意思是在代码中暴露了底层的实现细节,这里指用-1作为失败的返回值,这些细节应该屏蔽调。————出自《你不知道的JavaSript(中卷)》
if (str.indexOf('xxx') !== -1) {}

// better
if (~str.indexOf('xxx')) {}

最后介绍很有用的...

... 扩展符

扩展符...可以在函数调用/数组构造时,将数组表达式或者 string 在语法层面展开;还可以在构造字面量对象时,将对象表达式按 key-value 的方式展开。

对象展开

只会复制目标对象的自有可枚举属性

let _a = { name: 'jude' }
let a = Object.create(
    _a, // 原型链上的属性name,不自有
    { 
        myName: { // 自有属性myName,可枚举
            value: '张三',
            enumerable: true
        },
        age: { // 自由属性age,不可枚举
            value: 30,
            enumerable: false
        }
    }
)
let b = {...a} // {myName: '张三'}

上述代码中,使用 Object.create() 将_a作为a的原型对象,因此_a上的属性name对于a来说不是自有属性;同时给自己创建了自由属性myNameage,但是age设置为不可枚举。最后使用扩展符实现对a对象的克隆,只克隆了myName这个自有且可枚举属性。这和 Object.assign() 的结果一样:

let c = Object.assign({}, a) // {myName: '张三'}

数组展开

用于(浅)克隆数组,对于复杂数据类型的数组项,只会克隆其引用:

let arr = [{ a: 1 }]
let copyArr = [...arr] // [{ a: 1 }]

arr[0].a = 2
copyArr // [{ a: 2 }]

用于连接数组:

let arr1 = [0, 1, 2]
let arr2 = [3, 4, 5]
let arr3 = arr1.concat(arr2) // [0, 1, 2, 3, 4, 5]
// better
let arr4 = [...arr1, ...arr2] // [0, 1, 2, 3, 4, 5]

用于函数调用:

function fn(a, b, c) { }
let args = [0, 1, 2]
fn.apply(null, args)

// better
fn(...args)

字符串展开

'123'.split('') // ['1', '2', '3']

// or
[...'123']  // ['1', '2', '3']

不能说用于类数组转数组

类数组对象是具有.length属性的对象。

Array.from()可迭代类数组对象创建一个新的浅拷贝的数组实例。 而在数组或函数参数中使用展开语法时,该语法只能用于 可迭代对象

let fakeArray = {
    0 : 1,
    1 : 2,
    2 : 3,
    length: 3
}
Array.from(fakeArray) // [1, 2, 3]
[...fakeArray] // TypeError: fakeArray is not iterable

或许你会问[...'123']不也是在数组中使用展开语法吗,而'123'是基本数据类型啊,怎么会可迭代呢?

其实,引擎会将'123'包装成String对象,而String对象上封装了Symbol.iterator()方法:

let str = '123';

let strIterator = str[Symbol.iterator]();
strIterator.next() // {value: '1', done: false}
strIterator.next() // {value: '2', done: false}
strIterator.next() // {value: '3', done: false}
strIterator.next() // {value: undefined, done: true}

...剩余参数

如果函数最后一个参数以...为前缀,则它将是由剩余参数组成的真数组,而arguments是伪数组:

function fn (a, ...b) {
    console.log(b)
    console.log(arguments)
}
fn(1, 2, 3) 
// [2, 3]
// Arguments(3) [1, 2, 3, callee: (...), Symbol(Symbol.iterator): ƒ]

剩余参数...可以被解构:

function fn(...[a, b, c]) {
  return a + b + c;
}
fn(1) // NaN (b and c are undefined)
fn(1, 2, 3) // 3
fn(1, 2, 3, 4) // 6

剩余参数...必须在末尾:

function fn (a, ...b, c) {} // SyntaxError: Rest parameter must be last formal parameter

... 剩余属性

在解构赋值中,剩余属性...可以获取数组或对象剩余的属性,并存储到新的数组或对象中:

const { a, ...others } = { a: 1, b: 2, c: 3 }
console.log(others) // { b: 2, c: 3 }

const [first, ...others2] = [1, 2, 3]
console.log(others2) // [2, 3]

同样,这里的...必须在末尾:

let [a , ...b , c] = [1, 2, 3]  // SyntaxError: Rest element must be last element
let { a, ...b, c } = { a: 1, b: 2, c: 3 } // SyntaxError: Rest element must be last element

总结:

何为优雅,代码少不一定优雅,优雅要在简洁的基础上保证一定的可读性。而可读性是基于团队的,如果团队水平很高,对于某些"隐式转换"已经形成肌肉记忆,那对他们来说就不是“隐式”的,就具备可读性。

而对这些基础知识足够掌握之后,起码能有选择得根据团队整体风格灵活变通。

以上就是JavaScript中的关于部分运算符的小知识,希望能对大家有所帮助。

 

前端面试题库 (面试必备)            推荐:★★★★★

地址:前端面试题库

【国庆头像】- 国庆爱国 程序员头像!总有一款适合你!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【面试题】Javascript的这些运算符,你都都掌握哪些? 的相关文章

  • 我如何能够以两行显示标题,并且每行的字体大小不同?

    我正在使用 Google Chart API 创建时间线图 并希望将图的标题修改为两行 问题 我如何能够显示具有不同字体大小的两线图表标题 电流输出 理想输出 相关研究 我唯一能找到的是有人试图用饼图来做到这一点 但我尝试了但无法使其发挥作
  • 使用 jquery 远程图像属性

    目前我正在尝试获取远程图像宽度 高度 我正在开发一个链接共享模块 就像当你在 Facebook 上粘贴链接时 你可以看到标题 描述和图像 所以我尝试使用 php getimagesize 来获取图像宽度 高度 但速度非常慢 所以我正在考虑使
  • 为什么 iife 在一个简单的例子中不起作用?

    我不明白为什么函数表达式调用不起作用并抛出错误 你能给我解释一下吗 var a function x alert x function a 1 谢谢大家 任务比我想象的要容易得多 这是因为 JS 将 IIFE 解析为函数的参数调用 这样做时
  • Chrome 中的性能问题

    我目前正在从事一个相对较大的项目 使用 AngularJs 构建 应用程序的一部分是一个表单 您可以向其中添加任意数量的页面 不幸的是 添加了很多不必要的垃圾 即表示表单模型的对象可能会变得非常大 在某些时候 Chrome 基本上无法处理它
  • 如何更改 Google Maps v3 API for Directions 中的开始和结束标记图像

    我使用 DirectionsRender 绘制了一条路线 但我不知道如何用我自己的标记替换通用的 Google 标记 我知道并在正常的谷歌地图情况下使用它 但发现很难用开始和结束的方向标记来做到这一点 如果这是一个愚蠢的问题 感谢您的任何建
  • 如何格式化 Highcharts 的 (x,y) 对数据的日期时间

    我的序列化方法会产生如下所示的日期时间字符串 2014 07 09T12 30 41Z 为什么下面的代码不起作用 function container highcharts xAxis type datetime series data x
  • 如何针对 Node.js 中发生的每个错误发送电子邮件?

    假设我的 node js 应用程序正在运行 如果出现错误 我的意思是所有错误 不仅仅是网络错误 如果出现错误 则很重要 我如何调用函数向我发送电子邮件 基本上 在我希望它写入 err out 之前 我希望向我发送一封电子邮件 我正在使用no
  • Bootstrap按钮加载+Ajax

    我正在使用 Twitter Bootstrap 的按钮加载状态 http twitter github com bootstrap javascript html buttons http twitter github com bootst
  • Chrome 扩展程序在代码中使用 client_secret

    我正在开发具有自己的 oAuth 授权的 Google Chrome 扩展 当然 我必须使用 client id 和 client secret 作为请求令牌 有什么办法可以向用户隐藏这些数据吗 由于此请求只是 javascript 源代码
  • 为什么我们在打字稿中使用 HTMLInputElement ?

    我们为什么使用 document getElementById ipv as HTMLInputElement value 代替 document getElementById ipv value 功能getElementById返回具有类
  • 有没有办法在 onclick 触发时禁用 iPad/iPhone 上的闪烁/闪烁?

    所以我有一个有 onclick 事件的区域 在常规浏览器上单击时 它不会显示任何视觉变化 但在 iPad iPhone 上单击时 它会闪烁 闪烁 有什么办法可以阻止它在 iPad iPhone 上执行此操作吗 这是一个与我正在做的类似的示例
  • Vuejs 2:去抖动不适用于手表选项

    当我在 VueJs 中反跳此函数时 如果我提供毫秒数作为原语 它就可以正常工作 但是 如果我将其提供为对 prop 的引用 它会忽略它 这是道具的缩写版本 props debounce type Number default 500 这是不
  • Firebase 函数 onWrite 未被调用

    我正在尝试使用 Firebase 函数实现一个触发器 该触发器会复制数据库中的一些数据 我想观看所有添加的内容votes user vote 结构为 我尝试的代码是 const functions require firebase func
  • 代码镜像错误:未捕获错误:扩展集中无法识别扩展值([对象对象])

    全部 我目前正在从事一个React Electron项目 该项目的目标是完成一个Markdown编辑器 当我配置codemirror 该程序报告错误说 Uncaught Error Unrecognized extension value
  • 用于交互式图形绘制的轻量级 JavaScript 库? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我有兴趣了解用于绘制交互式图表的最轻量级 javascript 库 我掌握的数据主要是与海洋研究相关的科学数据 我知道一些 jquery
  • 从 FileReader 设置背景图像样式

    我正在寻找一种解决方案 允许我从文件上传输入中获取文件并通过设置 document body style backgroundImage 来预览它 以下代码用于在 Image 元素中显示预览 function setImage id tar
  • 在 CKEditor 中设置字体大小和字体系列

    我正在使用 ckeditor 我想问一下这个插件如何设置font family和font size 我尝试过使用 CKEDITOR config font defaultLabel Arial CKEDITOR config fontSiz
  • JavaScript 相对路径

    在第一个 html 文件中 我使用了一个变量类别链接 var categoryLinks Career prospects http localhost Landa DirectManagers 511 HelenaChechik Dim0
  • 使用 MongoDB 和 Nodejs 插入和查询日期

    我需要一些帮助在 mongodb 和 nodejs 中按日期查找记录 我将日期添加到抓取脚本中的 json 对象 如下所示 jsonObj last updated new Date 该对象被插入到 mongodb 中 我可以看到如下 la
  • 如何确定所有角度2分量都已渲染?

    当所有 Angular2 组件完成渲染时 是否会触发一个角度事件 For jQuery 我们可以用 function 然而 对于 Angular2 当domready事件被触发 html 只包含角度组件标签 每个组件完成渲染后 domrea

随机推荐

  • adobe 软件(PS AI)占用内存过大问题

    adobe 软件 PS AI 占用内存过大问题 电脑是通过数据的交换来进行工作 CPU是处理数据交换的硬件 内存是暂时存储这些数据的硬件 电脑内存 RAM 容量越大你的数据交换能力就越强 就越能够完成复杂的任务 查看设备配置 操作系统 内存
  • 毕业设计-基于机器视觉的木材表面缺陷检测-OpenCV

    目录 前言 课题背景和意义 实现技术思路 一 表面缺陷分析及检测方案设计 二 表面缺陷图像识别 三 系统识别性能测试 实现效果图样例 最后 前言 大四是整个大学期间最忙碌的时光 一边要忙着备考或实习为毕业后面临的就业升学做准备 一边要为毕业
  • 【python】天平最少砝码设计

    题目 有一架天平 砝码的种类和个数要你来设计 给定一个整数n 则待称重的物品的重量可能是 1 n 之间的整数 砝码可以放在左盘也可以放在右盘 要能称出所有 1 n 重量的物品 请问如何设计砝码的种类和个数 使得这一套砝码的总个数最少 比如
  • 卷积神经网络 —— 图像卷积

    卷积神经网络是最具代表性的深度学习算法之一 目前已经被大范围的应用与计算机视觉等领域 并且取得了众多突破性的进展 在学习卷积神经网络之前 我们需要学习图像卷积运算 图像卷积运算的作用 图像卷积运算是一种图像处理算法 通过它可以实现很多不同的
  • gin http-request

    func main router gin Default router POST form post message func c gin Context 查询请求URL后面拼接的参数 id c Query id 从取得URL中参数 此处U
  • 移动开发技术(三)

    禅道工具的使用 添加产品 步骤 在 产品视图 中 单击 添加产品 按钮 在 新增产品 页面中 输入产品信息 单击 保存 按钮 说明 产品由产品经理进行添加 产品类型 正常 多分支 PC Android Ios 多平台 Windows Lin
  • Spring三种切面

    Spring除了支持Schema方式配置AOP 还支持注解方式 使用 AspectJ风格的切面声明 1 启用对 AspectJ的支持 Spring默认不支持 AspectJ风格的切面声明 为了支持需要使用如下配置 java代码
  • 1. 抽纸片(java)

    问题描述 你的朋友提议玩一个游戏 将写有数字的的n纸片放入口袋中 你可以从口袋中抽取三次纸片 每次记下纸片上的数字后都将其放回到口袋中 如果这三个数字的和是m 就是你赢 否则就是你朋友赢 请你编写一个程序 判断当纸片上所写的数字是k1 k2
  • Eclipse中Maven的使用以及Pom.xml详解

    Eclipse中创建Maven项目 一 Maven项目的创建 1 点击File gt New gt Other gt 搜索maven gt 选择Maven Project点击Next 2 勾选第一项 表示跳过骨架选择 点击Next 3 输入
  • 批处理命令,函数传参和跳转

    文章目录 函数 参数传递 返回值 局部变量保护 goto 批处理系列 初步 set指令 设置变量 函数 函数封装是编程语言必不可少的环节 而函数在创建时 至少需要有一个函数标识 同时需要一块区域 来组成函数体 Dos中的函数用标签来标识 以
  • Vmware虚拟机系统时间同步网络时间并登录用户自动校正时间

    VM虚拟机大家都用 我在用完后 经常使用 挂起客户机 但是这样一来 系统恢复启动很快 但是少了正常的系统自检 包括和网络同步时间 今天在虚拟机上测试 find root Text mtime 3 name Service log exec
  • can转光纤、can光端机、can光纤转换器如何选型

    1 首先 根据组网方式的不同 can光端机分为点对点式CANFiber系列 总线级联式LCAN FOB系列和环网冗余式LCAN FOBR系列 2 can光纤转换器选型
  • C语言-数字爆炸游戏

    问题 你好 欢迎来到数字爆炸 系统随机生成一个数字 猜大了 提示猜大了 猜小了 提示猜小了 思路 先写游戏大概思路 首先 会有菜单吧 所以先写一个菜单函数 显示菜单的内容 然后选择菜单中的选项 不同的选项 对应不同的功能 因此这个用swit
  • IAP升级应用程序流程和原理(前提是:用户要先编写的boot loader程序)

    STM32升级方法 一 IAP升级 骑着蜗牛写代码的博客 CSDN博客 stm32 iap升级 IAP升级是使用客户自己编写的boot loader而不是系统自带的 所以flash需要为两部分 一部分用来存放IAP boot loader
  • 通信协议——MII/GMII

    MAC层接口协议 概述 MII GMII 概述 随着宽带数据业务的飞速普及 数据产品的端口速率及端口密度也大大提升 于是以太网的MAC与PHY层之间的媒介无关接口 MII 也在不断简化 推陈出新 多种多样 基于此 本文简要介绍了以太网的PH
  • STM32芯片--FSMC外设扩展外部SRAM

    这里写自定义目录标题 一 为什么要扩展外部SRAM 二 什么是SRAM 简介 存储器型号 容量 原理框图 引脚配置 通讯方式 读写特性 读取数据时序图 读取数据的时序要求 写入数据时序图 写入数据的时序要求 三 什么是FSMC外设 简介 F
  • mac系统更新后无法打开axure8/9

    吐槽一下难用的mac 系统更新后 axure打都打不开了 双击一下 好的时候 报个错 Exception has been thrown by the target of an invocation 不好的时候 错也不报 直接打不开 甚至关
  • 密码学——1.密码学概论

    1 基本术语 1 1 密码使用学 ceyptography vs 密码编码学 crypyology 密码使用学是一种为了达到隐藏消息含义而使用秘文写的一门科学 密码分析学是一门研究在不知道通常解密所需要的秘密信息的情况下对加密的信息进行解
  • nacos 集群部署

    nacos 集群部署 之前 nacos 都是单机部署 使用倒还稳定 没有因为 nacos 出过问题 最近因为各种原因连续迁了几次服务器 中间涉及 nacos 服务器 比较麻烦 所以决定把 nacos 改为集群部署 nacos官方也推荐生产环
  • 【面试题】Javascript的这些运算符,你都都掌握哪些?

    前端面试题库 面试必备 推荐 地址 前端面试题库 国庆头像 国庆爱国 程序员头像 总有一款适合你 theme devui blue highlight a11y light 无论是JavaScript还是其他语言 运算符是基础 表达式和语句