首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么 JS 中的对象字面很酷

作者:Dmitri Pavlutin 译者:前端小智 来源:dmitripavlutin 在 ES6 之前,JS 中的对象字面(也称为对象初始化器)是非常基础的。...不幸的是,字面的局限性不允许用一个简单的解决方案来实现这一点。必须结合使用object.create() 和对象字面来设置原型。...image.png 在对象字面中只能使用__proto__一次,否则 JS 会报错: var object = { __proto__: { toString: function() {...3.1 super 使用限制 super 只能在对象字面的简写方法定义内使用。...此限制在很大程度上不影响对象字面的声明方式。 由于语法较短,因此通常最好使用简写方法定义。 4.计算属性名 在 ES6 之前,对象初始化使用的是字面的形式,通常是静态字符串。

1K10
您找到你想要的搜索结果了吗?
是的
没有找到

从字符串到常量池,一文看懂String类

我们回顾下 Java 创建对象的方式,一共就这么几种 你说它创建了两个对象,那你告诉我除了 new 出来那个对象外,另外一个对象怎么创建出来的?...第三步:执行String s2 = "1",此时因为常量池中已经存在了字面 1 的对应字符串实例的引用,所以,这里就直接返回了这个引用并且赋值给了局部变量 s2。对应的内存状态如下: ?...直接将具体的字符串实例放到了字符串常量池中,而在我上面的图中,字符串常量池的永远时引用,它的图是这样画的 ?...而当类加载到内存中后,jvm 就会将 class 常量池中的内容存放到运行时常量池中,由此可知,运行时常量池也是每个类都有一个。...在上面我也说了,class 常量池中的是字面和符号引用,也就是说他们的并不是对象的实例,而是对象的符号引用值。

86421

JS对象

概述 JavaScript中: js中的对象就是生活中对象的一个抽象, 没有特征和行为,取而代之的是有对应的属性和方法; var stu = { name : '张三',...逗号隔开,记住 : 以后再 {} 内一行一行的都是用, 隔开 创建对象 对象字面 字面创建对象是最简单的一种方式,语法格式如下 {属性名1:属性值1,属性名2:属性值2,....}...对象字面以大括号{}定界,其中存储了若干组数信息,每组数据信息已逗号隔开,每组数据内部已冒号:分割,冒号两边分别是属性名和属性值。...变量在存储简单类型的时候,的是值本身(值类型) 变量在存储复杂数据类型的时候,的是引用,也叫地址(类型) 值类型的存储 变量存储数据的时候,存储的直接就是这个值本身。基本数据类型存放在栈内存中。...,对象随机存在内存中,会有一个地址,变量存储的仅仅是这个对象的地址。

11.5K72

你说你是高工,String有多长也不知道?

,只有指向同一个字符串对象的才会是true,否则就算字符串值相同也可能出现不相等的情况。...2.1 字面的形式 对于第一种是字面,Java将其存在常量池中,在Java1.6的版本中是在栈的常量池中,在1.7、1.8版本中将其放到了堆的常量池中。...如果你会修改编译器源码,你将上面的判断条件改成<=65535,这样你一个65535个字符"a"的字符串就不会编译出错了。...3 总结 3.1 字面的形式 受字节码数据结构的限制,字符串使用MUTF-8编码后字节数不超过65535 拉丁字符,受Java编译器代码限制,最多只能存储65534个字节 非拉丁字符,最多存储65535...个字节 3.2 new的形式 受虚拟机指令限制,字符数理论上线是Integer.MAX_VALUE,但是实际上有保留头信息的部分,所以会略小 受堆内存的限制,如果堆内存很小,那就不能超过堆内存的限制 看起来本文有点过于追求细节了

31840

JavaScript第六节

学生对象: // 特征 : 名字,性别,身高,体重 // 行为 : 吃饭、睡觉、敲代码 2. js对象 属性+方法 3...."上网" } 对象的场景 : 京东 创建对象-1 (2种方式 单创) 单纯的创建一个对象 ###对象字面 字面 : 直接,,,通过看数值,,直接看出来类型的 ,或者不需要通过创建, 11, '234...//所有创建出来的对象都有: //name //age //hobboy function Teacher(name, age) { //构造函数内部的this指向的是新创建的那个对象...变量在存储简单类型的时候,的是值本身(值类型) 变量在存储复杂数据类型的时候,的是引用,也叫地址(类型) 值类型的存储 变量存储数据的时候,存储的直接就是这个值本身。...引用类型的存储 复杂类型: 变量不会存这个对象对象随机存在内存中,会有一个地址,变量存储的仅仅是这个对象的地址。

42540

一道 3 层的 TypeScript 面试题,你能答到第几层?

我们用了类型编程的那个函数通过这种方式写就不会报错了。 我们使用下看看: 咋返回值的类型不对呢? 其实这时候匹配的函数类型是对的,只不过推导出的不是字面类型。...但还有个问题,如果不是直接传入字面,是推导不出字面类型的,这时候貌似就不对了: 可我们不都声明重载类型了么?...非字面的情况,类型是 number[],能匹配 unknown[] 的那个类型,所以那个函数类型生效了。...而字面的情况,推导出的是 readonly [1,2,3],带有 readonly 所以不匹配 unknown[],继续往下匹配,就匹配到了带有类型参数的那个函数类型。...as const 能够让字面推导出字面类型,但会带有 readonly 修饰,可以自己写映射类型来去掉这个修饰。

72930

理解JS 原型链

#字面创建对象 我们通常创建一个对象无非就两种方式: 1. var obj= new Object();//new 一个Object的实例 2. var obj= {};//对象字面 使用对象字面...为了简便,一般推荐使用使用字面:var o= {}; #构造函数创建对象 当我们想要创建自定义的对象时,需要用到构造函数。 构造函数和普通函数有两个区别: 1....那我们能不能让所有的实例对象都共同使用一个sayName方法,来节省内存,提升效率呢?这需要我们先理解原型对象的概念。 #原型对象 我们先了解原型对象的概念。...Object.prototype 刚才我们说了创建对象的两种方式:字面创建对象和使用new操作符创建对象。 这两种方式创建出来的对象都会继承Object.prototyoe上的方法。...比如,我们使用字面新创建一个对象o: var o = {value: 1}; o.toString();//"[object Object]" //查找过程: o --> o.

1.7K10

JavaScript 入门基础 - 变量 数据类型(二)

基本数据类型) 2. 2.2 数字型 Number 2.2.3 字符串型 String 2.2.4 布尔型 Boolean 2.2.5 Undefined和NULL 2.3 获取变量数据类型 2.4 字面...var age;// 声明一个age变量 var是一个JS关键字,用来声明变量(variable)。使用该关键字声明变脸后,计算机会自动为变量分配内存空间,不需要干预。...字面是在源代码中一个固定的表示法,表示如何表达这个值 字符串字面:‘前端’,“程序员” 数字字面:4,9,7 布尔字面:true,false 2.5 数据类型转换 通俗来说就是把一种数据类型的变量转换成另外一种数据类型...创建数组 var arr = new Array(); // 创建一个空的数组 利用数组字面创建数组 // 使用数组字面创建空的数组 var arr = []; // 使用数组字面方式创建带初始值的数组...语法,是js对象的字符串表示法,但JSON格式仅仅是一个文本,可以被任何编程语言读取来作为数据格式传递。

3.8K40

JAVA基础知识点:内存、比较和Final

如果已经有了值为”abc”的地址,则查找对象o,并 回o的地址。 (3)将str指向对象o的地址。 值得注意的是,一般String类中字符串值都是直接值的。...创建了两个对象。两个引用分别指向不同的两个对象。 以上两段代码说明,只要是用new()来新建对象的,都会在堆中创建,而且其字符串是单独值的,即使与栈中的数据相同,也不会与栈中的数据共享。...x=new int[3];将在堆内存中分配3个保存 int型数据的空间,堆内存的首地址放到内存中,每个数组元素被初始化为0。...;//编译通过 可见,final只对引用的”值”(也即它所指向的那个对象内存地址)有效,它迫使引用只能指向初始指向的那个对象,改变它的指向会导致编译期错误。...这时,s不指向原来那个对象了,而指向了另一个String对象,内容为”Hello world!”,原来那个对象还存在于内存之中,只是s这个引用变量不再指向它了。

1.2K40

Class文件格式与Jvm常量池

4 float类型字面 CONSTANT_Long 5 long类型字面 CONSTANT_Double 6 double类型字面 CONSTANT_Class 7 对一个类或接口的符号引用 CONSTANT_String...而当类加载到内存中后,jvm就会将class常量池中的内容存放到运行时常量池中,运行时常量池也是每个类都有一个。...class常量池中的是字面和符号引用,也就是说他们的并不是对象的实例,而是对象的符号引用值。...注意它只存储对java.lang.String实例的引用,而不存储String对象的内容。 注意,它只了引用,根据这个引用可以得到具体的String对象。...参考资料 深入理解String#intern new String(“字面”)中的字面是何时进入常量池的 java几种常量池的区分 java 中 new String(“字面”)中”字面”是什么时候进入字符串常量池

20330

JAVA 内存管理总结:内存泄露、数据存储、垃圾回收机制一网打尽!

如果已经有了值为"abc"的地址,则查找对象o,并 回o的地址。 (3) 将str指向对象o的地址。 值得注意的是,一般String类中字符串值都是直接值的。...创建了两个对象。两个引用分别指向不同的两个对象。   以上两段代码说明,只要是用new()来新建对象的,都会在堆中创建,而且其字符串是单独值的,即使与栈中的数据相同,也不会与栈中的数据共享。...x=new int[3];将在堆内存中分配3个保存int型数据的空间,堆内存的首地址放到内存中,每个数组元素被初始化为0。...; //编译通过  可见,final只对引用的"值"(也即它所指向的那个对象内存地址)有效,它迫使引用只能指向初始指向的那个对象,改变它的指向会导致编译期错误。...这时,s不指向原来那个对象了,而指向了另一个 String对象,内容为"Hello world!",原来那个对象还存在于内存之中,只是s这个引用变量不再指向它了。

45030

JS的数据类型及其检测

2.同时保存在栈内存和堆内存 引用数据类型存储在堆(heap)中的对象,占据空间大、大小不固定,如果存储在栈中,将会影响程序运行的性能;引用数据类型在栈中存储了指针,该指针指向堆中该实体的起始地址。...3.比较是引用的比较 当从一个变量向另一个变量赋引用类型的值时,同样也会将存储在变量中的对象的值复制一份放到为新变量分配的空间中。...var a={age:20}; var b=a; a = 1; b // {age:20} 上面代码中,a 和 b 指向同一个对象,然后 a 的值变为 1,这时不会对 b 产生影响,b 还是指向原来的那个对象.../true 关于数组的类型判断,还可以用 ES6 新增Array.isArray() Array.isArray([]);   // true instanceof 三大弊端: 对于基本数据类型来说,字面方式创建出来的结果和实例方式创建的是有一定的区别的...,也是标准的 Number 这个类的一个实例;对于字面方式创建出来的结果是基本的数据类型值,不是严谨的实例,但是由于 JS 的松散特点,导致了可以使用 Number.prototype 上提供的方法。

1.7K20

JavaScript的数据类型及其检测

2.同时保存在栈内存和堆内存 引用数据类型存储在堆(heap)中的对象,占据空间大、大小不固定,如果存储在栈中,将会影响程序运行的性能;引用数据类型在栈中存储了指针,该指针指向堆中该实体的起始地址。...3.比较是引用的比较 当从一个变量向另一个变量赋引用类型的值时,同样也会将存储在变量中的对象的值复制一份放到为新变量分配的空间中。...var a={age:20};var b=a;a = 1;b // {age:20} 上面代码中,a和b指向同一个对象,然后a的值变为1,这时不会对b产生影响,b还是指向原来的那个对象。...RegExp//true 关于数组的类型判断,还可以用ES6新增Array.isArray() Array.isArray([]); // true instanceof 三大弊端: 对于基本数据类型来说,字面方式创建出来的结果和实例方式创建的是有一定的区别的...,也是标准的Number这个类的一个实例;对于字面方式创建出来的结果是基本的数据类型值,不是严谨的实例,但是由于JS的松散特点,导致了可以使用Number.prototype上提供的方法。

66730

Java常量池(静态常量池与运行时常量池)

1)所谓静态常量池,即*.class文件中的常量池,class文件中的常量池不仅仅包含字符串(数字)字面,还包含类、方法的信息,占用class文件绝大部分空间。...常量池主要用于存放两大类常量:字面(Literal)和符号引用量(SymbolicReferences),字面相当于Java语言层面常量的概念,如文本字符串,声明为final的常量值等,符号引用则属于编译原理方面的概念...4、常量池的好处 常量池是为了避免频繁的创建和销毁对象而影响系统性能,其实现了对象的共享。例如字符串常量池,在编译阶段就把所有的字符串文字放到一个常量池中。...(2)在这段代码后续被运行的时候,"abc"字面对应的String实例已经固定了,不会再被重复创建。...所以这段代码将常量池中的对象复制一份放到heap中,并且把heap中的这个对象的引用交给s1持有。 这条语句创建了2个对象

1.9K21

一文带你读懂String类源码

1、字面就是我们所说的常量概念,如文本字符串、被声明为final的常量值等。...2、符号引用是一组符号来描述所引用的目标,符号可以是任何形式的字面,只要使用时能无歧义地定位到目标即可(它与直接引用区分一下,直接引用一般是指向方法区的本地指针,相对偏移或是一个能间接定位到目标的句柄...JDK6,常量池和堆是物理隔离的,常量池在永久代分配内存,永久代和Java堆的内存是物理隔离的。 此处的 intern() ,是将在堆上对象的内容"abc"拷贝到常量池中。...我们通过例子2,可以更好理解 intern() 方法的底层原理: 我们创建了一个 String 对象,并调用构造器,用字符串字面初始化它 我们创建了一个 String 对象,并调用构造器,用字符数组初始化它...1)且先看 java文件 的编译结果: 结论:在类文件常量池中,存在字面“def”,未存在数组 {'a','b','c'} 。

27340

通过 Chrome Devtools 的 Memory 工具证明 string 的内存分配方式

JS 的字符串是怎么分配内存的? 可能大家都知道,字符串存在字符串常量池中,被栈或堆上的变量引用。...如果变量的值是字符串字面,则在栈上的变量直接引用字符串常量池中的字符串;如果是字符串是 new String 创建的,则会在堆上创建 String 对象,指向字符串常量池中的字符串,栈上变量指向堆中的...再来看下第二种内存分配方式: 可以看到,创建了 String 的对象、array 变量(system 是 JS 引擎内部分配的一些对象,不用关心): String 对象引用了字符串常量池中的 @169541...证明完毕,确实如前面的结论所说:字符串存储在字符串常量池中,字符串字面直接指向常量池的字符串地址,String 对象会先在堆上分配空间,然后指向字符串常量池的字符串地址。...而且,还可以得出一个结论,创建 String 对象的方式内存开销大很多,建议用字符串字面的方式: 从图中可以直观的对比出两种方式的占用内存的差别。

39100
领券