javascript权威指南

第四章:表达式与操作符

1、什么是操作数,什么是结果类型

在计算机编程和计算机科学中,操作数(Operands)是指参与运算操作值或数据。操作数可以是数字、变量、常量或表达式,取决于具体的运算或操作。操作数在各种计算中被使用,例如算术运算、逻辑运算、位运算等。

  1. 操作数的例子:
    • 在算术运算中,操作数通常是参与运算的数字,比如加法中的两个数字:2 + 3。这里的2和3就是操作数。
    • 在逻辑运算中,操作数是用于逻辑判断的值,比如布尔表达式:a && b。这里的a和b就是操作数,它们的值为真或假(true或false)。
    • 在位运算中,操作数是在二进制位级别上进行操作的值,例如按位与(&)操作:a & b。这里的a和b是二进制数,用于进行按位与运算。

操作数的数量取决于运算符的类型。例如,一元运算符(比如取反运算符"!")只需要一个操作数,而二元运算符(比如加法运算符"+")需要两个操作数。

结果类型(Result Type)是指运算或操作的结果的数据类型。当对操作数进行运算或操作时,会根据运算符的规则和操作数的数据类型得到一个结果,这个结果的数据类型就是结果类型。

  1. 结果类型的例子:
    • 在算术运算中,两个整数相加得到的结果是一个整数,所以结果类型就是整数类型。
    • 在逻辑运算中,逻辑与运算的结果是布尔值(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 由以下三种状态组成:

  1. Pending(进行中): 初始状态,表示操作还未完成或失败。

  2. Fulfilled(已完成): 表示操作成功完成,并携带着一个值(结果)。

  3. Rejected(已失败): 表示操作失败,通常携带一个错误对象,说明操作失败的原因。

Promise 的作用:

  1. 更可读的异步代码: Promise 使得异步操作的代码更易读、更像是同步代码。它避免了多层嵌套的回调函数,提高了代码的可读性和可维护性。

  2. 处理异步流程: Promise 允许你按顺序执行一系列异步操作,每个操作依赖于前一个操作的结果。这样可以更好地组织异步代码,使其更具有逻辑性。

  3. 处理错误: Promise 允许你在链式操作中捕获和处理错误。你可以通过 .catch() 方法来捕获链式中的任何错误,从而提供更好的错误处理机制。

  4. 并行执行: 使用 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 秒后变为 fulfilledrejected 状态,根据情况传递结果或错误。

总之,Promise 是一种用于处理异步操作的强大模式,可以帮助你更清晰地编写异步代码、处理错误并控制流程。

猜你喜欢

转载自blog.csdn.net/lv_suri/article/details/132048013