字符串和字符串对象
2022-06-19 本文已影响0人
skoll
字符串
1 .字符串属于不可变对象,每一次修改都会返回一个新的字符串
2 .不能改变他的状态,他的属性值,也不能向他添加新的属性
const str = "abc";
str.myNewProperty = "some value";
alert(str.myNewProperty);
//这样是加不上去的,会弹undefined
字符串对象
1 .但是字符串对象不r是r
const str = new String("abc");
str.myNewProperty = "some value";
alert(str.myNewProperty);
str.myNewProperty = "a new value";
alert(str.myNewProperty);
2 .他是一个对象,而且没有被冻结.
引用相等VS值相等
1 .示例1
let str1='abc'
let str2=str1
let str3='abc'
str1===str2,str1===str3,str2===str3
//无论从引用还是值的方式,他们都是相等的
2 .示例2
var str1=new String('abc')
let str2=str1
let str3=new String('abc)
str1===str2:true
str1===str3,false
str2===str3,false
//在每种情况下,都会创建两个不同的对象,因此他们的引用不相等
image.png
3 .也就是说想要比较两个对象是否相等,我们需要比较值相等,而不是引用相等 str1.valueOf()===str2.valueOf()
React和这个的关系
1 .react利用对象的不可变性来做性能优化
2 .如果组件的属性和状态是不可变的对象或值,您可以使用简单的相等运算符检查它们是否发生了变化.如果我们把对象深度嵌套这种都变为简单类型,那不就可以只需要简单的等号就可以判断是否发生了变化
1 .最简单的就是使用不可变都对象
2 .如果对象需要更新,则必须创建一个具有新值的新对象,因为原始对象不可更改,无法修改
3 .这样我们只需要判断引用就能知道数据是否发生了修改
3 .但是一些深度嵌套的单项做了修改,如何优雅的感知到
myPackage.sender.address.country.id = 1;
4 .实际上来说,对于一些数组元素,只能遍历所有的数组然后进行比较,但是数组元素应该不会被传下去吧.我们要把这些数据放到redux,不然他在props这里传,其实还有一个问题
console.log('click')
// setArr(update(arr,{1:{$set:2}}))
// 本质上没变,我看他有没有做优化,chrome工具没有看到变化,也就是这里的引用其实应该没有变化
setArr(update(arr,{1:{$set:20}}))
// 这样变了的话,真的被感知到了