Javascript语言精粹读书笔记1

JavaScript是基于词法作用域(lexical 是从平)的顶级对象,而不是动态划分作用域的。

JavaScript的原型链特性:原型继承,对象直接从其他对象继承属性

JavaScript只有一种数字类型,相当于Java中的double,避免强类型语言中的短整型溢出和各种由数字类型引发的问题

NaN是一个数值,表示一个不能产生正常结果的运算结果。NaN不等于任何值,包括它自己。可以用isNaN(number)来检测NaN。

JavaScript在被创建的时候Unicode是一个16位的字符集,所以JavaScript中的所有字符都是16位的。

JavaScript没有字符类型。var str="";

字符有一个length属性,"seven".length=5;

*JavaScript中的代码块不会创建新的作用域,因此变量应该被定义在函数的头部,而不是在代码块中。

在判定时,一下值为假:

false

null

undefined

空字符串''

数字0

数字NaN

注:(if(-1)   判定为true; 双引号中有空格,判定为true)

for(variable in object){block};

for in 语句,会枚举一个对象的所有属性名(或键名)。在每次循环中,object的下一个属性名字符串被赋值给variable。

//通常

要检测obj.hasOwnProperty(myvar)来确定这个属性名是该对象的成员,还是来自于原型链:

for(myvar in obj){

  if(obj.hasOwnProperty(myvar){

     block;

     })

}

return语句会导致从函数中提前返回。如果没有指定的返回表达式,那么函数的返回值为undefined

JavaScript中的”%“是”求余运算“,而不是数学意义上的”求模运算“当两个运算数都是整数时,这两种运算的结果相同,但存在负数时则同。

JavaScript的简单数据类型:(不可改变)

数字,字符串,布尔值(true个false),null,undefined

其他所有的值都是对象!

JavaScript中的对象是可变的键控集合(keyed collection)。

在对象字面量中,如果属性名是一个合法的JavaScript标识符且不是保留字,则并不强制要求用引号括住属性名。

"first-name":必须   first_name 可选

JavaScript的标识符中包含连接符(-)是不合法的,(_)就合法

"||" 运算符可以用来为对象属性填充默认值:

var middle=stooge["middle-name"]||"(none)";

var status=flight.status||"unknow";

尝试从undefined的成员属性中取值将会倒是TypeError异常。这时可以通过&&运算符来避免错误。

对象通过“引用”来传递,永远不会被复制

当创建一个新对象时,可以选择某个对象作为它的原型。

每个对象都链接到一个原型对象,并且它可以从中继承属性。

所有通过对象字面量的对象都链接到Object.prototype,它是JavaScript中的标配对象。

//如果对象之前没有拥有那个属性么,那么该属就被扩充到对象中。

if(typeof Object.beget !==’function‘){

    Object.create=function(o){

        var F=function(){};

        F.roototype=o;

        return new F();

    };

}


原型链在更新时是不起作用的,当我们对某个对象做出改变时,不会触及该对象的原型;

原型链只有在检索值的时候才会被用到。

目标对象->原型对象->原型对象->.......->Object对象->undefined

该过程称之为:委托

hasOwnProperty()方法不会检查原型链

使用for in 时,属性出现的顺序是不确定的,要对任何可能出现的顺序有所准备。

最小化的使用全局变量的方法之一:为你的应用只创建一个唯一的全局变量:

var MYAPP={};

该变量此时变成了你的应用容器

函数也可以被定义在其他函数中,一个内部函数除了可以访问他自己的参数和变量,同时也能自由访问把他嵌套在其中的富含鼠的参数个变量。

除了声明时定义的形式参数,每个函数还接受两个附加的参数:this和arguments(实际传入的参数,个数可能不等于形参个数)。

当传入的实际参数个数大于形参个数时,函数执行时会忽略后面多余的参数,但若多余的参数是表达式,表达式依旧会执行。不过表达式产生的影响不会在本次函数调用中起作用,会对下次函数调用产生影响(如果该表达式改变原形参值的话);

如果实际参数的值过少,缺失的值会被替换成undefined。

arguments使得编写一个无需指定参数个数的函数成为可能。(但是arguments只是个array-like对象,没有数组方法!)

var sum=function(){

  var i,sum=0;

  for(i=0;iarguments.length;i+=1){

    sum+=arguments[i];

  }

  return sum;

};

JavaScript的4种调用模式:(在如何初始化关键参数this上有差异)

方法调用模式:函数定义在对象内部,this到对象的绑定发生在函数调用时,实现超级延时绑定。

函数调用模式:当一个函数并非对象属性时,为函数模式调用,this绑定在全局对象上(这是语言设计上的错误!!)this仍然应该绑定到外部函数的this变量!

    解决方案:

    myObject.double=function(){

          var that=this;//解决方法

          var helper=function(){

            that.value=add(that.value,that.value);

          };

          helper();

    };

构造器调用模式:如果一个函数的创建目的就是结合new来调用,则被称为构造器函数。(不推荐使用)

Apply调用模式:apply方法允许选择this的值,可将它绑定到目标对象上,使用时需要向apply(Object,array)传递两个参数:绑定this的对象,参数数组。

如果函数调用时在前面加了new前缀,且返回值不是一个对象,则返回新对象的this

throw的exception对象:

{

  name:'TypeError',

  message:'message'

}

扩展基本类型函数:

Function.prototype.method=function(name,fnc){

  this.prototype[name]=func;

  return this;

}

自己创建整型:

Number.method('integer',function(){

  return Math[this<0?'ceil':'floor'](this);

});

document.writeln((-10/3).integer());

移除字符串首尾空白:

String.method('trim',function(){

  return this.replace(/^\s+||s+$/g,'');

});


转载于:https://my.oschina.net/u/2618661/blog/626352

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值