第四章:表达式与操作符
1、什么是操作数,什么是结果类型
在计算机编程和计算机科学中,操作数(Operands)是指参与运算或操作的值或数据。操作数可以是数字、变量、常量或表达式,取决于具体的运算或操作。操作数在各种计算中被使用,例如算术运算、逻辑运算、位运算等。
- 操作数的例子:
- 在算术运算中,操作数通常是参与运算的数字,比如加法中的两个数字:2 + 3。这里的2和3就是操作数。
- 在逻辑运算中,操作数是用于逻辑判断的值,比如布尔表达式:
a && b
。这里的a和b就是操作数,它们的值为真或假(true或false)。 - 在位运算中,操作数是在二进制位级别上进行操作的值,例如按位与(&)操作:
a & b
。这里的a和b是二进制数,用于进行按位与运算。
操作数的数量取决于运算符的类型。例如,一元运算符(比如取反运算符"!")只需要一个操作数,而二元运算符(比如加法运算符"+")需要两个操作数。
结果类型(Result Type)是指运算或操作的结果的数据类型。当对操作数进行运算或操作时,会根据运算符的规则和操作数的数据类型得到一个结果,这个结果的数据类型就是结果类型。
- 结果类型的例子:
- 在算术运算中,两个整数相加得到的结果是一个整数,所以结果类型就是整数类型。
- 在逻辑运算中,逻辑与运算的结果是布尔值(true或false),所以结果类型就是布尔类型。
- 在位运算中,按位与操作的结果是一个新的二进制数,所以结果类型是二进制类型。
结果类型对于确保计算的正确性和一致性非常重要。在编程中,如果对不同类型的操作数进行运算,编程语言会自动进行类型转换,以得到合理的结果类型。
例如,在JavaScript中:
javascriptCopy code
const x = 5; // x是一个整数 const y = 2.5; // y是一个浮点数 const result = x + y; // 进行算术运算,结果为7.5,result的类型为浮点数
在这个例子中,x是一个整数,y是一个浮点数,它们的数据类型不同。但在进行加法运算时,JavaScript会自动将整数转换为浮点数,以得到正确的结果类型。结果result是一个浮点数。
例子:
字符串方法
替换字符串内容
replace() 方法用另一个值替换在字符串中指定的值
转换为大写和小写
通过 toUpperCase() 把字符串转换为大写
concat() 方法
concat() 连接两个或多个字符串
var text = "Hello" + " " + "World!";
var text = "Hello".concat(" ", "World!");
String.trim()
trim() 方法删除字符串两端的空白符
var str = " Hello World! ";
alert(str.trim());
charAt() 方法
charAt() 方法返回字符串中指定下标(位置)的字符串
charCodeAt() 方法
charCodeAt() 方法返回字符串中指定索引的字符 unicode 编码
把字符串转换为数组
可以通过 split() 将字符串转换为数组
var txt = "a,b,c,d,e"; // String
txt.split(","); // 以逗号分隔变数组
txt.split(" "); // 按空格分隔
txt.split("|"); // Split on pipe
练习题:
查找字符串 txt
中字符 h
的位置。
var txt = "abcdefghijklm"; var pos = txt.indexOf("h"); // 7
数值
var x = "100";
var y = "10";
var z = x / y; // z 将是 10
var x = "100";
var y = "10";
var z = x * y; // z 将是 1000
var x = "100";
var y = "10";
var z = x - y; // z 将是 90
var x = "100";
var y = "10";
var z = x + y; // z 不会是 110(它将是 10010)
可换成
var x = '100'; var y = '10'; var z = parseInt( x ) + parseInt( y ); console.log(z); // 输出:110
NaN - 非数值
var x = 100 / "Apple"; // x 将是 NaN (非数字)
var x = 100 / "10"; // x 将是 10
var x = 100 / "Apple";
isNaN(x); // 返回 true 因为 x 不是数字
十六进制
JavaScript 会把前缀为 0x 的数值常量解释为十六进制
使用 toString() 方法把数输出为十六进制、八进制或二进制。
十六进制以16为基数。十进制以10为基数。八进制是基数8。二进制是基数2。
var myNumber = 32;
myNumber.toString(10); // 返回 32
myNumber.toString(32); // 返回 10
myNumber.toString(16); // 返回 20
myNumber.toString(8); // 返回 40
myNumber.toString(2); // 返回 100000
Number 方法和属性
var x = 123;
x.toString(); // 从变量 x 返回 123
(123).toString(); // 从文字 123 返回 123
(100 + 23).toString(); // 从表达式 100 + 23 返回 123
toExponential() 方法
toExponential() 返回字符串值,它包含已被四舍五入并使用指数计数法的数字
var x = 9.656;
x.toExponential(2); // 返回 9.66e+0
toFixed() 方法
toFixed() 返回字符串值,它包含了指定位数小数的数字
var x = 9.656;
x.toFixed(0); // 返回 10
x.toFixed(2); // 返回 9.66
x.toFixed(4); // 返回 9.6560
x.toFixed(6); // 返回 9.656000
toPrecision() 方法
toPrecision() 返回字符串值,它包含了指定长度的数字
var x = 123;
x.valueOf(); // 从变量 x 返回 123
(123).valueOf(); // 从文字 123 返回 123
(100 + 23).valueOf(); // 从表达式 100 + 23 返回 123
把变量转换为数值
这三种 JavaScript 方法可用于将变量转换为数字:
- Number() 方法 var z = Number(x)+Number(y)
- parseInt() 方法 var z = parseInt(x)+parseInt(y) //解析一段字符串并返回数值。允许空格。只返回首个数字
- parseFloat() 方法 var z = parseFloat(x)+parseFloat(y) 解析一段字符串并返回数值。允许空格。只返回首个数字
这些方法并非数字方法,而是全局 JavaScript 方法。
数值运算
Math.round()
Math.round(x) 的返回值是 x 四舍五入为最接近的整数
Math.pow()
Math.pow(x, y) 的返回值是 x 的 y 次幂:
Math.sqrt()
Math.sqrt(x) 返回 x 的平方根:
Math.sqrt(64); // 返回 8
Math.abs()
Math.abs(x) 返回 x 的绝对(正)值:
Math.abs(-4.7); // 返回 4.7
Math.ceil()
Math.ceil(x) 的返回值是 x 上舍入最接近的整数:
Math.ceil(4.4); // 返回 5
Math.floor()
Math.floor(x) 的返回值是 x 下舍入最接近的整数
Math.floor(4.7); // 返回 4
Math.sin()
Math.sin(x) 返回角 x(以弧度计)的正弦(介于 -1 与 1 之间的值)。
如果您希望使用角度替代弧度,则需要将角度转换为弧度:
Angle in radians = Angle in degrees x PI / 180.
Math.sin(90 * Math.PI / 180); // 返回 1 (90度的正弦)
Math.min() 和 Math.max()
Math.min() 和 Math.max() 可用于查找参数列表中的最低或最高值:
随机数
数组
数组是一种特殊的变量,它能够一次存放一个以上的值。
Array.foreach() 函数
添加数组元素
向数组添加新元素的最佳方法是使用 push() 方法
关联数组
很多编程元素支持命名索引的数组。
具有命名索引的数组被称为关联数组(或散列)。
JavaScript 不支持命名索引的数组。
在 JavaScript 中,数组只能使用数字索引。
var person = [];
person[0] = "John";
person[1] = "Doe";
person[2] = 46;
var x = person.length; // person.length 将返回 3
var y = person[0]; // person[0] 将返回 "John"
避免 new Array()
没有必要使用 JavaScript 的内建数组构造器 new Array()。
请使用 [] 取而代之!
下面两条不同的语句创建了名为 points 的新的空数组:
var points = new Array(); // 坏的
var points = []; // 好的
把数组转换为字符串
JavaScript 方法 toString() 把数组转换为数组值(逗号分隔)的字符串
join() 方法也可将所有数组元素结合为一个字符串。
它的行为类似 toString()
,但是您还可以规定分隔符
var ff = [34,5,6,77,8]
undefined
ff.join() // '34,5,6,77,8'
但想将字符串里面的逗号去掉可写
var ff = [34, 5, 6, 77, 8]; // 使用空字符串作为分隔符来连接数组的元素
var joinedString = ff.join(" ");
console.log(joinedString); // 输出:"3456778"
Popping 和 Pushing
在处理数组时,删除元素和添加新元素是很简单的。
Popping 和 Pushing 指的是:
从数组弹出项目,或向数组推入项目。
var s = [1,2,33,22]
s.pop() // [1,2,33]
s.push(55) // [1,2,33,55]
位移元素
位移与弹出等同,但处理首个元素而不是最后一个。
shift() 方法会删除首个数组元素,并把所有其他元素"位移"到更低的索引
unshift() 方法(在开头)向数组添加新元素,并"反向位移"旧元素
删除元素
既然 JavaScript 数组属于对象,其中的元素就可以使用 JavaScript delete 运算符来删除
拼接数组
splice() 方法可用于向数组添加新项:
var fruits = ["Banana", "Orange", "Apple", "Mango"];
fruits.splice(2, 2, "Lemon", "Kiwi");
['Apple', 'Mango']0: "Apple"1: "Mango"length: 2[[Prototype]]: Array(0)
fruits
['Banana', 'Orange', 'Lemon', 'Kiwi']
使用 splice() 来删除元素
通过聪明的参数设定,您能够使用 splice() 在数组中不留"空洞"的情况下移除元素
var fruits = ["Banana", "Orange", "Apple", "Mango"];
fruits.splice(0, 1); // 去除 fruits 的第一个元素
合并(连接)数组
concat() 方法通过合并(连接)现有数组来创建一个新数组:
实例(合并三个数组)
var arr1 = ["Cecilie", "Lone"];
var arr2 = ["Emil", "Tobias", "Linus"];
var arr3 = ["Robin", "Morgan"];
var myChildren = arr1.concat(arr2, arr3);
裁剪数组
slice() 方法用数组的某个片段切出新数组。
本例从数组元素 1 ("Orange")开始切出一段数组:
方法:
数组排序
sort() 方法以字母顺序对数组进行排序:
reverse() 方法反转数组中的元素。
您可以使用它以降序对数组进行排序:
比值函数
比较函数的目的是定义另一种排序顺序。
比较函数应该返回一个负,零或正值,这取决于参数:
对数组使用 Math.max()
您可以使用 Math.max.apply 来查找数组中的最高值:
对数组使用 Math.min()
您可以使用 Math.min.apply 来查找数组中的最低值:
Math.min.apply([1, 2, 3]) 等于 Math.min(1, 2, 3)。
JavaScript 数组迭代
forEach() 方法为每个数组元素调用一次函数(回调函数)
var l = '';
var number = [33, 4, 56, 67];
number.forEach(function(element) { // 在这个回调函数中,element 是数组中的当前元素
l += element + ' ';
// 将当前元素添加到变量 l 中,用空格分隔
});
Array.map()
map() 方法通过对每个数组元素执行函数来创建新数组。
map() 方法不会对没有值的数组元素执行函数。
map() 方法不会更改原始数组。
这个例子将每个数组值乘以2:
// 原始数组
var numbers = [1, 2, 3, 4, 5];
// 使用 map() 将每个数字乘以 2,并返回新数组
var a = numbers.map(function(number) { return number * 2; });
console.log(a); // 输出:[2, 4, 6, 8, 10]
Array.filter() 用于创建一个新数组,其中包含满足条件的元素
filter() 方法创建一个包含通过测试的数组元素的新数组。
Array.every() 用于检查数组的所有元素是否满足条件。
every() 方法检查所有数组值是否通过测试。
Array.some() 用于检查数组是否至少有一个元素满足条件。
some() 方法检查某些数组值是否通过了测试。
这个例子检查某些数组值是否大于 18:
Array.reduce() 用数组的第一个元素开始,从左到右进行归约操作
reduce() 方法在每个数组元素上运行函数,以生成(减少它)单个值。
reduce() 方法在数组中从左到右工作。另请参阅 reduceRight()。
reduce() 方法不会减少原始数组。
Array.reduceRight() 从数组的最后一个元素开始,从右到左进行归约操作。
reduceRight() 方法在每个数组元素上运行函数,以生成(减少它)单个值。
reduceRight() 方法在数组中从右到左工作。另请参阅 reduce()。
reduceRight() 方法不会减少原始数组。
Array.indexOf()
indexOf() 方法在数组中搜索元素值并返回其位置。
注释: 第一个项目的位置是 0,第二个项目的位置是 1,以此类推。
Array.lastIndexOf()
Array.lastIndexOf() 与 Array.indexOf() 类似,但是从数组结尾开始搜索。
Array.find()
find() 方法返回通过测试函数的第一个数组元素的值。
这个例子查找(返回)大于 18 的第一个元素的值:
Array.findIndex()
findIndex() 方法返回通过测试函数的第一个数组元素的索引。
这个例子查找大于 18 的第一个元素的索引:
JavaScript 日期方法
JavaScript 布尔运算符
JavaScript 比较运算符
JavaScript if else 语句
JavaScript Switch 语句
JavaScript For 循环
JavaScript 数据类型
JavaScript 严格模式
JavaScript Arrow 箭头函数
对象方法()
call()的用法
apply()去重
1. 解构赋值:
解构赋值允许你从数组或对象中提取值并赋给变量,让代码更简洁易读。
javascript复制代码
const [a, b] = [1, 2]; // a = 1, b = 2 const { firstName, lastName } = person; // 从对象中提取属性值
2. 扩展语法和剩余参数:
通过扩展语法可以快速复制数组或对象,而剩余参数允许你接收不定数量的参数并将其收集到一个数组中。
javascript复制代码
const array1 = [1, 2, 3]; const array2 = [...array1, 4, 5]; // [1, 2, 3, 4, 5] function sum(...numbers) { return numbers.reduce((acc, num) => acc + num, 0); }
3. Promise 和异步编程:
Promise 是处理异步操作的方式之一,可以更好地管理回调地狱。
javascript复制代码
function fetchData() { return new Promise((resolve, reject) => { // 异步操作 if (success) { resolve(data); } else { reject(error); } }); } fetchData() .then(data => console.log(data)) .catch(error => console.error(error));
4. 箭头函数:
箭头函数提供了更简洁的语法来定义函数,并且自动捕获上下文的 this
值。
javascript复制代码
const multiply = (a, b) => a * b; const person = { name: 'John', sayHi: () => { console.log(`Hello, ${this.name}`); // 这里的 this 不是 person 对象 } };
5. 类的继承和扩展:
JavaScript 支持基于类的继承,使你能够创建一个类并继承另一个类的属性和方法。
javascript复制代码
class Animal { constructor(name) { this.name = name; } speak() { console.log(`${this.name} makes a sound.`); } } class Dog extends Animal { speak() { console.log(`${this.name} barks.`); } }
Promise 是什么?
Promise 是 JavaScript 中用于处理异步操作的一种编程模式,它允许你以更直观的方式编写和管理异步代码,避免了回调地狱(callback hell)的问题。Promise 表示一个可能会在未来完成或失败的操作,并提供了一种结构来处理操作完成后的结果或错误。
Promise 由以下三种状态组成:
-
Pending(进行中): 初始状态,表示操作还未完成或失败。
-
Fulfilled(已完成): 表示操作成功完成,并携带着一个值(结果)。
-
Rejected(已失败): 表示操作失败,通常携带一个错误对象,说明操作失败的原因。
Promise 的作用:
-
更可读的异步代码: Promise 使得异步操作的代码更易读、更像是同步代码。它避免了多层嵌套的回调函数,提高了代码的可读性和可维护性。
-
处理异步流程: Promise 允许你按顺序执行一系列异步操作,每个操作依赖于前一个操作的结果。这样可以更好地组织异步代码,使其更具有逻辑性。
-
处理错误: Promise 允许你在链式操作中捕获和处理错误。你可以通过
.catch()
方法来捕获链式中的任何错误,从而提供更好的错误处理机制。 -
并行执行: 使用
Promise.all()
,你可以并行执行多个异步操作,并在它们都完成时获得结果。这在某些情况下可以提高性能。
Promise 的基本使用:
以下是一个简单的 Promise 示例,展示了如何创建、处理和使用 Promise 对象:
javascript复制代码
// 创建一个 Promise,表示异步操作 const myPromise = new Promise((resolve, reject) => { setTimeout(() => { const randomNumber = Math.random(); if (randomNumber > 0.5) { resolve(randomNumber); // 操作成功完成 } else { reject(new Error("Random number is too small")); // 操作失败 } }, 1000); }); // 使用 Promise myPromise .then((fulfilledValue) => { console.log("Promise fulfilled with value:", fulfilledValue); }) .catch((error) => { console.error("Promise rejected with error:", error); });
在这个示例中,myPromise
可能会在 1 秒后变为 fulfilled
或 rejected
状态,根据情况传递结果或错误。
总之,Promise 是一种用于处理异步操作的强大模式,可以帮助你更清晰地编写异步代码、处理错误并控制流程。