对js中'{}'的思考

这次在现场对于新给的工程量的解析与存储时,又发现对于js中"{}"的使用又存在着疑惑,这个疑惑在以前分析过,但记录确实找不到了,现对它再次进行分析。

js中的"{}"与C++中的map

c++中的map与js中的"{}"都是一种键值对的结构,键是唯一的,可以通过键快速的访问value。

在c++的STL的map中,我们可以将一个类的对象作为键值放在key的位置,value的位置可以放任意数据,key位置的数据需要实现<的比较运算即可,但"{}"的键值对是片面的键值对,因为其只能是字符串-值的。

这里可以再引申一下js中的Map,这个Map号称是键值对,它也确实可以将对象存在key的位置上,但它是巨坑的实现,因为它的key位置的唯一不是按key对象的值来判断的,而是按地址来判断的。

js中的"{}"与C++中的struct

前文说到"{}"其实是字符串-值的一种结构,它的名字叫对象,那它与静态语言中的对象有什么异同呢? 拿c++的struct来与"{}"来做个对比

struct与"{}"都可以仅放数据,也可以放数据与函数,在C++使用时一般沿用C的方式,将struct只放数据,而用class来当类来使用。

比如在做一个Student对象时:
C++中需要先声明一个Strudent的结构体:

 struct Student {
   string name;
   int age;
   string sex;
 }

然后用这个结构体来实例化对象:

Student s1 = {"张三",13,"男"}
Student s2 = {"李四",14,"男"}

而在js中的"{}"需要:

let s1 = {"name":"张三", "age":13, "sex":"男"}
let s2 = {"name":"李四", "age":14, "sex":"男"}

这样我们看到,js中的对象由于没有类型,所以需要把变量信息也包含在对象内部。数据效率相对低一些。
访问时都是: s1.name

对"{}"的理解

前便说到"{}"中是变量信息放在了key的位置上,这句话需要再解释一下。
我们完全可以创建一个这样的对象:

 let zs = {"张三":13}

这样的结果是key的位置上,其实是一个之前的name,是一个信息,而不是简单的变量名的概念。访问时可以是zs.张三。(当然,也可以认为变量名是汉字,虽然一般人都不会这样玩,但C++的变量名确实也可以是汉字。)

综上: 对"{}"的理解最到位的就是 字符串-值结构的对象。

既然只能是字符串,那对象如何来做key值,方法呼之欲出,将对象转换成string来使用

  let s3 = {}
  let keyObj = {"张三":"3班"}
  let k = JSON.stringify(keyObj)
  s3[k] = 14

js中的"{}"与python中的"{}"

"{}"在js与python中的差异性更不明显一些。"{}"在python中叫字典,在js中叫对象。

在使用上它们都可以如此使用:

  a = {"a":1}
  a["a"]      // 1
  a.get("a")  // 1
  let a = {"a":1}
  a["a"]   // 1
  a.a      // 1

但他们在深层次上是不同的,python中的""更像是动态语言中的map,因为它不能包括函数,而是当作一种数据结构来使用。而js中的"{}"更接近与动态语言中的struct,因为它不仅可以包含函数,更可以通过"."来访问数据。
如在js中

  a.fun = function(){console.log(111)}
  a.fun()

但在python中则不能。

# 语言 

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×