首先让我们来看
let book1={"author":"author111","subname":"subname222","main":"main333","title":"title444"}
book.author333="3333";
console.log( Object.keys(book1).length)
book.subname444="444";
console.log( Object.keys(book1).length)
book["title555"]="555";
console.log( Object.keys(book1).length)

运行结果
但是,当我们依次点开console.log时,会发现

点开console.log
两个对象,显示出来的属性不一样多,但是点进去之后属性是一样的。这个怎么解释?
因为
console.log只是输出一个对象的引用,鼠标点开的时候,会去内存里取这个引用,取到的是最后的值。
在控制台中我们点击的consoel.log的是同一个变量,所以log出来的是同一个对象的引用。
与这个问题类似的是 js深复制和浅复制,一个是内存引用, 一个是地址引用。
在实际开发过程中,我们可以根据不同逻辑下对于数据长度的检测来判断内容是否被修改。
对于数组、字符串来说,可使用
var s = "String 类型长度"; //定义字符串
console.log(s.length); //返回11个字符
let age1=["222","333","333","12323"];
console.log(age1.length) // 4
但是对于对象来说,就不能直接使用Length来获取长度。
var book1={"author":"author111","subname":"subname222","main":"main333","title":"title444"}
console.log( Object.keys(book1).length); //4
因此,对于文章最开始的例子来说,将其console.log()代码修改为如下即可:
let book={"author":"author111","subname":"subname222","main":"main333","title":"title444"}
book.author333="3333";
console.log( Object.keys(book).length)
book.subname444="444";
console.log( Object.keys(book).length)
book["title555"]="555";
console.log( Object.keys(book).length)

修改后
再拓展一下,有兴趣的可以去看看。