@JunQiu
2018-09-18T13:02:34.000000Z
字数 4250
阅读 1684
summary_2018/07 language_js
The usual definition for primitives and objects in JavaScript is: The following values are primitive.- Strings: "abc"- Numbers: 4, 3.57 (all numbers in JavaScript are floating point)- Booleans: true, false- null: usually explicitly assigned- undefined: usually a default value, automatically assigned- All other values are objects.Objects can be partitioned further:1、Wrappers for primitives: Boolean, Number, String. Rarely used directly.2、Creatable by literals. The following literals produce objects that can also be created via a constructor. Use literals whenever you can.[] is the same as new Array(){} is the same as new Object()function() {} is the same as new Function()/\s*/ is the same as new RegExp("\\s*")Dates: new Date("2011-12-24")
1.1、Objects are mutable by default:(默认对象是可变)> var obj = {};> obj.foo = 123; // write123> obj.foo // read1231.2、Objects have unique identities and are compared by reference: Every object you create via an expression such as a constructor or a literal is considered different from every other object; a fact that can be observed via the equality operator (===). That operator compares objects by reference: two objects are only equal if they have the same identity. It does not matter whether they have the same content or not.(object或引用类型,比较的是地址是否相同(==/===))> {} === {}false> var obj = {};> obj === objtrue1.3、Variables hold references to objects: Thus, two variables can refer to the same object – changes you make via one variable can be observed via the other variable.> var var1 = {};> var var2 = var1;> var1.foo = 123;123> var2.foo123As expected, primitives are different:2.1、Primitives are immutable: any property you add will be immediately forgotten.> var str = "abc";> str.foo = 123; // write - ignored123> str.foo // readundefined2.2、Primitives are compared by value, they don’t have individual identities: To compare two primitives, one looks at their values, their content. If their values are the same then they are considered equal.(原始数据类型比较值的大小)> "abc" === "abc"trueThat means that the identity of a primitive is its value, it does not have an individual identity.
1.1、The three primitive types string, number and boolean have corresponding types whose instances are objects: String, Number, Boolean. They are sometimes called wrapper types and converting between primitive and wrapper is simple:(原始数据类型及包装类的转换)Primitive to wrapper: new String("abc")Wrapper to primitive: new String("abc").valueOf()1.2、Primitive values such as "abc" are fundamentally different from wrapper instances such as new String("abc"). For example (typeof and instanceof are explained below):> typeof "abc"'string'> typeof new String("abc")'object'> "abc" instanceof Stringfalse> new String("abc") instanceof Stringtrue> "abc" === new String("abc")false
There are two ways that this borrowing is done.1、The old way is to convert a primitive to a wrapper, on the fly.2、The new way (via ECMAScript 5 strict mode) is to transparently use the methods from the wrapper’s prototype. The following code illustrates the difference [inspired by “The Secret Life of JavaScript Primitives”].// Methods in Object.prototype are available to all primitivesObject.prototype.getType = function() {return typeof this;};Object.prototype.getTypeStrict = function() {"use strict";//严格透明return typeof this;};console.log("".getType()); // objectconsole.log("".getTypeStrict()); // string### js的装箱与拆箱把基本数据类型转换对应的包装类型的操作称为装箱,把包装类型为对应的基本数据类型称为拆箱。Tips:引用类型与基本包装类型(也是引用类型)的主要区别就是对象的生命周期。使用new操作符创建的引用类型的实例,在执行流离开当前作用域之前都一直保存在内存中。而自动创建的基本包装类型的对象,只存在于这一行代码的执行期(瞬间),然后立即销毁。这就意味着我们不能在运行时为属性添加属性和方法。
typeof /s/ === 'function'; // Chrome 1-12 Non-conform to ECMAScript 5.1typeof /s/ === 'object'; // Firefox 5+ Conform to ECMAScript 5.1

