持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第4天,点击查看活动详情
目录
今日题
题目
var p1 = '蟑螂恶霸'
var p2 = String('蟑螂恶霸')
var p3 = new String('蟑螂恶霸')
console.log(p1 == p2)
console.log(p1 === p3)
console.log(p2 === p3)
分析
p1以字面量的形式创建,p2以String函数的形式创建,p3则以String构造函数的形式创建。那么三者之间到底存在什么区别或者关联呢,相信p1、p2不用过多介绍了吧,两者的形式基本没有大的差别。而p3为String构造函数,我们知道当使用new调用函数时的操作,大概可分为四步:1. 立即创建一个新的对象;2. 将这个新建的对象设为函数中的this;3. 执行构造函数中的代码;4. 将这个新建的对象返回(此处暂不讨论关于构造函数返回值的问题);而new的操作做完之后,我们的这个变量p3也就成为了String构造函数的实例对象,虽然我们在new String('蟑螂恶霸')时将蟑螂恶霸传递了进去,但至于p3是不是我们传进去的这个值,还有待探究。关于相等运算符==与全等运算符===之间的区别必须要搞懂,前者为值相同即可(注意,相等运算符如果发现两边值的数据类型不相等,会尝试对数据类型转换),后者则为数据类型与值全部相同时才会返回true
昨日题
题目
var p1 = {name: '鲨鱼辣椒'}
var p2 = p1
var process = function (o) {
o = {name: '蜻蜓队长'}
}
process(p2)
console.log(p2.name)
答案
'鲨鱼辣椒'
解析
这道题中需要注意的就是引用数据类型、以及函数传参时是怎样进行传递参数的。首先p1中的内容为{name :'鲨鱼辣椒'},然后将p1赋值给p2,此时p1与p2中的内容完全相同,因为p1、p2都指向同一个对象。随后定义了一个process函数,这个函数会接收一个形参o,然后将o的内容重新更改为{name: '蜻蜓队长'}。然后调用process函数,并把p2作为实参传递给形参o,因为函数的传参是值传递(这个值有可能是基本数据类型的值,也有可能是引用数据类型的值),o接收到p2之后,此时的o与p2完全相等,但o = {name: '蜻蜓队长'}则是将o重新指向了蜻蜓队长这个对象,所以此时的o已经与p2完全脱离了关系,不管修改谁的内容,两者之间均互不干扰。随后打印p2.name,那么结果也是毫无疑问,最终输出的结果为'鲨鱼辣椒'
结语
此文章已收录至《JavaScript每日一题》专栏,如果你对本专栏有任何建议,欢迎反馈。如果你对此文章中的题目还有不懂的地方,那么请在评论区留言与大家一起讨论吧。创作不易,少年,就请留个赞再走吧!