javascript语言精粹

1.数字

isNaN(number)判断是否是数字
Math.floor(number) 方法把一个数字转换成整数

2.for in属性判断

判断属性是来自原型链还是该对象的成员

for (myvar in obj){
  if(obj.hasOwnProperty(myvar)){
  }
}

3.内置的值

true、false、null、undefined、NaN和Infinity

console.log(Infinity         ); /* Infinity */  
console.log(Infinity + 1     ); /* Infinity */  
console.log(Math.pow(10,1000)); /* Infinity */  
console.log(Math.log(0)      ); /* -Infinity */  
console.log(1 / Infinity     ); /* 0 */

4.typeof

typeof 产生的值有number、string、boolean、undefined、function和object.
如果运算数是一个数组或者null则结果是object

5.&&和||

如果第一个运算数的值为假,那么运算符&&产生它的第一个运算数的值,否则产生第2个运算数的值。
如果第一个运算数的值为真,那么运算符||产生第1个运算数的值,否则产生第2个运算数的值。

6.对象属性

不赋值默认为undefined

stooge["middle-name"] //undefined
我们可以用||运算符来填充默认值
var middle =stooge["middle-name"]  ||  "none"
var status = flight.status || "unknow"

7.delete another_stooge.nickname

不会删除原型中的属性

8.减少全局变量的污染

创建唯一的全局变量
var MYAPP = {};
MYAPP.stooge={ }

9.函数原型

函数对象连接到Function.prototype
该原型对象连接到Object.prototype
函数原型拥有一个constructor属性且值即为该函数的对象

10.函数调用

javascript共有四种调用模式
(1)方法调用模式

var myObject= {
    value: 0;
    increment: function (inc) {
        this.value += typeof inc === 'number' ? inc : 1;
    }
}
this访问自己所属的对象

(2)函数调用模式

  myObject.double=function () {
      var that=this;
      var helper=function () {
          that.value=add(that.value,that.value);  
      }
  }

如上函数调用模式this绑定到全局对象,如果要访问外部函数中的属性,那就用that方式

(3)构造器调用模式
如果在一个函数前面带上new 来调用,那么背地里将会创建一个连接到该函数的prototype成员的新对象,同时会this绑定到这个新对象上。

  var Qua = function (string) {
    this.status = string;
  };
Qua.prototype.get_staus = function () {
  return this.status; 
}
  var myQua = new Qua("confuse");
如果不用new 则访问不到对象属性

(4) Apply调用模式

var array = [3,4];
var sum = add.apply(null ,array);
动态绑定this对象

11.异常

var add = function (a, b) {
if (typeof a !== 'number' || typeof b !== 'number') {
throw {
name: 'typeError',
message: 'add needs numbers'
};
}
return a + b;
}

12.闭包的使用

//私有属性的使用
var myObject = (function () {
    var value = 0;

    return {
        increment: function (inc) {
            value += typeof inc === 'number' ? inc : 1;
        },
        getValue: function () {
            return value;
        }
    };
}());
//定义一个函数 ,设置一个DOM节点为黄色,然后把它变成白色
var fade = function (node) {
    var level = 1;
    var step = function () {
        var hex = level.toString(16);
        node.style.backgroundColor = '#FFFF' + hex + hex;
        if (level < 15) {
            level += 1;
            setTimeout(step, 100);
        }
    };
    setTimeout(step,100);
}

13.模块
模块模式利用函数作用域和闭包来创建被绑定对象与私有化成员的关联。
一般形式:一个定义了私有变量和函数的函数;利用闭包创建可以访问私有化变量和函数的特权函数;最后返回这个特权函数,或者把他们保存在一个可以访问的地方。

13.级联
如果我们让方法返回的是this对象而不是undefined,就可以启用级联

14.柯里化

Function.method('curry',function() {
    //注意:arguments 并非一个真正的数组,所以没有concat方法
    var slice = Array.prototype.slice,
        args = slice.apply(arguments),
        that = this;
    return function () {
        return that.apply(null, args.concat(slice.apply(arguments)));
    }
});
var add1 = add.crurry(1);
console.log(add1(2));

15.数组

数组继承自Array.prototype
(1)长度
myArray[1000] = true;
myArray.length //1001
如果手动设置长度,则数组会截取
numbers.length = 3;
(2)delete
不应该用delete方法,应该使用splice方法

delete numbers[2];
//返回 【'zero','one',undefined,'shi','go'】,会留下空洞

(3)数组不能用for in语句,一个是会遍历出原型链中的意外属性,再者没书序

(4)判断是否为数组类型

//缺点,在识别不同窗口window或镇frame里构造的数组时会失败
var is_array = function (value) {
    return value && 'object' && value.constructor === Array;
}
var is_array = function (value) {
    return Object.prototype.toString.apply(value) === '[object Array]';
}

(5)二维数组

//二维数组并指定初始值
Array.matrix = function (m, n, initial) {
    var a, i, j, mat=[];
    for (i = 0; i < m; i += 1) {
        a = [];
        for(j = 0; j < n; j+=1) {
            a[j] = initial;
        }
        mat[i] = a;
    }
    return mat;
} 

16.自动插入分号

别这么写,会自动插入分号

return 
{
  status:true;
}

应该这么写

return {
  status:true;
}

17.检测是对象或者数组

if(my_value && type of my_value === 'object' ) {
      my_value是一个对象或者数组
}

18.parseInt,建议总加上10

parseInt(08) 会产生0
parseInt(08,10) 会产生8

19.浮点数

由于浮点数运算不精确,如0.1+0.2 不等于0.3
所以解决方案是用转化为整数计算,然后求值,除以倍数

20.isNaN 判断是否为数字

判断是否为数字,isFinite会筛除掉NaN和Infinity。但是isFinite会试图把它的运算数转换为数字,如果不是一个数字,它就不是一个好的测试。

var isNumber = function isNumber(value) {
        return typeof value === 'number' && isFinite(value);
}

21.局部变量

(function () {
    var hidden_variable;
}())

21.永远不要使用==和!=

应该直接使用 (foo != 0) ,(foo)
(foo == 0) ,(!foo)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容