es6模板字符串中标签模板作为参数时产生空元素的问题

当模板字符串作为标签模板使用时,标签函数接受到的参数分别为(arr,…values)

  • arr:模板字符串中所有那些没有变量替换的部分
  • …values:各个变量替换后的值

let a = 'Oh!';
let b = 'the';
let c = 'very much!'
tag `${a} I love ${b} JavaScript ${c}`;

function tag(arr, ...values) {
	console.log(arr);      //["", " I love ", " javascript ", "", raw: Array[4]]
	for(let i in values){
			console.log(values[i]);     //oh!
									    //the
									    //very much!
	}
}

在这里,(arr,…values) 等价于 (arr,value1,value2,value3),这很好理解

但是!在arr中,为什么arr[0]和arr[arr.length-1]的位置为什么出现了两个空元素???

接着我又试了试下面这个样子

let a = 'Oh!';
let b = "the";
let c = "very much!"
tag `I love ${b} javascript`;

function tag(arr, ...values) {
	console.log(arr);    //["I love ", " javascript", raw: Array[2]]
	for(let i in values){
		console.log(values[i]);
								//the	
	}
}

excuse me???为什么又没有了?

仔细观察了一下,只有当变量出现在模板字符串的起始位置或者末尾位置时,在arr中会出现一个“”空元素

这个特性是不是有些眼熟?

对!就是split()!

let a = 'Oh my god!';
let b = a.split(' ');
console.log(b);		//["Oh", "my", "god!"]

let c = ' Oh my god! ';
let d = c.split(' ');
console.log(d);		//["", "Oh", "my", "god!", ""];

假想一下

标签模板在给标签函数传递arr参数时,会将原先模板字符串${} 进行分割。因为分割符的两边都会产生一个元素。所以当模板字符串的两端位置出现变量时,分割后会在分割符没有元素的一侧生成一个空元素“”。

注:arr中的最后一项raw:Array[n],是arr数组的一个属性,保存的是转义后的原字符串,这是为了方便取得转义之前的原始模板而设计的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值