两道JS练习题笔记,JS的赋值问题以及常用字符串函数问题

题目一: var a={n:1} var b=a; a.x=a={n:2}

			var a={n:1}
			var b=a;
			a.x=a={n:2}

问:
console.log(a)
console.log(a.x)
console.log(b.x)
console.log(b)
在看了解析文章并消化之后作为学习笔记记录。
首先:
b=a是浅拷贝,堆栈中引用的是同一个对象地址。
在这里插入图片描述
赋值运算符:从右至左执行
var a= 1 ,b=2, c=3;
a=b=c;
输出三个变量结果都是3。原因就是赋值运算符是从左到右执行。
本题中a.x=a={n:2}
但是本题中值得注意的是出现了点运算
在这里插入图片描述
他的优先级显然比=高,所以先执行他,所以可以理解为a.x指向后面的一大坨用图来表示会直观一些:
在这里插入图片描述

在这里插入图片描述
接着计算在这里插入图片描述
此时要让a={n:2}就要开辟新的变量,引用新的地址因为他不是a.x也不是a.y,而是整个变量要变,所以改变了引用地址,也用图来表示

在这里插入图片描述
到这里
a的输出值:{n:2}
b的输出值:{n:1,x={n:2}}
所以打印他们值:
在这里插入图片描述
值得注意的是{x={a={n:2}}}的运算结果是x={n:2}因为a={n:2}的运算结果是{n:2}
理解之后看一看附加的题:

			var c={q:1}
			var d=c //此时他们指向同一地址空间
			d.q=c.f={q:2}

分析:走到第二步的时候他们指向同一个地址空间 堆栈中:{q:1},接着c.f={q:2}此时堆栈中多一个f={n:2},在计算d.q=c.f,也就是在堆栈中更改q属性q={c.f={q:2}}运算结果q={q:2}此时没有新开辟的变量,远程地址,所以他们指向的都是同一个堆栈。
打印出c和d这两个变量,因为最开始的时候堆栈中有一个q属性了,后面d.q的时候就不是在堆栈中新增q属性,而是进行了更改
先看结果:在这里插入图片描述
指向同一个堆栈,里面的东西也一样。
**注意:**如果把最开始的var c={q:1},也就是初始化时不是使用q:1那么在第二步运算的时候,就是往堆栈中新增q属性。

			var c={hhhhh:1}
			var d=c //此时他们指向同一地址空间
			d.q=c.f={q:2}

此时打印c和d,堆栈中就有三个属性hhhhh,q,f。
在这里插入图片描述

题目二:请实现javascript中的indexOf功能,判断一个字符串a中是否包含另一个字符串b。

a)如果包含,需要返回匹配字符串b的位置。
b)如果不包含,需要返回-1。.
如: indexOf(“hello”,“el”) return 1。

这个题目我一开始想到了比较复杂的做法,遍历再match。然后仔细查看了match函数才发现,原来这么简单。
先放代码:

function indexOf(str,subStr){
			var ret=str.match(subStr)
			return ret?ret.index:-1
		}
		var a="hello world"
		var b="world"

让我们看看W3C对于match的介绍
在这里插入图片描述
检索指定的值,返回指定的值,而不是字符串位置。所以我们只要用一个变量存住返回给我们的字符串。如例 用ret进行保存,然后判断ret是否为空。用三元表达式,不为空说明检索到了,为空则返回-1;
console.log(a.match(b))打印出来看到,他给我们返回的是一个数组。里面有返回的检索到的值“world”,有index下标值,有被匹配的input属性里面的值:“hello world”。
所以ret.index为6,也就是题目要求的返回位置。
如果没有匹配的值,会返回null。

在这里插入图片描述
match还能和正则表达式联动==

		var str="1 plus 2 equal 3"
		console.log(str.match(/\d+/g))

flag为g。全局检索数字。
在这里插入图片描述
方法二:
在这里插入图片描述
用search方法
在这里插入图片描述
我去!这不是和indeof一样吗。所以要完成题目的要求更为简单返回a.search(b)就完成了!

猜你喜欢

转载自blog.csdn.net/qq_42285889/article/details/107567388