ECMAScriptJavascript (ECMAScript5) 的底细及违反直觉的地方

记录在学习Javascript
(ECMAScript5) 中之有的跟另外语言的不同之处,本文会不断更新。

其中的知或并无太符合生自然更的Javascript程序员,仅仅只是切莫限于给新家阅读。

 

 1. null
凡一个象征“空”的靶子指针

var foo = null
console.log(typeof foo)  //输出 object 而不是你所认为的 null

 

 2. undefined 大凡
null 派生而来之

console.log(null == undefined)  //输出 true

 

 3.
浮点数值计算误差问题

var a = 0.1
var b = 0.3
if (a+b == 0.3){
     alert('OK')  //然而a+b将会等于 0.300000000000000004
}

 

当不仅仅只是ECMAscript有这种题材,很多用同一数值类的也来

4.NaN
请勿对等任何价值,包括自家

NaN == NaN //false
NaN == "NaN" //false
NaN == 0 //false
//当然了你可以使用 isNaN 函数

 

5.for in
语句子是从来不各个的替代送

6.switch
好是另外对象比较,不同与 C/C++ 或 Java 7 等里不能够字符串比较

7.享有函数的参数传参都是准值传的,哪怕传入的是目标,也会见复制引用指针

function setName(obj){  //这个obj 是复制的引用指针,指向A
     obj.name = 'OneName'
     obj = new Object(); //B  但是现在你改变了这个复制的引用指针 指向B
     obj.name = 'TwoName'    //设置的仅仅是B
}

var p = new Object() // A
setName(p)
alert(p.name) // 输出 OneName

 

8.Javascript
没有块级作用域(暂时无讨论闭包等)

您可能看 两独{}大括声泪俱下里属于作用域区,这是Java的经验,然而当Javascript这点并不曾得到贯彻

 

if (true){
     var name = 'YouName' ;
}
alert(name); // 依然可以得到输出 YouName
for(var i=0;i<5;i++){
     i++;
}
alert(i); //依然可以得到 变量 i

 

**9.运用对象字面量表示拟定义之对象,实际上以无见面调用Object构造函数,推荐只用于只读的作业应用。**

var p = {}; // 与 new Object() 得到的结果相同,但不会调用构造函数
p.name = 'YouName'; //依然可以想类一样操作

var obj = {
    name: 'Name'
    die: function(){//foo}
} //一样

 

10.
直指向对象,而无是因于下一个引用

var A = function(){
    alert('Run');
}
var C = A;
A = null;   //链表的经验可能会告诉我们C将会失效指向null
C() //依然正常运行,不影响

 

**11.谜般的
this 指针究竟对什么?**

function func (A,B){  
     alert(this)  
     return A+B;
}
var A = 1;
var B = 2;
func(A,B); //调用函数 alert输出 window
//事实上这就相当于默认调用了 this值将会绑定到 global
func.call(window,A,B) //alert输出 window
func.call(undefined,A,B) //alert输出 undefined
func.apply(new Object(),[A,B]) //输出 Object
//这个第一项参数就是this值

 在不同环境下实施函数将赢得不同的this值,这里是大局环境,所以this绑定到全局global目标,所以直接调用将凡window,如果您又其他条件下调用,那么尽管用是外价值了。

万一您这么,函数有所属对象时,this绑定到所属对象及失去

var obj = new Object();
obj.fun = function(){ console.log(this); }
obj.fun(); //调用,此时this值将绑定到 obj 上面去,即this就是obj

 所谓绑定,其实就是
function所有的bind() 函数。

var o = {color:'red'};
function sayColor()
{
    console.log(this.color);
}
window.color='undefined'
var A = sayColor.bind(o);  //一旦你这样显式的绑定了之后,不论环境怎么样,一定是你绑定的对象为this
A()  //这里会输出 red 而不是 全局对象color的 undefined

 让咱回来this主题:

情一致:普通的函数调用(
func(A,B,C,D,….); )
 this绑定到全局global 对象。

情景二:作为对象方法的调用
( obj.func(A,B,C,…) )
  this绑定到所直属的对象及。

事态三:作为构造函数调用(var
obj = new YourObject())
  this绑定到新布局出现的靶子(obj)上。

场面四:显示绑定(bind
apply call等)
this绑定到你指定的对方。

 

12.
属性会覆盖掉原型的性质,当属性让删后,原型的特性又会再回升

Array.prototype.name = "A";
var obj = new Array();
obj.name //输出A
obj.name = "B"
obj.name//输出B
delete obj.name 
obj.name //输出A 而不会是 undefined

 

13.
毕还写原型不会见于存活的实例上反映

var A = function(){};
A.prototype = {
  name:'YOU'  
}

var obj = new A();
obj.name // 输出 YOU

//然后我们重写原型
A.prototype = {//这一次修改的原型将不会应用到已经实例化的原型中
  name:'ME'  
}
obj.name //依然 输出 YOU