字符串和字符串对象

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}}))
        // 这样变了的话,真的被感知到了

props传一些不用的数据进来,这些数据变化,会不会导致子元素触发渲染

上一篇下一篇

猜你喜欢

热点阅读