js糟粕

正在看《javascript语言精粹》,遇到明显的特色就记录下来,以防看了白看(噗噗~)

为了避免误导,造成错误印象,文中 ‘错误设计‘ 写成 ‘现有设计’,’正确设计‘ 写成 ’期待设计‘。然而期待只能是期待,由于他已经被使用的太普遍了。。。不能说改就改了javascript

1.js中this指向:java

  函数调用有四种模式,方法调用、函数调用、构造器调用和apply调用模式。数组

  现有设计:其中函数调用模式与其余不一样,this被绑定到全局对象。浏览器

  期待设计:绑到外部函数的this。app

2.参数arguments并非一个真正的数组函数

  (ps:就像一个男人被阉割了同样---有心无力---有心无力,它只是一个拥有length属性的array-like对象,并无数组方法)oop

3.做用域this

  js木有块级做用域,,,因此最好在函数开头部分声明全部用到的变量。spa

4.全局变量设计

  糟糕之中的战斗鸡!若是全局变量名称碰巧和子程序中的变量名相同,那他们将会相互冲突致使程序没法运行,一般还难以调试。

  全局变量声明有三种方式:①不在任何函数内 var foo = value;②全局对象window下 window.foo = value;③直接使用未声明变量 foo = value;

5.自动插入分号

  哎,,,原本一片好心却变成多此一举了。。。你若是这样写代码: 

return
    {
        status: true  //会在行末加一个分号;
    }

 

  注意啊,为了不,只能这样写了:囧~

return {
        status: true
    }

6.保留字

  占着茅坑不拉屎,搞了那么多保留字但大多数并无在语言中使用,保留字不能命名变量、参数。当其被用做对象的键值时,他们必须被括号引发来,因此只能用[]表示法。

var class;    //非法

object = {case: value};    //非法

object['case'] = value;      //ok

object.case = value;        //非法

7.Unicode

  设计javascript的时候,做者预计 Unicode 最多只会有 65536 个字符,他没想到人们这么有情趣,从那之后它的容量慢慢增加到了1百万个字符~

8.typeof(识别运算数类型,返回类型字符串)

  typeof   null  //返回 'object' 而不是 'null'

  value  ===  null  //检测null的好方法

  另外检测对象的值时,null可能混淆,typeof不能分辨,因此利用null为假,对象为真来实现:

if (value  &&  typeof  value  ===  'object') {
  //value 值为对象或者数组。
}

typeof    /a/    //正则在最新浏览器下返回 'object' ,旧版可能返回'function'

9.parseInt 将字符转为整数。

parseInt('16');
> 16

parseInt('16df');
> 16

parseInt('011');    //0开头的字符串按,十进制
> 11

parseInt(011);    //0开头的数字按,八进制了
> 9

parseInt('0x11');    //0x开头的字符串和数字都按16进制
> 17

parseInt(0x11);
> 17

//有木有乱了啊,,,因此第一个带上引号,再带上基数参数就不用怕了,默认为10进制
parseInt('011', 8);
> 9

parseInt('0x11', 16);
> 17

 

10. +

  书中说‘+’ 号也是糟粕,缘由以下

1 + 2 + ''
"3"
1 + '' + 2 + 4 + ''
"124"

 

11. 浮点数

  这是遵循浮点数算数标准(IEEE 754)而有意致使的结果,浮点数中整数运算是正确的,因此小数表现出来的错误能够经过指定精度来避免。我只知道有个toFixed()函数。你还能够乘以100,运算完毕再降结果除以100,就至关于精确到了两位。。。同理

  0.1 + 0.2  !==  0.3

0.1 + 0.2
0.30000000000000004

.1 + .2
0.30000000000000004

12.  NaN 一个特殊的数量值,并非一个数字。

typeof NaN
> "number"    //即便返回 'number' ,它也不是个数字

+ '1'
> 1                //即便试图把非数字转为数字,它还不是个数字

+ 'oops'
> NaN            //即便。。。它不是数字

  这样一来也就有个定理:若是产生了NaN的结果,你至少有一个输入项为NaN或者某个地方产生了NaN 

NaN === NaN
false

NaN !== NaN
true

//只分辨数字和NaN
isNaN(NaN)
> true
isNaN('a')
> true
isNaN(1)
> false

 

  可是当你但愿判断一个值是否为数字时,怎么能让NaN不混淆你呢?

//完美了。
function isNumber(val) {
    return typeof val === 'number' && isFinite(val);
}

//世界上最短的。。刚看到一篇博客来补充下
function isNumber(val) {    
    return val === +val;    //不能被转为数字的val为false,其他为数字。。。
}

isNumber(1)
> true

isNumber(NaN)
> false

isNumber('1')
> false

  

13.伪数组

相关文章
相关标签/搜索