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)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342

推荐阅读更多精彩内容