JS遗漏小知识

201 阅读2分钟

前言

今天阅读文章,发现一些平时没发现的小知识点,以此文记录!

一、标签模板字面量

对这个ES6的新语法 ```` ,我想大家都不陌生。 像最常用的字符串拼接,以前的写法是:var str = ’aa‘+demo+'ss' 有了标签模板字面量,写法变成了:var str = aa${demo}ss ,在字符串更复杂的拼接时,优势就更为明显了。 但最近看的一篇文章里发现了一个有意思的用法,先思考如下代码,分别会输出什么呢?

function demoFun(t1,t2,t3){
	console.log(t1)
  console.log(t2)
  console.log(t3)
}
var name = 'zj'
var age = '18'

demoFun(`aa ${name} bb ${age} cc`)
demoFun`aa ${name} bb ${age} cc`

第九行是我们的常规调用,依次输出理应是 aa zj bb 18 cc undefined undefined。那第十行呢?是不是一头雾水hh,它的输出依次是 ['aa ','bb ','cc'] zj 18 。也就是如果标签模板直接跟在函数名后面,这时候函数第一个参数会变成数组,包括所有没有被字面量代替的字段,隔开顺序即数组的索引顺序 ['aa ','bb ','cc'] 。剩下的参数分别为被字面量替代的值 zj 18 ,有几个参数就显示几个被替代的值。

二、对象冷知识

  1. 所有对象的键(不包括 Symbol)在底层都是字符串,即使你自己没有将其作为字符串输入。
var obj = {1:'demo'}
obj.hasOwnProperty(1)
obj.hasOwnProperty('1')

如题,显然二者皆为true,即使你没有输入‘1’属性

  1. 如果你有两个名称相同的键,则键会被替换掉。它仍然位于第一个键出现的位置,但是值是最后出现那个键的值。
var obj = {a:'1',b:'2',a:'3'}

如题,此时输出obj应该为 {a:'3',b:'2'}

三、非同名变量解构赋值

今天阅读一个源码的时候看到一个类似这样的代码:const { name: myName } = user; ,看结构,是解构赋值了阿,但是这个是用来干嘛的呀? 如果是这样const { name } = user; ,那我熟阿,就是简化代码,提取数据。 如果是这样 const { name="myName" } = user ,我也熟阿,就是怕被提取的数组(对象)不存在这个属性时,给的默认值(正常默认值为undefined)。 那开头那个是为了什么呢?了解了一波以后,原来是为了非同名变量间的赋值:首先 name 从右边对象提取出来,再赋值给myName这个变量(默认也是undefined)。 也就是如果user的结构是:{ name: "Lydia" } 。那myName就是lydia