cycold / cycold.github.io

Please dot not star...
4 stars 1 forks source link

javascript primitive data type #130

Closed cycold closed 6 years ago

cycold commented 8 years ago

primitive data type : A primitive is a data that is not a object and has no methods. All primitives are immutable(cannot be change).

Except for null and undefined, all primitive values have object equivalents that wrap around the primitive values.

The wrapper's valueOf() method returns the primitive value.

在javascript中(目前)有6中primitive data type, 分别是:

null, undefined, String, Number,Boolean, Symbol;

除了null, undefined 没有经过自动包装(auto-boxing)外,其余的类型在javascript中都是经过包装后使用的. 都有自己的包装对象(primitive wrapper objects)

  1. 既然primitive是不可以修改的,没有方法的; 那么为什么javascript中的String就有方法呢,比如substr()?

    这是因为javascript中的String在使用时都经过包装了. 所以就带有了方法. 反之像null, undefined就是没有经过auto-boxing的,所以就没有方法,也不能被修改.

  2. 既然在javascript中String, Number都是经过包装了的, 那到底是怎么实现的呢?
// 请比较下面的
var hi = "hello"
hi == String("hello")                // true
hi === String("hello")             // true

hi == new String("hello")       // true
hi === new String("hello")    // false   construct a String object explicitly to avoid auto-boxing

发现在js中字面量写的"hello"都是直接使用String构造方法自动包装. 注意使用new时和没有使用new时的区别. (区别就是内存地址不同,凡是使用new开辟的都是新的内存地址) 没有使用new, 即相同的字符串共用一块内存地址 使用new, 即使是相同的字符串,也会开辟出一块新的内存地址.

注意 在ES6 以及以后, 将不再推荐使用new 来创建包装对象了: 就是Symbol类型不能使用 new来显示的

The following syntax with the new operator will throw a TypeError:
var sym = new Symbol(); // TypeError

This prevents authors from creating an explicit Symbol wrapper object instead of a new symbol value. Creating an explicit wrapper object around primitive data types is no longer supported starting with ECMAScript 6. However, existing primitive wrapper objects like new Boolean, new String and new Number can still be created for legacy reasons.

And if you really want to create a Symbol wrapper object, you can use the Object() function:

var sym = Symbol("foo");
typeof sym;     // "symbol" 
var symObj = Object(sym);
typeof symObj;  // "object"