0
点赞
收藏
分享

微信扫一扫

JS-16-标签函数

_铁马冰河_ 3小时前 阅读 1

一、模版字符串

模版字符串,可以非常方便地引用变量,并合并出最终的字符串。

它允许你嵌入表达式,并通过${expression}语法来执行这些表达式。模板字符串使用反引号(`)而不是普通的单引号或双引号。

 

模板字符串有几个主要的优点:

1、多行字符串:你可以直接在字符串中换行,而不需要使用\n或字符串连接。

let greeting = `  
  Hello,  
  this is a template string  
  that spans multiple lines.  
`;  
console.log(greeting);


2、嵌入表达式:使用${}可以嵌入变量或执行JavaScript表达式。

let name = "Alice";  
let age = 30;  
  
let bio = `My name is ${name} and I am ${age} years old.`;  
console.log(bio);  // 输出: My name is Alice and I am 30 years old.


3、标签模板:模板字符串可以与函数一起使用,以创建更复杂的字符串操作。

标签模板允许你定义一个函数来处理模板字符串。函数的第一个参数是一个字符串数组,其余的参数是模板字符串中的变量。

function upperCase(strings, ...values) {  
  let result = '';  
  for (let i = 0; i < strings.length; i++) {  
    result += strings[i];  
    if (i < values.length) {  
      result += values[i].toUpperCase();  
    }  
  }  
  return result;  
}  
  
let greeting = upperCase`hello, ${'world'}!`;  
console.log(greeting);  // 输出: hello, WORLD!

二、标签函数

什么是标签函数?让我们看一个例子:

const email = "test@example.com";
const password = 'hello123';

function sql(strings, ...exps) {
    console.log(`SQL: ${strings.join('?')}`);
    console.log(`SQL parameters: ${JSON.stringify(exps)}`);
    return {
        name: '小明',
        age: 20
    };
}

const result = sql`SELECT * FROM users WHERE email=${email} AND password=${password}`;

console.log(JSON.stringify(result));

 

这里出现了一个奇怪的语法:

sql`SELECT * FROM users WHERE email=${email} AND password=${password}`

模板字符串前面以sql开头,实际上这是一个标签函数,上述语法会自动转换为对sql()函数的调用。我们关注的是,传入sql()函数的参数是什么?

sql()函数实际上接收两个参数:

第一个参数strings是一个字符串数组,它是["SELECT * FROM users WHERE email=", " AND password=", ""],即除去${xxx}剩下的字符组成的数组;

第二个参数...exps是一个可变参数,它接收的也是一个数组,但数组的内容是由模板字符串里所有的${xxx}的实际值组成,即["test@example.com", "hello123"],因为解析${email}得到"test@example.com",解析${password}得到"hello123"。

标签函数sql()实际上是一个普通函数,我们在内部把strings拼接成一个SQL字符串,把...exps作为参数,就可以实现一个安全的SQL查询,并返回查询结果。此处并没有真正的数据库连接,因此返回一个固定的Object。

标签函数和普通函数的定义区别仅仅在于参数,如果我们想对数据库进行修改,完全可以定义一个标签函数如下:

function update(strings, ...exps) {
    let sql = strings.join('?');
    // 执行数据库更新
    // TODO:
}

函数调用可以简化为带标签的模板字符串:

let id = 123;
let age = 21;
let score = 'A';

update`UPDATE users SET age=${age}, score=${score} WHERE id=${id}`;

 

三、备注

3-1、strings.join()

在 JavaScript 中,Array.prototype.join() 是一个数组方法,用于将数组(或数组的一个子集)的所有元素连接到一个字符串中

join() 方法接受一个可选的参数,这个参数将作为连接数组中各个元素的分隔符。如果省略该参数,数组元素会以逗号 (,) 分隔

示例:

let fruits = ["Banana", "Orange", "Apple", "Mango"];  
  
let fruitString = fruits.join();      // "Banana,Orange,Apple,Mango"  
let fruitStringWithSpace = fruits.join(" "); // "Banana Orange Apple Mango"  
let fruitStringWithDash = fruits.join("-"); // "Banana-Orange-Apple-Mango"

3-2、JSON.stringify()

在 JavaScript 中,JSON.stringify() 方法用于将一个 JavaScript 值(对象或数组)转换为一个 JSON 格式的字符串

这个方法非常有用,特别是在需要将 JavaScript 数据结构发送到服务器或者保存到本地存储时。

JSON.stringify() 方法可以接受几个参数来定制输出的 JSON 字符串:

1、value (必需):要转换的 JavaScript 值(对象或数组)。
2、replacer (可选):一个函数数组,用于在字符串化过程中过滤替换值。
3、space (可选):一个字符串或数字,用于在输出 JSON 中添加缩进换行,使其更易于阅读。

这里是一些使用 JSON.stringify() 的示例:

let obj = {  
  name: "John",  
  age: 30,  
  city: "New York"  
};  
  
let jsonString = JSON.stringify(obj);  
console.log(jsonString); // 输出: {"name":"John","age":30,"city":"New York"}  
  
// 使用 replacer 函数来过滤属性  
function replacer(key, value) {  
  if (typeof value === 'string') {  
    return undefined; // 返回 undefined 将从输出中删除该属性  
  }  
  return value;  
}  
  
let filteredJsonString = JSON.stringify(obj, replacer);  
console.log(filteredJsonString); // 输出: {"age":30}  
  
// 使用 space 参数来格式化输出  
let formattedJsonString = JSON.stringify(obj, null, 2);  
console.log(formattedJsonString);  
/* 输出:  
{  
  "name": "John",  
  "age": 30,  
  "city": "New York"  
}  
*/

 

3-3、java:数组——>字符串 

1、使用Arrays.toString()方法

它特别适用于打印数组内容到控制台,因为它会为数组的每个元素添加方括号和逗号。

import java.util.Arrays;  
  
public class Main {  
    public static void main(String[] args) {  
        int[] array = {1, 2, 3, 4, 5};  
        String str = Arrays.toString(array);  
        System.out.println(str);  // 输出: [1, 2, 3, 4, 5]  
    }  
}

2、使用String.join()方法

想要一个没有方括号和逗号的字符串,并且元素之间由特定的分隔符分隔,那么可以使用String.join()方法。

import java.util.Arrays;

public class ArrayToString {

    public static void main(String[] args) {
        // 示例:整数数组
        int[] intArray = {1, 2, 3, 4, 5};
        // 使用 String.valueOf 将每个整数转换为字符串,然后使用逗号作为分隔符
        String intString = String.join(", ", Arrays.stream(intArray).mapToObj(String::valueOf).toArray(String[]::new));
        System.out.println(intString); // 输出: 1, 2, 3, 4, 5

        // 示例:字符串数组
        String[] stringArray = {"apple", "banana", "cherry"};
        // 直接使用逗号作为分隔符
        String stringString = String.join(", ", stringArray);
        System.out.println(stringString); // 输出: apple, banana, cherry
    }

}

String.join() 期望接收一个字符串数组作为参数,我们需要首先将整数数组转换为字符串数组。这可以通过使用Java 8的流(Streams)和 mapToObj 方法来实现,将每个整数映射到其字符串表示形式。然后,我们使用 toArray() 方法将流转换回数组,并将其传递给 String.join()。 

3、for循环传统方式

public class Main {  
    public static void main(String[] args) {  
        int[] array = {1, 2, 3, 4, 5};  
        // 拼接字符串
        StringBuilder sb = new StringBuilder();  
        for (int i = 0; i < array.length; i++) {  
            sb.append(array[i]);  
            if (i < array.length - 1) {  
                sb.append(", ");  
            }  
        }  
        String str = sb.toString();  
        System.out.println(str);  // 输出: 1, 2, 3, 4, 5  
    }  
}
举报

相关推荐

0 条评论