JavaScript 类型浅解(读后感)

http://sofi.sh/2330(读后感)

1.instanceof和typeof区别

两者都是用来判断类型用的,instanceof顾名思义,是否是某一类型的实例,这个返回值是bool值,例如(new String("so") instanceof String)

                                     typeof返回值则是类型名,如(typeof 'so')

但是,他们还是有区别的

instanceof是为了检查他的原型..如:function Cat(name,color){     this.name=name;     this.color=color;   }

cat1 instanceof Cat //true  这种状态下也可以用Cat.prototype.isPrototypeOf(cat1) //true

但是  typeof cat1  //"object"

 

2.Object.prototype.toString.call(obj)返回类型

  Object.prototype.toString()返回的是[object Object]

  原理应该是通过Object的原型检测,调用需要检测的类型。

3.1+'2'='12'

+ 号是一个数学运算符,同时也是 JavaScript 中的字符串连字符。

1 + (+'2') // 3     //+'2'返回2那么,+'2'+1返回3
4.值类型有固定空间存在于栈内存中,引用类型没有固定空间保存在堆内存中并且在栈内存中保存了一个指向实现位置的指针。内存溢出呢。

1.栈 stack”和“堆 heap”:
        简单的来讲,stack上分配的内存系统自动释放,heap上分配的内存,系统不释放,哪怕程序退出,那一块内存还是在那里。stack一般是静态分配内存,heap上一般是动态分配内存。
 2.基本类型和引用类型:   
     基本类型:存放在栈内存中的简单数据段。数据大小确定,内存空间大小可以分配。
     引用类型:存放在堆内存中的对象,变量中实际保存的是一个指针,这个指针指向另一个位置。每个空间大小不一样,要根据情况开进行特定的分配。
     详见《Javascript高级编程》Page60页的图可以很清晰的理解上面两个概念。
3.内存变量的存储空间很重要。这是js机制生存的原因。只有理解这种存储空间的分配才可以更好的理解js和写出更加高效的代码。
4.值传递和引用传递问题:(也是老问题了 )
   前者内存中的值不发生变化,后者内容中的值发生变化。
   将js中的function(){} 函数的参数理解成局部变量,只有在function里面是又作用的。
5.执行环境(作用域)
     1. 执行环境决定了变量的生命周期,一些代码可以访问变量的权限。这种机制有助于何时释放内存。
     2.分全局执行环境(window)和函数执行环境。
     3.函数的局部环境可以访问函作用域的变量,而且有权访问包含(父)环境中的变量
     4.全局环境不能访问函数环境中的变量。
6.JS是一门具有自动垃圾回收机制的语言,我们不好考虑内存分配和回收的问题,和C++不一样。
5.Shadow / Deep Copy
浅复制失败的原因是,如果数组里存的是引用类型,那么复制过来的也是一个地址而已。
/* 复制对象 * @param: obj {JavaScript Object} 原始对象 * @param: isDeep {Boolean} 是否为深拷贝 * @return: {JavaScript Object} 返回一个新的对象 */ function copy(obj, isDeep) { var ret = obj.slice ? [] : {}, p, prop; // 配合 is 函数使用 if(!isDeep && is(obj, 'Array')) return obj.slice(); for(p in obj) { if(!obj.hasOwnProperty(p)) continue; prop = obj[p]; ret[p] = (is(prop, 'Object') || is(prop, 'Array')) ? copy(prop, isDeep) : prop; } return ret; }
posted @ 2014-07-16 10:56  登记造册  阅读(124)  评论(0编辑  收藏  举报