JavaScript基础2之运算符、函数

news2024/9/23 7:25:07

JavaScript基础

  • 运算符
    • 一元操作符
      • 递增/递减
      • 一元加和减
    • 布尔操作符
      • 逻辑非
      • 逻辑与
      • 逻辑或
    • 乘性操作符
      • 乘法操作符
      • 除法操作符
      • 取模操作符
    • 加性操作符
      • 加法操作符
      • 减法操作符
    • 比较操作符
      • 相等操作符
      • 关系操作符
  • 函数
    • 函数声明
    • 函数表达式
    • 箭头函数
    • 函数的实参和形参
      • arguments
    • 默认参数
    • 参数的拓展和收集
      • 拓展参数
      • 收集参数
    • return
    • 匿名函数
      • 函数表达式
    • 自执行函数
    • 函数的存储

运算符

一元操作符

递增/递减

  • 前缀递增/递减
let age=18
++age;  
=>
age=age+1

变量的值都会在语句被求值之前改变

let age=18
++age;  //等同于 age=age+1
console.log("age",age)
--age;
console.log("age",age)  //等同于 age=age-1

let num=20
let newNum=--num+2
//变量的值都会在语句被求值之前改变
console.log("num",num) //19
console.log("newNum",newNum) //21

在这里插入图片描述

  • 后缀递增/递减
    在语句被求值之后改变
// 后缀 在语句被求值之后改变
var age=10
age++
console.log("age",age)

var num=2;
var num2=20
var num3=num--+num2 //22
var num4=num+num2  //21
console.log("num3",num3)
console.log("num4",num4)

在这里插入图片描述

一元加和减

一元加由一个加号(+)表示,放在变量前头,对数值没有任何影响

如果将一元加应用到非数值,则会执行与使用 Number()转型函数一样的类型转换:

  • 布尔值 false和 true 转换为 0 和 1
  • 字符串根据特殊规则进行解析
  • 对象会调用它们的 valueOf()或 toString()方法以得到可以转换的值
let num=25
num= +num
console.log("num",num)

let age="0.234"
age = +age
console.log("age",age)

let num1="05"
num1 = +num1
console.log("num1",num1)

let num2="k"
num2 =+num2
console.log("num2",num2)

let num3=false
num3 =+num3
console.log("num3",num3)

let num4={
    valueOf(){
        return -34
    }
}
num4 = +num4
console.log("num4",num4)

在这里插入图片描述
一元减由一个减号(-)表示,放在变量前头,主要用于把数值变成负值,如把 1 转换为-1

let num=25
num= -num
console.log("num",num)

let age="0.234"
age = -age
console.log("age",age)

let num1="05"
num1 = -num1
console.log("num1",num1)

let num2="k"
num2 =-num2
console.log("num2",num2)

let num3=false
num3 =-num3
console.log("num3",num3)

let num4={
    valueOf(){
        return -34
    }
}
num4 = -num4
console.log("num4",num4)

在这里插入图片描述

布尔操作符

逻辑非

!=> 始终返回的是一个布尔值
首先会对操作数转换成布尔值,在对其取反

let a={}
console.log("!a",!a)

let b=""
console.log("!b",!b)

let c="111"
console.log("!c",!c)

let d=0
console.log("!d",!d)

let e=111
console.log("!e",!e)

//null NaN undefined =>都是false
let f=null
console.log("!f",!f)

let g=NaN
console.log("!g",!g)

let h=undefined
console.log("!h",!h)

在这里插入图片描述

逻辑与

&&

let res = true && false
  • 如果第一个操作数是对象,则返回第二个操作数。
  • 如果第二个操作数是对象,则只有第一个操作数求值为 true 才会返回该对象。
  • 如果两个操作数都是对象,则返回第二个操作数。
  • 如果有一个操作数是 null,则返回 null。
  • 如果有一个操作数是 NaN,则返回 NaN。
  • 如果有一个操作数是 undefined,则返回 undefined。

逻辑与操作符是一种短路操作符,意思就是如果第一个操作数决定了结果,那么永远不会对第二个操作数求值。对逻辑与操作符来说,如果第一个操作数是 false,那么无论第二个操作数是什么值,结果也不可能等于 true。

let obj={}
let obj1={name:"张三"}

let res1= obj1 && 2
let res2= true && obj1
let res3= obj && obj1
console.log("res1",res1)
console.log("res2",res2)
console.log("res3",res3)

在这里插入图片描述

逻辑或

||

let res = true || false
  1. true true : true
  2. true false: true
  3. false true : true
  4. false false : false

只有两个操作数为 false 的情况下,结果才为 false

  • 如果第一个操作数是对象,则返回第一个操作数。
  • 如果第一个操作数求值为 false,则返回第二个操作数。
  • 如果两个操作数都是对象,则返回第一个操作数。
  • 如果有两个操作数是 null,则返回 null。
  • 如果有两个操作数是 NaN,则返回 NaN。
  • 如果有两个操作数是 undefined,则返回 undefined。
let obj={}
let obj1={name:"张三"}

let res1=obj || 555
let res2=false || 234
let res3= false || obj1
let res4=obj || obj1
console.log("res1",res1)
console.log("res2",res2)
console.log("res3",res3)
console.log("res4",res4)

在这里插入图片描述

乘性操作符

乘法、除法、取模

乘法操作符

乘法:*

let res = 10*2

特殊情况:

  • 符号相同则为正,符号不同则为负
  • 如果有任一操作数是 NaN,则返回 NaN。
  • Infinity * 0 => NaN
  • Infinity * 非0 => Infinity/-Infinity
  • Infinity * Infinity =Infinity
  • 如果有不是数值的操作数,则先在后台用 Number()将其转换为数值
let a=10*(-9)
let b=NaN * 50
let c=Infinity * 50
let d=Infinity *(-20)
let e=Infinity * 0
let f=Infinity *Infinity
let g=4*"20"
console.log("a",a)
console.log("b",b)
console.log("c",c)
console.log("d",d)
console.log("e",e)
console.log("f",f)
console.log("g",g)

在这里插入图片描述

除法操作符

除法:/

let res = 10*2

特殊情况:

  • 符号相同则为正,符号不同则为负
  • 如果有任一操作数是 NaN,则返回 NaN。
  • Infinity / Infinity => NaN
  • 0/0 => NaN
  • 非0的值 / 0 => 根据第一个操作数的符号返回 Infinity 或 -Infinity
  • 如果是 Infinity 除以任何数值,则根据第二个操作数的符号返回 Infinity 或-Infinity。
  • 如果有不是数值的操作数,则先在后台用 Number()函数将其转换为数值,然后再应用上述规则。
let a=10/(-2)
let b=NaN * 5
let c=Infinity/Infinity
let d=0/0
let e=-100/0
let f=Infinity/5
let g=Infinity/(-10)
let h="50"/10

console.log("a",a)
console.log("b",b)
console.log("c",c)
console.log("d",d)
console.log("e",e)
console.log("f",f)
console.log("g",g)
console.log("h",h)

在这里插入图片描述

取模操作符

%

let result = 26 % 5; // 等于 1

特殊情况:

  • 被除数是无限值,除数是有限值 => NaN
  • 被除数是有限值,除数是0 => NaN
  • Infinity % Infinity => NaN
  • 3 % Infinity => 3
  • 0%9=>0
  • 如果有不是数值的操作数,则先在后台用 Number()函数将其转换为数值,然后再应用上述规则。
let a=Infinity%5
let b=4%0
let c=Infinity%Infinity
let d=3%Infinity
let e=0%9
let f=15%2

在这里插入图片描述

加性操作符

加法、减法

加法操作符

  1. 特殊情况:
  • 如果有任一操作数是 NaN,则返回 NaN;
  • 如果是 Infinity 加 Infinity,则返回 Infinity;
  • 如果是-Infinity 加-Infinity,则返回-Infinity;
  • 如果是 Infinity 加-Infinity,则返回 NaN;
  • 如果是+0 加+0,则返回+0;
  • 如果是-0 加+0,则返回+0;
  • 如果是-0 加-0,则返回-0。
  1. 有一个操作数是字符串
  • 如果两个操作数都是字符串,则将第二个字符串拼接到第一个字符串后面;
  • 如果只有一个操作数是字符串,则将另一个操作数转换为字符串,再将两个字符串拼接在一起。
  1. 如果有任一操作数是对象、数值或布尔值,则调用它们的 toString()方法以获取字符串,然后再应用前面的关于字符串的规则。
  2. 对于 undefined 和 null,则调用 String()函数,分别获取"undefined"和"null"。
let a=NaN+5
let b=Infinity+Infinity
let c=Infinity +(-Infinity)
let d=-Infinity +(-Infinity)
let e="15"+"c"
let f=1+"4"
let obj={
    toString(){
        return "abc"
    }
}
let g=34+obj
let h=undefined+44
let i=null+"125"
console.log("a",a)
console.log("b",b)
console.log("c",c)
console.log("d",d)
console.log("e",e)
console.log("f",f)
console.log("g",g)
console.log("h",h)
console.log("i",i)


在这里插入图片描述

减法操作符

let result = 2 - 1;

特殊用法:

  • 如果有任一操作数是 NaN,则返回 NaN。
  • 如果是 Infinity 减 Infinity,则返回 NaN。
  • 如果是-Infinity 减-Infinity,则返回 NaN。
  • 如果是 Infinity 减-Infinity,则返回 Infinity。
  • 如果是-Infinity 减 Infinity,则返回-Infinity。
  • 如果是+0 减+0,则返回+0。
  • 如果是+0 减-0,则返回-0。
  • 如果是-0 减-0,则返回+0。
  • 如果有任一操作数是字符串、布尔值、null 或 undefined,则先在后台使用 Number()将其转换为数值,然后再根据前面的规则执行数学运算。如果转换结果是 NaN,则减法计算的结果是NaN。
  • 如果有任一操作数是对象,则调用其 valueOf()方法取得表示它的数值。如果该值是 NaN,则减法计算的结果是 NaN。如果对象没有 valueOf()方法,则调用其 toString()方法,然后再将得到的字符串转换为数值。
let a=NaN-5
let b=Infinity-Infinity
let c=Infinity-(-Infinity)
let d=-Infinity -(-Infinity)
let e=-Infinity -Infinity
let f=15-"c"
let g=5-true
let h=5-null
let i=5-undefined
let obj={
    toString(){
        return "33"
    }
}
let j=34-obj

console.log("a",a)
console.log("b",b)
console.log("c",c)
console.log("d",d)
console.log("e",e)
console.log("f",f)
console.log("g",g)
console.log("h",h)
console.log("i",i)
console.log("j",j)

在这里插入图片描述

比较操作符

相等操作符

相等操作符包括四种:

  • 等于( == )
  • 不等于(!=)
  • 全等( === )
  • 不全等(!== )
  1. 首先会判断两者类型是否相同,相同的话就比较两者的大小;
  2. 类型不相同的话,就会进行类型转换;
  3. 会先判断是否在对比 null 和 undefined,是的话就会返回 true
  4. 判断两者类型是否为 string 和 number,是的话就会将字符串转换为 number
1 == '1'1 ==  1
  1. 判断其中一方是否为 boolean,是的话就会把 boolean 转为 number 再进行判断
'1' == true'1' ==  11  ==  1
  1. 判断其中一方是否为 object 且另一方为 string、number 或者 symbol,是的话就会把 object 转为原始类型再进行判断
'1' == { name: 'js' }'1' == '[object Object]'

其中一个操作数是NaN,相等运算符会返回false,不相等运算符会返回true。 ​
对于不等于运算符(!=),只有在强制类型转化后不相等才会返回true。 ​
对于全等运算符( === ),只有当两个操作数的数据类型和值都相等时,才会返回true。它并不会进行数据类型的转化。 ​
对于不全等运算符( !== ),只有两个操作数在不进行类型转化的情况下是不相等的,才会返回true。 ​
在平时的开发中,建议使用全等不全等在做比较,这样会更加严谨,避免出现意料之外的结果。

关系操作符

关系操作符包括四种:

  • 小于(<)
  • 大于(>)
  • 小于等于(<=)
  • 大于等于(>=)

返回布尔值

  • 如果这两个操作数都是数值,则执行数值比较;
  • 如果两个操作数都是字符串,则比较两个字符串对应的字符编码值;
  • 如果一个操作数是数值,则将另一个操作数转换为一个数值,然后执行数值比较;
  • 如果一个操作数是对象,则调用这个对象的valueOf()方法,并用得到的结果根据前面的规则执行比较;
  • 如果一个操作数是布尔值,则先将其转换为数值,然后再执行比较。

函数

实际上也是对象
每个函数都是Function 类型的实例,而且也有属性和方法

函数声明

function sum(a, b) {
	return a +b
}

函数表达式

var sum = function (a,b){
	return a + b
}

函数声明提升,但是函数表达式是不可以的

console.log(sum(1,2))

//函数声明提升
function sum(a,b){
    return a+b
}

在这里插入图片描述

console.log(sum(1,2))

var sum=function (a,b){
    return a+b
}

在这里插入图片描述

箭头函数

var sum=(a,b)=>{
    return a+b
}

console.log(sum(1,2))

在这里插入图片描述

函数的实参和形参

  • 形参是我们定义函数时所列举的变量。
  • 实参是我们调用函数时所传递给函数的值。
function selfIntroduce(name,age){   //形参
    console.log(name,age)
}

selfIntroduce("张三",18)  //实参

在这里插入图片描述

arguments

arguments 对象是一个类数组对象,
箭头函数不能使用 arguments

function sayHi(name, message) {
        console.log("Hello " + name + ", " + message);
}function sayHi() {
        console.log("Hello " + arguments[0] + ", " + arguments[1]);
}

示例:

function callName(){
    console.log("arguments",arguments)
    console.log(arguments[0], arguments[1],arguments[2]);
}
callName("张三","李四","王五")

在这里插入图片描述

默认参数

function callName(name="张三"){
    console.log(name)
    //arguments不反应默认的值,只反映传递的参数
    console.log(arguments.length)
    console.log("-----------------")
}

callName("李四")
callName()

在这里插入图片描述

参数的拓展和收集

拓展参数

在给函数传参时,有时候可能不需要传一个数组,而是要分别传入数组的元素

let values=[1,2,3,4,5]
function getSum(){
    let sum=0

    for (let i = 0; i < arguments.length; i++) {
        sum+=arguments[i]
    }
    return sum
}

//不使用拓展操作符
console.log(getSum.apply(null,values))
//使用拓展操作符
console.log(getSum(...values));

在这里插入图片描述

收集参数

使用扩展操作符把不同长度的独立参数组合为一个数组。
类似arguments 对象的构造机制,只不过收集参数的结果会得到一个 Array 实例。

function getNumber(...values){
    console.log(values)
}

getNumber(2, 4, 6, 8, 10)

在这里插入图片描述

return

return语句终止函数的执行,并返回一个指定的值给函数调用者。

function getNumber(){
    return 1+1
}

var num=getNumber()
console.log(num)

在这里插入图片描述

匿名函数

var double = new Function('x', 'return 2 * x;');

函数表达式

var square = function(x) { 
	return 2* x; 
}

自执行函数

自发执行的函数,无需调用

(function (x,y){
    console.log(x+y)
} )(2,3)

在这里插入图片描述

函数的存储

函数是也是一种对象,所以也是存储在堆中

function add(x, y) {
        return x + y
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1490456.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vue 使用vue-scroller 列表滑动到底部加载更多数据

安装插件 npm install vue-scroller -dmain.js import VueScroller from vue-scroller Vue.use(VueScroller)<template><div class"wrap"><div class"footer"><div class"btn" click"open true">新增</d…

1.2计算机体系结构与存储系统-2

1.编址的相关计算 存1个1或1个0的单位是位&#xff08;bit&#xff09;&#xff1b; 内存是按字节&#xff08;byte&#xff09;编址的&#xff1b; 1byte8bit&#xff1b; 如果有4096个字节的内存&#xff0c;想要表示内存地址的话需要多少位&#xff1f; 0-4095&#xff08;…

项目总体测试计划word

1. 引言 1.1 目的 1.2 适用范围 2. 测试类型 2.1 集成测试 2.2 系统测试 2.3 验收测试 2.4 回归测试 3. 测试环境 4. 测试工具 5. 测试内容 5.1 集成测试 5.1.1 集成测试角色与职责 5.1.2 集成测试产生的工作产品清单 5.2 系统测试 5.2.1 系统测试的角色与职责 5.2.2 系统测试产…

双缝实验是量子力学的重要基石之一

双缝实验是物理学界的基石&#xff0c;特别是对于量子力学来讲。理解这个实验需要结合直觉、数学以及对量子理论抽象且奇异的现实的接受。 一、双缝实验的基础知识 双缝实验证明了波粒二象性的概念&#xff0c;这是量子粒子的基本属性。量子粒子同时具有粒子和波的性质。 在这…

【鸿蒙 HarmonyOS 4.0】登录流程

一、背景 登录功能在应用中是一个常用模块&#xff0c;此次使用 HarmonyOS 实现登录流程&#xff0c;包含页面呈现与网络请求。 二、页面呈现 三、实现流程 3.1、创建项目 构建一个ArkTS应用项目(Stage模型)&#xff0c;今天创建流程可查看官网教程&#xff1a;文档中心 目…

BUUCTF crypto做题记录(13)新手向

一、[MRCTF2020]vigenere 这是一道维吉尼亚密码&#xff0c;但由于不知道密钥&#xff0c;所以我们需要采用爆破的方式。Vigenere Solver | guballa.de 答案&#xff1a;flag{vigenere_crypto_crack_man} 二、[MRCTF2020]keyboard 之前做过一个类似的题目&#xff0c;用九宫格…

一文掌握:教务管理系统该如何设计?

hello&#xff0c;我是贝格前端工场&#xff0c;本期给大家分享教务管理系统的知识点&#xff0c;欢迎老铁们点赞、关注&#xff0c;如有需求可以私信我们。 一、什么是教务管理系统 教务管理系统是一种用于管理学校或教育机构的学生、课程和教学活动的软件系统。它提供了一种…

基于SpringBoot+Apache POI的前后端分离外卖项目-苍穹外卖(十九)

数据导出 1. 工作台1.1 需求分析和设计1.1.1 产品原型1.1.2 接口设计1.2.1 Controller层1.2.2 Service层接口1.2.3 Service层实现类1.2.4 Mapper层 1.3 功能测试 2. Apache POI2.1 介绍2.2 入门案例2.2.1 将数据写入Excel文件2.2.2 读取Excel文件中的数据 3. 导出运营数据Excel…

K8s+ArgoCD,低投入构建内部开发者平台

01 简介 许多人认为&#xff0c;要建立内部开发人员平台&#xff0c;就必须使用像 Spotify Backstage 这样的工具。其实未必&#xff0c;如果将 Kubernetes label 等更原生的方法与 Argo CD 等工具和 GitOps 原则相结合&#xff0c;也可以有效地为开发人员和平台团队提供自助服…

java spring 03 启动细节

启动类ClassPathXmlApplicationContext public ClassPathXmlApplicationContext(String[] configLocations, boolean refresh, Nullable ApplicationContext parent)throws BeansException {super(parent);setConfigLocations(configLocations);if (refresh) {refresh();}}其中…

护眼台灯怎么样选择?5款好用的护眼台灯推荐,完全凭实力说话!

随着护眼台灯用户增长&#xff0c;近年来护眼台灯检测不合格的的问题频频爆出&#xff0c;这种情况大多数都是来自于一些价格低廉、非专业缺乏技术积累的品牌厂家&#xff0c;长期使用存在很大风险。所以我们在选购护眼台灯的时候不能盲目根据销量或者价格就购买&#xff0c;需…

vue2+vite+@vitejs/plugin-vue2可以使用require引用图片资源

很多文章都说vite不能用require&#xff0c;vue3vite确实是这样的&#xff0c;但今天无意间发现vue2vite中是可以使用require引用资源的 vue3搭配vite一般使用的是vitejs/plugin-vue解析vue语法&#xff0c;而vue2使用的则是另一个插件vitejs/plugin-vue2插件解析vue语法 看下…

表单验证、属性绑定(一个属性根据另一个属性有无进行操作)

表单验证 一个属性根据另一个属性有无进行操作&#xff08;属性绑定&#xff09; 1、问题描述 ​ 需求&#xff1a;表单里面后两个属性需要根据前面一个属性进行有无判断。如果前面属性没有输入值&#xff0c;则不需要进行操作&#xff1b;如果前面属性有输入值&#xff0c;则…

胜出之道:NCDA设计大赛获奖作品解读与交互程序设计的优化策略

第12届大赛简介 - 未来设计师全国高校数字艺术设计大赛&#xff08;NCDA&#xff09;开始啦&#xff01;未来设计师全国高校数字艺术设计大赛&#xff08;NCDA&#xff09;是由工信部人才交流中心主办&#xff0c;教育部中国高等教育学会认定&#xff0c;教育厅发文立项&#x…

RedisDesktopManager连接Ubuntu的Redis失败解决办法

配置redis 1.设置redis在后台服务&#xff0c;修改配置文件 默认情况下是 no ,修改为yes&#xff0c;可以后台服务 2、设置redis端口&#xff0c;默认端口是6379&#xff0c;可以根据自己的需要&#xff0c;找到/et/redis/redis.conf文件, 修改port 3、设置密码 配置文件中…

AI论文速读 | TimeXer:让 Transformer能够利用外部变量进行时间序列预测

题目&#xff1a; TimeXer: Empowering Transformers for Time Series Forecasting with Exogenous Variables 作者&#xff1a;Yuxuan Wang ; Haixu Wu&#xff08;吴海旭&#xff09; ; Jiaxiang Dong ; Yong Liu ; Yunzhong Qiu ; Haoran Zhang ; Jianmin Wang&#xff08;…

会员营销中如何让会员主动完善信息?

会员主动完善信息&#xff0c;可以通过积分、优惠券、会员权益进行激励。 会员信息主要包括会员姓名、生日、地址、兴趣爱好等&#xff1b;需要让会员完善的信息要围绕营销目标和营销计划&#xff0c;不要过度收集会员信息。 在博阳会员管理系统中定义会员完善个人信息页&#…

Java面试题总结8:springboot

Spring Boot自动配置原理 importConfigurationSpring spi 自动配置类由各个starter提供&#xff0c;使用ConfigurationBean定义配置类&#xff0c;放到META-INF/spring.factories下 使用Spring spi扫描META-INF/Spring.factories下的配置类 如何理解Spring Boot中Starter …

STM 32 HAL库 UART 调试的问题

问题1&#xff1a;STM32G0 系列 DMA中断接收&#xff0c;应用层无法接收到数据 分析&#xff1a; Debug发现&#xff0c;最终没有进入串口中断函数 。 于是&#xff0c;检查Stm32CubeMX 的工程配置 两个串口的全局中断没有使能。 解决&#xff1a;勾选上图中红框部分&#x…

STM32CubeIDE基础学习-安装芯片固件支持包

STM32CubeIDE基础学习-添加芯片固件支持包 前言 前面的文章在安装STM32CubeIDE软件时没有安装这个芯片PACK包&#xff0c;如果工程没有这个固件支持包的话是无法正常使用的&#xff0c;随便安装一个和芯片对应系列的支持包就可以了。 这篇文章来记录一下新增PACK包的常用操作…